我已经第一次尝试编写DLL,并且有一个我正在尝试的项目。我编写我的DLL(这是我能想到的最简单的DLL),然后对其进行编译。我转到我的可执行文件,调用LoadLibrary,它可以很好地加载它,并且能够像平常一样从DLL调用函数。但是,FreeLibrary每一次返回1。我尚未能够成功卸载DLL(我正在玩热重装DLL,这是我为实际目的而共同攻克的解决方案)。
这是我的代码:
可执行文件的program.cpp:
#include <iostream>
#include <windows.h>
typedef void (*_TestFunction)();
int main()
{
HMODULE hinstDLL = LoadLibrary(L"Test.dll");
_TestFunction TestFunction = (_TestFunction)GetProcAddress(hinstDLL, "TestFunction");
TestFunction();
BOOL result = FreeLibrary(hinstDLL);
std::cout << result << std::endl;
if (hinstDLL != NULL)
{
std::cout << "Still loaded" << std::endl;
}
std::cin.ignore();
return 0;
}
我的DLL的dllmain.cpp:
#include "pch.h"
#define DLL_EXPORT
#include "dllmain.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
std::cout << "DLL Load Process" << std::endl;
break;
case DLL_THREAD_ATTACH:
std::cout << "DLL Load Threaded Process" << std::endl;
break;
case DLL_THREAD_DETACH:
std::cout << "DLL Unload Threaded Process" << std::endl;
break;
case DLL_PROCESS_DETACH:
std::cout << "DLL Unload Process" << std::endl;
break;
}
return TRUE;
}
DLL_FUNCTION void TestFunction()
{
std::cout << "Hello World" << std::endl;
}
dllmain.h:
#pragma once
#ifdef DLL_EXPORT
#define DLL_FUNCTION extern "C" __declspec(dllexport)
#else
#define DLL_FUNCTION extern "C" __declspec(dllimport)
#endif
我的预编译头仅包含iostream,用于DLL记录信息和TestFunction()
。
我不知道为什么它不起作用,并且我已经在这个问题上待了整整一天。任何帮助表示赞赏。
答案 0 :(得分:1)
根据Microsoft Documentation,如果成功,FreeLibrary将返回非零值。我刚刚在有史以来最简单的示例中对其进行了验证:
#include <iostream>
#include <Windows.h>
int main()
{
const HMODULE handle = LoadLibraryW(L"kernel32.dll");
std::cout << FreeLibrary(handle);
return 0;
}
它按预期打印 1 。
如果在调用FreeLibrary时使用DLL_PROCESS_DETACH
调用DllMain,则一切正常,并且DLL已从内存中完全卸载。