C++多字节项目调用资源提取函数报错无法将const char[7]转为LPSTR
报错原因
你遇到的报错核心是类型的const属性不匹配:
LPSTR是Win32 API定义的char*类型,指向可修改的字符内存- 你传入的
"checker.bat"是字符串字面值,属于const char [7]类型,默认指向只读内存,C++标准禁止将常量指针隐式转换为可写指针,因此触发编译报错,该报错和字符集配置无关。
解决方案(按推荐优先级排序)
方案1(最推荐,符合const正确性)
修改extract函数的参数声明,将第二个参数改为指向常量的指针LPCSTR(对应const char*),因为你的函数逻辑不会修改传入的路径字符串,本身就应该用常量指针:
// 修改前 // void extract(WORD wResId, LPSTR lpszOutputPath) // 修改后 void extract(WORD wResId, LPCSTR lpszOutputPath) { // 函数内部代码完全不需要改动 HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(wResId), _TEXT("BINARY")); HGLOBAL hLoaded = LoadResource(NULL, hrsrc); LPVOID lpLock = LockResource(hLoaded); DWORD dwSize = SizeofResource(NULL, hrsrc); HANDLE hFile = CreateFile(lpszOutputPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL); DWORD dwByteWritten; WriteFile(hFile, lpLock, dwSize, &dwByteWritten, NULL); CloseHandle(hFile); FreeResource(hLoaded); }
修改后原有调用extract(1005, "checker.bat");可以正常编译运行。
方案2(临时兼容,不推荐)
如果不方便修改函数定义,可以在调用时强制转换掉const属性:
extract(1005, (LPSTR)"checker.bat");
注意该方案仅在确认函数不会修改传入的字符串内容时可用,否则会触发内存访问异常。
内容的提问来源于stack exchange,提问作者Lazy Toxic
相关产品推荐
相关产品推荐

