Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Добавляю экспортируемую функцию в exe-файл. Ошибка


Автор: neosapient 1.8.2019, 18:24
Здравствуйте.

exe-файл и dll-файл похожи наличием PE заголовка. 
Хочу в exe-файл добавить экспортируемую функцию. 
А затем через LoadLibrary и GetProcAddress запустить её в другой программе. 
Но Runtime ругается при выделении памяти:
>> Unhandled exception at 0x0001831a in mytest.exe: 0xC0000005: Access violation.

Программа пустышка, в которую я добавляю PE заголовок.
Код

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

А вот и экспортируемая функция. В настроках проекта добавил макроопределение MYLIB_EXPORTS
Код

#pragma once

#ifdef MYLIB_EXPORTS
#define MYLIB_API __declspec(dllexport)
#else
#define MYLIB_API __declspec(dllimport)
#endif

extern "C" MYLIB_API void fnmylib(void);

Код

#include "myext.h"
#include <windows.h>

MYLIB_API void fnmylib(void)
{
    char* text = new char [1]; // <-- тут падение
    Sleep(1);
}

Вторая программа, которая загружает fnmylib из первой программы, выглядит так.
Код

#include <windows.h>

typedef void (*myproc_t)(); 

int _tmain(int argc, _TCHAR* argv[])
{
    HINSTANCE hlib = LoadLibrary(_T("myapp.exe"));
    myproc_t proc_addr = NULL;
    int result = -1;

    if (hlib) {
        proc_addr = (myproc_t) GetProcAddress(hlib, "fnmylib");
        if (proc_addr) {
            proc_addr();
        }
        FreeLibrary(hlib);
    }
    return 0;
}


Успешно загружается LoadLibrary("myapp.exe")
Успешно получаю адрес fnmylib и перехожу в неё.
При вызове new char [1]; происходит падение программы 
>> Unhandled exception at 0x0001831a in mytest.exe: 0xC0000005: Access violation.

Что делаю не так?

Автор: xvr 2.8.2019, 13:30
Цитата(neosapient @  1.8.2019,  18:24 Найти цитируемый пост)
Что делаю не так? 

exe это не dll, хотя и похожи. Вы можете загрузить exe из другого exe, но исполняться он (загруженный) не будет. И попытки позвать оттуда что либо обречены на неудачу.
Что бы exe заработал ему нужен своё собственное адресное пространство, и собственно процесс запуска (у dll он другой, так что точка запуска exe вызвана не будет)

Автор: LeonidPr 2.8.2019, 15:44
Если GetProcAddress нашла функцию, значит экспорт идет без проблем. Проблема в инициализации где-то, т.к. валится на new, ему куча нужна настроенная.
https://stackoverflow.com/questions/19110747/loadlibrary-an-exe как раз об этом же пишут и рассказывают что там не так инициализируется.
Т.е. какие-то очень ограниченные функции можно экспортировать но постоянно будете в проблемы упираться.
P.S. Там есть https://www.codeproject.com/Articles/1045674/Load-EXE-as-DLL-Mission-Possible интересная на CodeProject.Но имхо это изврат

Автор: neosapient 3.8.2019, 00:36
Спасибо.
Жаль, что нет простого решения.

Автор: LShadow77 12.8.2019, 12:54
А вот я всегда задавался вопросом, какой смысл экспортировать что-то из exe-файла? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)