描述:

   对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的习惯叫法(文件夹)