在郁闷了几个小时之后,终于开朗了,这个世界都开朗了.定位问题的能力是程序员必须的能力
一个mfc的dll,客户想调用这个动态库,这个库要知道自己的路径是在什么位置.
问题产生出来了.用得到一个进程的路径只有用
GetModuleFileName(HMODULE ,strPath,MAX_PATH);
第一个参数是模块的句柄
开始想到的办法是dllmain里面有一个
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
第一个参数就是模块的句柄.
但是mfc动态库的dllmain在那里呢.我在vc源代码里面把它找出来.放到工程文件下.编译一个错误.这个错误是说AfxCriticalTerm(); 找不到定义.我接着有在vc源代码下找到有这个函数的头文件,把这个文件有放到工程目录下.编译终于通过了.
本来想这样用GetModuleFileName和dllmain的hModule就可以得到dll 的当前路径了,得到是得到了,但是一个可怕的问题让我不能理解.dll里面的弹出对话框弹不出来了就是对话况初始化函数都,没有执行/程序运行其他功能还是正常的/
这个问题是就是和我加入工程的两个文件有关系.去掉这两个文件就可以了.
最终我觉得还是有另一个方法,这个问题我都不知道mfc在底层做了什么手脚.
最后的办法是在dll中调用GetModuleFileName(::GetModuleHandle(_T("xxx.dll")),strPath,MAX_PATH);
真的是程序深不可测.做什么不好,非要做中国的程序员