再说详细点,我做了一个 DLL,该 DLL 可能被任意程序加载,我如何在 DLL 中获得加载程序的模块句柄?
我试过 GetModuleHandle(NULL),得到的句柄和主程序的模块句柄并不相同。期待高手赐教!!!

解决方案 »

  1.   

    函数开头调用了AFX_MANAGE_STATE(AfxGetStaticModuleState()) ;没?
    要先转换地址
      

  2.   

    GetModuleHandle(NULL)的参数指定为调用它的exe的名字。
    要是不方便确定名字,可以通过dll的导出函数由exe得到自己的句柄直接传给它。
      

  3.   

    TO handwolf(青松崖):
      DLL 没有用到 MFC,所以我并不确定能不能那样做。TO idAnts(你才无聊呢):
      因为 DLL,并不能确定会被谁加载,所以 EXE 名字没办法确定。
      用导出函数传入,这是最简单的解决办法,也最可靠。
      但是,如果 EXE 不调用这个函数该怎么办?我要的就是这个,直接在 DLL 中准确的获得加载程序的模块句柄!!!
    期待高手们赐教~```
      

  4.   

    我不知道你倒底要那个 hInstance 
    EXE 名字是可以确定我(用PSAPI)
      char name[256];
      hd=GetCurrentProcess();                //dll与程序一般在同一进程
      GetModuleFileNameEx(hd,NULL,name,256); // 得到调用程序名
      HMODULE h=GetModuleHandle(name);       // 得到  HMODULE
    但它应该与
    GetModuleHandle(NULL);    相同你的 "主程序的模块句柄"是指什么?你是怎么得到的?。
      

  5.   

    方法1:
        Dll暴露函数,供客户程序传入。
    方法2:
        动态枚举客户程序句柄。
        CreateToolhelp32Snapshot
        Module32First
        Module32Next
        试试。
        相当于类似《Windows优化大师》的软件,从中找载入Dll的进程。