如何在C++中获取DLL路径并转为char数组供Fortran调用?
获取DLL路径并存入char数组的简便实现
直接用Windows API的ANSI版本可以一步到位,无需宽字符转码和全局变量传递,代码简洁且符合Fortran调用的char[]要求,以下是两种可行方案:
方案一:利用DllMain保存模块句柄(更高效)
#include <windows.h> #include <string.h> // 静态存储DLL模块句柄,仅在进程加载DLL时初始化一次 static HMODULE g_hDllModule = NULL; BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch(fdwReason) { case DLL_PROCESS_ATTACH: g_hDllModule = hinstDLL; // 保存当前DLL的模块句柄 break; // 其他阶段无需额外处理 } return TRUE; } // 供Fortran调用的函数:将DLL路径写入指定char数组 void GetDllPath(char dbankpath[], size_t bufferSize) { if (g_hDllModule == NULL || dbankpath == NULL || bufferSize == 0) return; // 直接调用ANSI版本API获取路径,无需转码 DWORD pathLength = GetModuleFileNameA(g_hDllModule, dbankpath, bufferSize); if (pathLength == 0 || pathLength >= bufferSize) { // 路径获取失败或缓冲区不足时,设置默认路径 strncpy_s(dbankpath, bufferSize, "c:\\temp", _TRUNCATE); } }
方案二:无需DllMain,动态获取模块句柄(更独立)
如果不想依赖DllMain的全局变量,可以通过当前函数地址反向获取模块句柄:
#include <windows.h> #include <string.h> // 供Fortran调用的函数:将DLL路径写入指定char数组 void GetDllPath(char dbankpath[], size_t bufferSize) { if (dbankpath == NULL || bufferSize == 0) return; HMODULE hModule = NULL; // 从当前函数地址获取所在模块的句柄 if (!GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCSTR)GetDllPath, &hModule)) { strncpy_s(dbankpath, bufferSize, "c:\\temp", _TRUNCATE); return; } DWORD pathLength = GetModuleFileNameA(hModule, dbankpath, bufferSize); if (pathLength == 0 || pathLength >= bufferSize) { strncpy_s(dbankpath, bufferSize, "c:\\temp", _TRUNCATE); } }
关键优势
- 直接使用
GetModuleFileNameA(ANSI版本),一步得到char类型路径,省去宽字符转多字节的繁琐步骤 - 两种方案都直接操作目标
char数组,完全符合Fortran调用的参数要求 - 用
strncpy_s替代不安全的strcpy,避免缓冲区溢出风险
注意事项
- 确保传入的
dbankpath数组大小至少为MAX_PATH(Windows定义的标准最大路径长度,值为260) - 路径获取失败时会自动设置你指定的默认路径
c:\\temp
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

