dll中的多线程

Multithreading in a dll

本文关键字:多线程 dll      更新时间:2023-10-16

我想让两个函数在dll中同时在后台运行,所以我在dllmain中执行了CreateThread,但它不起作用。有什么建议或帮助吗?

#include <Windows.h>
#include "main.h"
#include <iostream>
void main()
{
AllocConsole();
freopen("CONOUT$", "w", stdout);
std::cout << "Press enter?";
while (true) {
    if (GetAsyncKeyState(0x0D))
        Trainer(); Sleep(50);
}
}
BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD Reason, LPVOID Reserved) {
   switch (Reason) {
case DLL_PROCESS_ATTACH:
    MessageBox(0, "DllInject", "Injected", 0);
    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)main, NULL, 0, NULL);
    break;
case DLL_PROCESS_DETACH:
    break;
}
return TRUE;
}

功能示例

void artemis()
{
    while (true)
    {
        Sleep(300);
        ammoArtemis = 1;
    }
}

您不应该从DllMain调用CreateThread,因为这可能会导致死锁。可以从DllMain中调用的函数集非常有限。有关详细信息,请阅读文章动态链接库最佳实践。

在创建线程之前,请禁用DLL 的线程通知

DisableThreadLibraryCalls(hinstDll)

这应该有助于打破僵局。

您的线程似乎是从名为main的函数开始的。然而,线程启动例程需要使用WINAPI调用约定,并且应该接受一个参数。

DWORD WINAPI main(PVOID Parameter)

您可以通过第四个参数来提供参数值。