You need to enable JavaScript to run this app. C++多字节项目调用资源提取函数报错无法将const char[7]转为LPSTR
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 17:24:09