DWORD WINAPI NewThreadProc(LPVOID params)
{
long aa=0;
while (aa!=499999999){      //占用一定的CPU时间来运行线程
aa=aa+1;
}
return 0;
}DWORD WINAPI ThreadProc(LPVOID params)
{
DWORD p;
HANDLE gThread; gThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&NewThreadProc, NULL,0 ,&p);
WaitForSingleObject(gThread,INFINITE); //但这里却返回0(成功),用户界面也有响应
CloseHandle(gThread);return 0;
}DWORD WINAPI StartThread(){        DWORD p;
HANDLE hThread; hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&ThreadProc,NULL,0,&p);
//WaitForSingleObject(hThread,INFINITE);     //不知道为什么这里总是返回WAIT_TIMEOUT,而且如果用了这个函数,用户界面就无响应了
CloseHandle(hThread);
return 0;
}extern "C"
BOOL WINAPI DllMain( HANDLE hModule, 
                       DWORD  reason, 
                       LPVOID lpReserved
 )
{switch (reason)
{
case DLL_PROCESS_ATTACH:
{
StartThread();
 return true;}
case DLL_PROCESS_DETACH:

return true;
}
default:
return true; 
}}这个是我要写的一个dll,我需要在dll初始化的DLL_PROCESS_ATTACH中就开启线程而且这个dll在动态调用后而且执行完DLL_PROCESS_ATTACH就要马上用FreeLibrary在宿主进程中卸载,但卸载dll时宿主进程就自动出现错误报告,然后退出了,我找到原因是运行FreeLibrary时NewThreadProc仍然在执行,这时出错了但我想要在NewThreadProc完成后再FreeLibrary,有什么办法吗??????
还有StartThread函数里面用CreateThread创建线程,如果用WaitForSingleObject,根本就无响应而且无法创建线程ThreadProc,但如果StartThread里不用WaitForSingleObject,再创建一个线程ThreadProc,这里的WaitForSingleObject又可以响应了不过那时就出现了上面的问题了……各位牛人,刚学VC,可能语法有错误,希望能帮助一下,谢谢了!!!!!!!!

解决方案 »

  1.   

    //You can declare a global variable
    //For example :
    BOOL IsThreadTerminate=FALSE;//Then modify your source code
    DWORD WINAPI NewThreadProc(LPVOID params)
    {
    BOOL bTerminate=(BOOL)(* params);
    long aa=0;
    while ((aa<499999999)&&bTerminate)
    {      //占用一定的CPU时间来运行线程
    aa=aa+1;
    }
    return 0;
    }DWORD WINAPI ThreadProc(LPVOID params)
    {
    DWORD p;
    HANDLE gThread;gThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&NewThreadProc, &params,0 ,&p);
    WaitForSingleObject(gThread,INFINITE);//但这里却返回0(成功),用户界面也有响应
    CloseHandle(gThread);return 0;
    }DWORD WINAPI StartThread(){        DWORD p;
    HANDLE hThread;hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&ThreadProc,& IsThreadTerminate,0,&p);
    //WaitForSingleObject(hThread,INFINITE);     //不知道为什么这里总是返回WAIT_TIMEOUT,而且如果用了这个函数,用户界面就无响应了
    CloseHandle(hThread);
    return 0;
    }extern "C"
    BOOL WINAPI DllMain( HANDLE hModule, 
                           DWORD  reason, 
                           LPVOID lpReserved
     )
    {switch (reason)
    {
    case DLL_PROCESS_ATTACH:
    {
    StartThread();
     return true;}
    case DLL_PROCESS_DETACH:

    IsThreadTerminate =TRUE;
    Sleep(20);
    return true;
    }
    default:
    return true; 
    }}
      

  2.   

    //I'm sorry, please modify this function
    // &params -> params
    DWORD WINAPI ThreadProc(LPVOID params)
    {
    DWORD p;
    HANDLE gThread;gThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&NewThreadProc, params,0 ,&p);
      

  3.   

    抱歉,還有個地方寫錯了,
    將while ((aa<499999999)&&bTerminate)修改為while ((aa<499999999)&&!bTerminate)
      

  4.   

    搞不懂为何要用While,Sleep不行吗?
      

  5.   

    其实楼主的需求很简单,它在缩主程序里面执行(我估计是explorer或是ieexplorer之类的程序吧),但这种缩主程序又有个特性,加载时会调用固定的Com接口,此过程缩主程序是在加载程序中的,在主线程(也就是界面线程)中,但楼主要在这个加载过程中干一件事,可能是连接网络之类的吧,我估计,嘿嘿,方法有一种,实现缩主程序必须的接口,让缩主程序不FreeLibrary你,否则无法实现,CreateThread完成后如果不waitforsingleobject,则马上缩主就会freelibrary你,你的thread马上会出错(空间被释放了),如果调了wait,则这个程序就失去了createthread的意义,还不如直接在主线程中调呢,当然,并不是完全没有办法实现,实现的方法是在CreateThread后创建一个windows消息泵,就是用GetMessage,translatemessage....(去查GetMessage从MSDN中),这样主界面会可以,在GetMessage中设一个全局变量,在Thread结束的时候取消这个消息泵,就不写代码了,逻辑大概就是如此
      

  6.   

    谢谢了~~~不过还没解决啊……developCpp:改动后还是不行~~~不是IsThreadTerminate这个变量的问题,我找过在DLL_PROCESS_ATTACH中用WaitForSingleObject无论怎么样线程都会死锁的thinp:这里怎么样写消息循环?我刚学VC的啊,上面的代码也都是我七拼八凑出来的,实在不知道啊……
      

  7.   

    不用那么麻烦
    你不就想要在DLL加载时开启Thread,在DLL卸载时关闭Thread吗
    那就
    在DLL_PROCESS_ATTACH时CreateThread
    在DLL_PROCESS_DETACH时TerminateThread
      

  8.   

    或者如果楼主想要在Thread任务完成之后自动通知宿主进程卸载DLL
    可以在CreateThread传入宿主进程的句柄,然后Threac完成任务之后发送自定义消息给宿主进程,宿主进程接收到消息之后执行FreeLibrary
      

  9.   

    就是因为CreateThread在DLL_PROCESS_ATTACH这里运行就有问题,
    这可以说是一个Windows的bug来的,《Window高级编程指南》这本书的433页就写了这个情况,我就是想有什么办法在DLL_PROCESS_ATTACH里能开启线程而不令WaitForSingleObject无响应就可以了
      

  10.   

    没怎么看明白,不过用到多线称等待的时候,可以用event和WaitForSingleObject来进行的
      

  11.   

    怎么还没有解决,大家先要明确一点,宿主程序不是楼主写的,如果是楼主写的,这种问题很简单,也就是宿主程序是别人写的,楼主无法控制宿主程序,所以要执行DLL加载的时候要使宿主程序不堵死,要不然宿主程序就没有反应了,有一种方法,在DllMain中再LoadLibrary一次自己,不要FreeLibrary,问题也许可以解决,不过没试过会不会宿主程序主动FreeLibrary,不同的宿主程序执行不一样(程序安全上的问题),楼主可以试一下
      

  12.   

    〉在DllMain中再LoadLibrary一次自己,不要FreeLibrary,问题也许可以解决
    这么做保证会锁死程序……
      

  13.   

    好了,给分了~~~~
    谢谢大家的回答,不过我可不是做流氓插件……我是学习写外挂的,算是做坏事吗?我的程序的确是用了线程注入,我想的是在软件的使用过程中,如果用户使用一些安全软件把我的dll卸载掉了,能否“优雅”一点地自己关闭线程,然后自行卸载dll,而不要让宿主进程非法操作自动退出呢??其实我知道LoadLibrary后线程是可执行的,不过我想尝试一下在LoadLibrary后马上FreeLibrary这种"极限的情况"下dll是否仍能等待并执行而已,看来windows的确有太多的限制了,无法解决就算了~~~