You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GetProcAddress参数类型转换错误求助:LPWSTR转LPCSTR失败

解决GetProcAddress参数类型不匹配问题

先看你的代码核心问题:项目启用了Unicode字符集,此时MAKEINTRESOURCE会被宏替换为MAKEINTRESOURCEW,生成LPWSTR宽字符指针,但GetProcAddress的第二个参数要求是LPCSTR(ANSI字符指针),因此触发类型转换错误。

下面是几种可行的解决方法:

方法1:直接转换序数(最简洁)

通过序数调用GetProcAddress的本质是:传入的指针高16位必须为0,低16位是序数值。所以不需要用MAKEINTRESOURCE,直接把WORD类型的序数强制转为LPCSTR即可:

WORD wOrdinal = IMAGE_ORDINAL(dwCThunk->u1.Ordinal);
if (!(lpApiLocalAddress = (LPVOID)GetProcAddress(
                hLocalLibrary,
                (LPCSTR)wOrdinal
)))
{
                printf_error("Error at GetProcAddress, code/msg = %s", GetLastErrorFormat());
                return FALSE;
};
sprintf_s(szApiInfo, "Ordinal %d", wOrdinal);

如果想更严谨,用MAKELONG确保高16位为0:

(LPCSTR)MAKELONG(wOrdinal, 0)

方法2:显式使用ANSI版本的宏

直接调用MAKEINTRESOURCEA(ANSI版本的宏),生成LPCSTR类型的参数,完美匹配GetProcAddress的要求:

if (!(lpApiLocalAddress = (LPVOID)GetProcAddress(
                hLocalLibrary,
                MAKEINTRESOURCEA(wOrdinal)
)))

方法3:正确使用reinterpret_cast

如果你坚持用reinterpret_cast,要确保转换目标是LPCSTR,而非其他类型:

if (!(lpApiLocalAddress = (LPVOID)GetProcAddress(
                hLocalLibrary,
                reinterpret_cast<LPCSTR>(MAKEINTRESOURCE(wOrdinal))
)))

之前转换无效,大概率是你转错了目标类型(比如误转成LPWSTR),或者没有替换到正确的参数位置。

补充说明:GetProcAddress本身不区分字符集,只要传入的指针高16位为0,就会自动当作序数处理,核心是让参数类型匹配LPCSTR即可。

内容的提问来源于stack exchange,提问作者qxseb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:40:18