【发布时间】:2019-06-05 12:46:31
【问题描述】:
我创建了一个运行 3 个工作线程的 DLL,主线程处于循环中等待线程完成。线程被创建,但没有执行线程。
我尝试在使用 CreateThread() 创建的函数内设置 MessageBox 函数,但该框没有出现。我也尝试过调试,来自 CreateThread() 的返回值是有效的,所以线程被创建了。
BOOL WINAPI DllMain() {
main();
return 1;
}
int main() {
HANDLE h1, h2, h3;
h1 = CreateThread(first)...
h2 = CreateThread(second)...
h3 = CreateThread(third)...
WaitForSingleObject(h3, INFINITE);
return 1;
}
first() {
MessageBoxA("print some stuff");
return;
}
我已经包含了一些关于我的布局的伪代码。由于它的敏感性,我无法提供真实的代码。然而,这就是正在发生的事情。我在另一个加载此 .DLL 的项目中使用 LoadLibrary。 DLL 被加载并执行 DllMain。然后它调用我的 main 函数来创建 3 个线程。每个线程都被创建。但是线程内部的东西并没有执行。
编辑:
// dllmain.cpp : Defines the entry point for the DLL application.
#include <Windows.h>
void mb() {
MessageBoxW(0, L"AAAAAAAAAAAAAAAAAAAAAAAAA", L"AAAAAAAAAAAAAAAAAAAAAAa", 1);
}
void create() {
HANDLE han;
DWORD threadId;
han = CreateThread(NULL, 0, mb, NULL, 0, &threadId);
han = CreateThread(NULL, 0, mb, NULL, 0, &threadId);
han = CreateThread(NULL, 0, mb, NULL, 0, &threadId);
}
BOOL APIENTRY DllMain() {
create();
return 1;
}
【问题讨论】:
-
DllMain 调用 main?可能在 .dll 加载到应用程序(具有另一个 main)时调用?
-
这最初是一个 .exe 程序,这就是我有 main 的原因。我什至尝试将 'main' 更改为 'startmain' 和相同的行为。
-
您无法运行 .dll。你必须创建一个使用(链接或动态加载)它的 .exe。您可能在 .dll 中有函数实现,但应该从 .exe 调用它们(not in DllMain)。 docs.microsoft.com/en-us/windows/desktop/dlls/dllmain.
-
是的,我知道。我将其包含在我的原始帖子中。我使用另一个加载 .dll 的项目。加载这个 dll 的另一个程序只是执行一个 LoadLibrary,它会在加载这个 DLL 时立即启动它。
-
你做错了。阅读我在之前评论中包含的链接。