2011-11-25 57 views
5

我想,当你加载他 由于某种原因,线程函数没有做任何事情。要创建一个DLL,这将创建一个线程:\无法调用dll文件线程

,这是我的代码:

dllthread!= null ..为什么它不工作?

#include "stdafx.h" 
DWORD WINAPI ThreadProc(
    __in LPVOID lpParameter 
) 
{ 

    std::ofstream myfile; 
    myfile.open ("example.txt"); 
    myfile << "Writing this to a file.\n"; 
    myfile.close(); 

    return 0; 
} 

BOOL APIENTRY DllMain(HMODULE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
{ 

    switch (ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH:  
     DWORD DllThreadID; 
     HANDLE DllThread; //thread's handle 

     DllThread=CreateThread(NULL,0,&ThreadProc,0,0,&DllThreadID); 
// 
     if (DllThread == NULL) 
      MessageBox(NULL, L"Error", L"Error", MB_OK); 

     CloseHandle(DllThread); 
     break; 
    case DLL_THREAD_ATTACH: 
    case DLL_THREAD_DETACH: 
    case DLL_PROCESS_DETACH: 


     break; 
    } 
    return TRUE; 
} 
+3

不要这样做。从DllMain创建线程是一个[坏主意](http://blogs.msdn.com/b/oldnewthing/archive/2007/09/04/4731478.aspx)。 –

+0

那你建议我做什么?我需要从一个dll文件创建一个线程。 – DanR

+0

丹,你是否拥有加载该DLL的应用程序的源代码? – hmjd

回答

9

而是开始从DllMain()线程导出将启动线程,而不是一个功能:

extern "C" __declspec(dllexport) void start_thread() 
{ 
    DWORD DllThreadID; 
    HANDLE DllThread; //thread's handle 

    DllThread=CreateThread(NULL,0,ThreadProc,0,0,&DllThreadID); 
    if (DllThread == NULL) 
     MessageBox(NULL, L"Error", L"Error", MB_OK); 
    else 
     CloseHandle(DllThread); 

} 

调用LoadLibrary()使用GetProcAddress()获得访问start_thread()功能后。

希望这会有所帮助。

+0

解决了问题谢谢! :) – DanR