有时我们需要在当前运行的dll或exe模块中去动态加载当前模块同路径中的另一个库,或者启动当前模块同路径中的另一个exe程序,一般需要获取当前模块的路径,然后去构造同路径下目标模块的绝对路径,然后通过该绝对路径去加载或启动该目标进程。
最近我们在一个SDK项目中遇到了类似的问题,客户的Java程序通过JNI调用我们的C++ 动态库umssdk.dll,然后在该dll动态库初始化的接口中自动启动同路径下的XxLauncher.exe程序。umssdk.dll库中启动XxLauncher.exe程序的代码如下:
// 启动XxLauncher.exe
void StartExe()
{
TCHAR achLog[256] = { 0 };
TCHAR szPath[MAX_PATH] = { 0 };
TCHAR *p = szPath;
// 获取当前模块的路径
::GetModuleFileName(NULL, szPath, MAX_PATH);
// 用当前模块的路径去构造目标模块XxLauncher.exe的绝对路径,然后使用该绝对路径去启动该exe程序
p += _tcslen(szPath);
while (*p-- != _T('\\'));
*(p + 2) = 0;
_tcscat(szPath, _T("X