我在CSDN上看过这样的问题,那个帖子里的回答是遍历所有进程,然后在遍历所有模块,然后在用模块跟DLL实例比较。我试过了,但是发现根本就不行,因为不同进程的模块可能是一样的,所以那种办法根本就不行。求高手解答。

解决方案 »

  1.   

    可以在dll中获得当前进程ID和线程ID.再通过这个得到窗口句柄.
      

  2.   

    这是我dll里的函数,传的参数的当前DLL的实例,是否正确?HWND GetHost(HINSTANCE hin)
    {
    HANDLE hProcess=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    HANDLE hModule;
    HINSTANCE hh=hdll;
    PROCESSENTRY32 pro32;
    if((HANDLE)-1==hProcess)
    return NULL;
    pro32.dwSize=sizeof(PROCESSENTRY32);
    MODULEENTRY32 module32;
    module32.dwSize=sizeof(MODULEENTRY32);
    BOOL bl1=::Process32First(hProcess,&pro32);
    BOOL bl2;
    while(bl1)
    {
    hModule=::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pro32.th32ProcessID);
    if((HANDLE)-1==hModule)
    {
    CloseHandle(hProcess);
    return NULL;
    }
    bl2=::Module32First(hModule,&module32);
    while(bl2)
    {
    if(hin==module32.hModule)
    {
    CloseHandle(hModule);
    CloseHandle(hProcess);
    //成功
    return FindHWND(pro32.th32ProcessID);
    }
    bl2=::Module32Next(hModule,&module32);
    }
    CloseHandle(hModule);
    bl1=::Process32Next(hProcess,&pro32);
    }
    ::CloseHandle(hProcess);
    return NULL;
    }
      

  3.   

    自己解决了,用GetCurrentProcessId获取宿主的进程ID