如何正确使用_get_wpgmptr?调用崩溃及替代方案异常问题求助
替代
_get_wpgmptr的可靠方案 你用_get_wpgmptr时崩溃,大概率是因为该函数依赖CRT的内部初始化逻辑,在部分执行环境(比如窗口程序、DLL、未正确初始化CRT的进程)下无法正常工作,导致传入的指针被错误赋值,触发内存访问异常。加上该函数并非Windows平台的标准API,推荐改用原生Windows API GetModuleFileNameW——这是获取当前进程可执行文件路径的标准方式,不存在弃用问题,兼容性和稳定性都更好。
正确实现代码示例
方式1:动态分配足够缓冲区(推荐,支持长路径)
#include <windows.h> #include <wchar.h> #include <stdlib.h> wchar_t* get_executable_path() { wchar_t* path = NULL; DWORD buffer_size = MAX_PATH; // 先尝试用MAX_PATH大小的缓冲区获取路径 path = (wchar_t*)malloc(buffer_size * sizeof(wchar_t)); if (!path) return NULL; DWORD len = GetModuleFileNameW(NULL, path, buffer_size); // 如果缓冲区不够,获取实际需要的长度并重新分配 while (len == buffer_size && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { buffer_size *= 2; wchar_t* temp = (wchar_t*)realloc(path, buffer_size * sizeof(wchar_t)); if (!temp) { free(path); return NULL; } path = temp; len = GetModuleFileNameW(NULL, path, buffer_size); } if (len == 0) { free(path); return NULL; } // 可选:调整缓冲区大小到实际路径长度+1(节省内存) wchar_t* final_path = (wchar_t*)realloc(path, (len + 1) * sizeof(wchar_t)); if (final_path) { path = final_path; } return path; } // 使用示例 int main() { wchar_t* executable_path = get_executable_path(); if (executable_path) { wprintf(L"Executable path: %s\n", executable_path); wprintf(L"Path length: %zu\n", wcslen(executable_path)); free(executable_path); // 记得释放内存 } return 0; }
方式2:使用固定大小缓冲区(简单,但需注意路径长度限制)
如果确定路径不会超过MAX_PATH(不推荐用于现代系统,因为支持长路径),可以用:
#include <windows.h> #include <wchar.h> int main() { wchar_t executable_path[MAX_PATH] = {0}; DWORD len = GetModuleFileNameW(NULL, executable_path, MAX_PATH); if (len > 0 && len < MAX_PATH) { wprintf(L"Executable path: %s\n", executable_path); wprintf(L"Path length: %zu\n", wcslen(executable_path)); } return 0; }
关于_wpgmptr的问题
_wpgmptr是CRT维护的全局变量,仅在控制台程序中会被自动初始化,在窗口程序或DLL中可能未被正确赋值,这就是你调用lstrlenW返回0的原因。而且该变量已被标记为弃用,完全不建议继续使用。
内容的提问来源于stack exchange,提问作者user1318499
相关产品推荐
相关产品推荐

