请问为什么hwin是窗口A的句柄,但我调用GetModuleFileName((HMODULE)::GetWindowLong(hwin,GWL_HINSTANCE),str,190);后str却存放着窗口B的进程路径?(窗口A是窗口B以外的某个窗口。但调用函数后由str得知窗口B竟是调用GetModuleFileName的Visual C++窗口啊,晕。)

解决方案 »

  1.   

    谢谢你。我想试一下的但我的VC里用不了这个函数啊——
    error C2065: 'GetModuleFileNameEx' : undeclared identifier加了#include <Psapi.h> 和在Setting里加了Psapi.lib也不行——
    fatal error C1083: Cannot open include file: 'Psapi.h': No such file or directory
      

  2.   

    貌似编译环境的问题
    另外似乎不用加psapi.lib
      

  3.   

    致mapper:
    那我也不知道怎样才能用这个Ex函数了,好像听说是VC6版本比较旧就有这样的问题。。致Janlex:
    如果传NULL进去,我认为str获得的将会是调用这个函数的进程对应的路径。我试过也的确如此。致element_cn:
    我已经重新把GetModuleFileName()的说明从头到尾认真地看了一遍,但还是不知道应该怎样用才对。我也试过GetModuleFileName((HMODULE)::GetClassLong(hwin,GCL_HMODULE),str,190);但str出来却是“C:\WINDOWS\system32\USER32.dll”。我真不知道应该怎样传这第一个参数才能使用正常了,还望指教。
      

  4.   

    可以考虑用先获得进程ID,在枚举HMODULEGetWindowThreadProcessId(hwin, &dwPID);
      

  5.   

    谢谢vocanicy,是的,我现在就是用这种办法解决了。但如果用GetModuleFileName()为什么不行呢?希望知道的朋友说一下,谢谢。
      

  6.   

    > fatal error C1083: Cannot open include file:  'Psapi.h ': No such file or directory
    你的Platform SDK的版本太低了,升级一下吧。
    或者使用函数指针的方式来调用GetModuleFileNameEx。
      

  7.   

    这个原因很简单Windows下每个进程拥有独立的4G内存空间,GetWindowLong返回的HINSTANCE实际上就是一个指针,并且它指向的地址是在目标进程中的地址,VC写的程序一般HINSTANCE都是0x00400000。也就是说目标进程的HINSTANCE和你的进程的HINSTANCE 虽然数值可能相同,但是是不同进程空间的地址。GetModuleFileName只能取得映射到当前进程空间的模块的文件路径,你把相同的HINSTANCE传入时,函数当作当前进程中的模块来解析得到的刚好是进程本身的文件路径了GetModuleFileNameEx比GetModuleFileName多了一个hProcess的参数恰恰说明了这一点。
    DWORD GetModuleFileNameEx(
      HANDLE hProcess,    // handle to process
      HMODULE hModule,    // handle to module
      LPTSTR lpFilename,  // path buffer
      DWORD nSize         // maximum characters to retrieve
    );
      

  8.   

    哦!原来是这样啊!大概明白了呵呵。谢谢vocanicy!那看来如果不想枚举进程的话就只能用GetModuleFileNameEx()了。好喽,问题解决了可以准备结贴了。感谢各位的帮忙啊!