描述:
对office做插件 使用DLL注入方式
目的:
获取DLL文件的真实路径
使用方法:
GetCurrentDirectory()
GetModuleFileName()
区别:
GetCurrentDirectory()获取的是程序安装的目录 如:c:\windows
GetModuleFileName()获取的是安装目录并文件名 如:c:\windows\aa.exe
问题:
安装程序将DLL安装在D:\ office安装在C:\ 使用GetCurrentDirectory()正常应该可以获取到该DLL
使用该函数获得的是C盘office安装目录。并不是DLL的真实目录。
解决方法:
使用GetModuleFileName()来获取DLL实际安装目录
具体如下:
//获得DLL当前路径
TCHAR fullPath[MAX_PATH];
CString strAppPath; // 保存结果
TCHAR drive[_MAX_DRIVE]; // 盘符名称,比如说C盘啊,D盘啊
TCHAR dir[_MAX_DIR]; // 目录
TCHAR fname[_MAX_FNAME]; // 进程名字
TCHAR ext[_MAX_EXT]; //后缀,一般为exe或者是dll
HINSTANCE hrs = AfxGetResourceHandle(); // 获得当前资源句柄(一般是exe的资源句柄)
AfxSetResourceHandle(theApp.m_hInstance); // 设置为dll的资源句柄
HINSTANCE h_CurDll = AfxGetResourceHandle(); //取得dll的句柄
AfxSetResourceHandle(hrs); // 调用结束后,重新设置为exe的资源句柄
GetModuleFileName(h_CurDll, fullPath, MAX_PATH);
_splitpath(fullPath, drive, dir, fname, ext); //分割该路径,得到盘符,目录,文件名,后缀名
strAppPath = drive;
strAppPath += dir;
strAppPath则为文件安装的目录
注意:
使用GetModuleFileName()第一个参数为Null时也会获取到的是office安装目录。第一个参数要为DLL资源句柄。 ps:文中使用目录因为使用linux的习惯叫法(文件夹)
转载于:https://blog.51cto.com/evely/1370938