我有一個DLL的函數,我希望能獲知調用者的確切文件名,我會依據文件名的不同返回不同的結果。如何做到這點?

解决方案 »

  1.   

    char path[MAX_PATH];
    GetModuleFileName( NULL, path, MAX_PATH );
    path是主exe的名称
      

  2.   

    ancienttale(voidman)
    我事先是不知道調用者是誰的阿。
    如果主EXE是通過某個DLL間接調用我的函數,那麽我想知道那個DLL是誰阿
      

  3.   

    可以获得DLL加载的那个进程的实例句柄hInstance,然后用:
    DWORD GetModuleFileName(
      HMODULE hModule,    // handle to module to find filename for
      LPTSTR lpFilename,  // pointer to buffer to receive module path
      DWORD nSize         // size of buffer, in characters
    );
    记得分配lpFilename内存,一般大小是MAX_PATH,如果是VC.NET,就是_MAX_PATH,OK.
      

  4.   

    dll导出函数入口处,取栈中上一级函数的返回地址,caller_ret_addr = xxxxCreateToolhelp32Snapshot取hSnapshot用hSnapshot,调用Module32First
    do
    {
       从MODULEENTRY32中取modBaseAddr,modBaseSize ,确认caller_ret_addr是否在其中
       if(在)
       {
          GetModuleFileName取文件名
          break;
       }
    }
    while (Module32Next)