【发布时间】:2020-05-10 19:55:59
【问题描述】:
我第一次尝试编写 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
我的预编译头文件只包含用于记录信息的 DLL 和 TestFunction() 的 iostream。
我不知道为什么它不起作用,而且我已经被这个问题困扰了将近一整天。任何帮助表示赞赏。
【问题讨论】:
-
“然而,FreeLibrary 每次都返回 1。” - 当FreeLibrary 返回非零时,表示函数成功。是什么让您认为它失败了?
-
您应该阅读this(尤其是第二个答案)关于在
DllMain中使用cout。 -
请参阅this link,了解 DllMain 中的更详细限制列表。
-
@AdrianMole:您对“第二个答案”的描述不明确。你按什么排序答案?投票?最老的答案?活动?
-
@AndreasWenzel 对不起 - MSalters 提供的答案,here。