读书人

关于GetCurrentDirectory用在exe里个d

发布时间: 2012-05-09 12:13:59 作者: rapoo

关于GetCurrentDirectory用在exe里个dll里得到的当前目录不同的问题
桌面有一个文件夹“xxx”,里面有“InspectQQLandDlg.dll”和“myQQConsole.exe”。其中在dll和exe文件里都用了GetCurrentDirectory函数来得到程序当前路径。但是奇怪的问题出现了。
我在InspectQQLandDlg.dll代码里面用GetCurrentDirectory得到当前程序的目录,得到的 是“C:\Users\Administrator\Desktop”而实际的应该是“C:\Users\Administrator\Desktop\xxx”也就是说我得到的比实际少了一个文件目录“xxx”;
在myQQConsole.exe代码里面用GetCurrentDirectory得到当前程序的目录,得到的是“C:\Users\Administrator\Desktop\xxx”,这个是正确的。
为什么同一个GetCurrentDirectory函数用在dll和exe里面得到的路径不一样呢?dll和exe都是在一个路径下的(文件夹“xxx”下面)
急求各位大神解答

[解决办法]
GetCurrentDirectory 获得的是当前进程的目录,如果是DLL中使用该函数,获得的应该是调用该DLL的进程的目录
[解决办法]
GetCurrentDirectory 获得的是当前进程的活动目录(资源管理器决定的),可以用SetCurrentDirectory 修改的。你要的那种目录应该用GetModuleFileName获取。
btw:楼上的头像很萌...

[解决办法]
如果你的exe和dll是处于同一个进程,禁止不可能发生上述的情况。

我也建议使用GetModuleFileName,这个函数是绝对可靠的。GetCurrentDirectory 得到的路径是随时可能被SetCurrentDirectory修改的。至于你说的得到的是记事本的路径,你需要在dllmain的参数里面,保存它的第一个参数为全局变量,然后调用GetModuleFileName的时候将这个变量作为第一个参数传入。
[解决办法]

探讨

引用:

如果你的exe和dll是处于同一个进程,禁止不可能发生上述的情况。

我也建议使用GetModuleFileName,这个函数是绝对可靠的。GetCurrentDirectory 得到的路径是随时可能被SetCurrentDirectory修改的。至于你说的得到的是记事本的路径,你需要在dllmain的参数里面,保存它的第一个参数为全局变量,然后调用GetMo……

[解决办法]
既然你会用dll,那么应该会用导出函数吧。不会的话就自己百度一下,很简单的。

然后在dll里面声明一块共享内容。

#pragma data_seg("Shared")
volatile char my_inject_exe_path[MAX_PATH] = {0};
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws")

然后将下面的函数导出:
void my_inject_exe_path(string path)
{
strcpy_s(my_inject_exe_path,MAX_PATH,path.c_str());
}

在你注入的exe里面,先获取到exe的全路径,然后调用my_inject_exe_path就可以了。
[解决办法]
17楼的思路是正确的,你在你的DLL中显示my_inject_exe_path[MAX_PATH],不就是对该DLL完成注入工作的模块的路径吗?

探讨
引用:

既然你会用dll,那么应该会用导出函数吧。不会的话就自己百度一下,很简单的。

然后在dll里面声明一块共享内容。

#pragma data_seg("Shared")
volatile char my_inject_exe_path[MAX_PATH] = {0};
#pragma data_seg()
#pragma comment(linker……

读书人网 >C++

热点推荐