Страницы

Поиск по вопросам

понедельник, 17 декабря 2018 г.

Хранение функции

Есть указатель на функцию, расположенную в DLL библиотеке. Можно ли эту функцию сохранить в объекте типа std::function<...> при корректном указании шаблонных параметров, затем отключить библиотеку через FreeLibrary (работаю в MSVC) и работать с функцией через std::function? Мне просто надо запихать туда разыменованный указатель на эту функцию?


Ответ

Т.е., простыми словами, что вы хотите сделать (вернее, что у вас получится) - вы сохраняете указатель на функцию, выбрасываете из памяти код функции, оставляя указатель непонятно куда, и вызываете ее... Как вы думаете, что у вас получится?
std::function тело функции никоим образом не сохраняет. Ну, а указатель на функцию будет инвалидирован вызовом FreeLibrary.
Набросать соответствующий код очень просто, можете убедиться сами...
indll.cpp
#include #include
using namespace std;
extern "C" void __declspec(dllexport) inDll() { cout << "From DLL
"; }
Компилируем как cl /LD indll.cpp
test.cpp
#include #include #include #include
using namespace std;
int main(int argc, const char * argv[]) { HMODULE dll; if (0 != (dll = LoadLibrary("inDll.dll"))) { cout << "Load success
";
FARPROC ptr = GetProcAddress(dll,"inDll"); function f = ptr; f(); FreeLibrary(dll);
} }
Компилируем как cl test.cpp
Запускаем test.exe, убеждаемся, что все работает. Меняем местами строки
f(); FreeLibrary(dll);
компилируем и убеждаемся окончательно, что так поступать нельзя :)

Комментариев нет:

Отправить комментарий