Есть указатель на функцию, расположенную в DLL библиотеке. Можно ли эту функцию сохранить в объекте типа std::function<...> при корректном указании шаблонных параметров, затем отключить библиотеку через FreeLibrary (работаю в MSVC) и работать с функцией через std::function? Мне просто надо запихать туда разыменованный указатель на эту функцию?
Ответ
Т.е., простыми словами, что вы хотите сделать (вернее, что у вас получится) - вы сохраняете указатель на функцию, выбрасываете из памяти код функции, оставляя указатель непонятно куда, и вызываете ее...
Как вы думаете, что у вас получится?
std::function тело функции никоим образом не сохраняет. Ну, а указатель на функцию будет инвалидирован вызовом FreeLibrary.
Набросать соответствующий код очень просто, можете убедиться сами...
indll.cpp
#include
using namespace std;
extern "C" void __declspec(dllexport) inDll()
{
cout << "From DLL
";
}
Компилируем как cl /LD indll.cpp
test.cpp
#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
}
}
Компилируем как cl test.cpp
Запускаем test.exe, убеждаемся, что все работает. Меняем местами строки
f();
FreeLibrary(dll);
компилируем и убеждаемся окончательно, что так поступать нельзя :)
Комментариев нет:
Отправить комментарий