2016-07-24 111 views
0

我想在dll中同時在後臺運行兩個函數,所以我在dllmain中做了CreateThread但它不起作用。任何提示或幫助?dll中的多線程

#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; 
    } 
} 
+0

不要在'DllMain'中創建線程(或者做任何實質性的事情)。這是一個僵局的保證。從[文檔](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583.aspx):*「由於DLL通知已序列化,入口點函數不應嘗試與其他線程或進程,因此可能會發生死鎖。「*另請參見:[某些原因在您的DllMain中不要做任何可怕的事情](https://blogs.msdn.microsoft.com/oldnewthing/20040127-00/?)p = 40873 –

+0

會發生什麼,你期望發生什麼? –

+0

我應該在哪裏創建一個呢?謝謝。 – user6632482

回答

0

創建線程之前,你的DLL

DisableThreadLibraryCalls(hinstDll) 

這應該與死鎖幫助禁用線程通知。

您的帖子似乎開始於名爲main的函數中。但是,線程啓動例程需要使用WINAPI調用約定,並且應該接受一個參數。

DWORD WINAPI main(PVOID Parameter) 

您可以通過第四個參數提供參數值。