Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавляю экспортируемую функцию в exe-файл. Ошибка 
:(
    Опции темы
neosapient
Дата 1.8.2019, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 670
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



Здравствуйте.

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.

Что делаю не так?
PM MAIL   Вверх
xvr
Дата 2.8.2019, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7005
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 60
Всего: 222



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

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

PM MAIL   Вверх
LeonidPr
Дата 2.8.2019, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 17.2.2012
Где: г. Чебоксары

Репутация: нет
Всего: 1



Если GetProcAddress нашла функцию, значит экспорт идет без проблем. Проблема в инициализации где-то, т.к. валится на new, ему куча нужна настроенная.
Вот тут как раз об этом же пишут и рассказывают что там не так инициализируется.
Т.е. какие-то очень ограниченные функции можно экспортировать но постоянно будете в проблемы упираться.
P.S. Там есть ссыль интересная на CodeProject.Но имхо это изврат

Это сообщение отредактировал(а) LeonidPr - 2.8.2019, 15:45
--------------------
pkunzip.zip
PM MAIL   Вверх
neosapient
Дата 3.8.2019, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 670
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



Спасибо.
Жаль, что нет простого решения.
PM MAIL   Вверх
LShadow77
Дата 12.8.2019, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 17.10.2011

Репутация: нет
Всего: нет



А вот я всегда задавался вопросом, какой смысл экспортировать что-то из exe-файла? 
PM MAIL   Вверх
Google
  Дата 18.10.2019, 11:48 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0812 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.