WinXP下调用StrFormatByteSize64报错,为何与文档描述不符?
我之前也踩过类似的坑,给你拆解下问题根源和解决逻辑:
你在Delphi XE3里调用StrFormatByteSize64时,因为XE3默认是Unicode编译环境,Delphi会自动把这个无后缀的API函数名重定向到宽字符版本StrFormatByteSize64W。但这里的关键矛盾是:Windows XP自带的shlwapi.dll里根本没有导出StrFormatByteSize64W这个函数。
虽然微软文档标注StrFormatByteSize64支持Windows XP及以上,但这个描述藏了个细节:XP里仅提供了ANSI版本的StrFormatByteSize64A,宽字符的StrFormatByteSize64W是在Vista及以后的系统才新增的。这就导致你在XP上调用重定向后的W版本时,系统找不到对应入口点,直接抛出错误。
而换成StrFormatByteSizeW就能正常运行,是因为这个宽字符函数在XP的shlwapi.dll里是原生存在的。它和StrFormatByteSize64功能类似,只是参数里的字节数是32位整数类型——如果你的业务场景不需要处理超过4GB的字节数,这个函数完全能满足需求;如果必须处理更大数值,要么自己实现一套跨版本的字节格式化逻辑,要么考虑在XP环境替换更高版本的shlwapi.dll(但后者不推荐,容易引发其他兼容性问题)。
最后提个小建议:做Windows跨版本兼容开发时,除了看官方文档的最低支持版本,最好额外核对不同系统中DLL的实际导出函数列表,避免踩这种字符集版本的暗坑。
内容的提问来源于stack exchange,提问作者alancc

