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
相关产品推荐
相关产品推荐

