vb开发中字符串传参出现‘口’符

没细看代码,图片截图实在太难看清。但是我猜可能是Unicode和ANSI的问题?看看Windows API版本是W还是A,也就是Unicode还是ANSI其他非win API也需要仔细考虑字符串编码。-----4月13日割-----有人 @杨兴国 问到了我Windows API编码的问题。在此以CreateWindowEx为例说明一下。在C/C++系统中,CreateWindowEx是宏,定义于WinUser.h中。它会根据工程实际定义的字符串格式(也是个宏,条件编译),会替换成CreateWindowExW或CreateWindowExA,W是Unicode的后缀(宽字符),A是ANSI的后缀。对于VB6(古典的VB),可以显式调用W版本或A版本,也可以在设置中调整。对于http://VB.NET及其他.NET家族语言,建议在工程设置中调整。对于未知的dll,可以利用相关dll/exe/二进制分析软件查看它调用的字符串版本从而推断实际需要的字符串格式。对于自行编写的跨语言/不同工程的静/动态链接库,可以具体设定工程选项。建议非老司机在整个软件(“解决方案”)内,字符串格式保持一致。在此仅作综述,具体操作及细节请查阅相关语言资料。
■网友
补图:vb封装dll代码
vb开发中字符串传参出现‘口’符

----------------------------------------------------------------------------------------------------------------------
Delphi 声明代码:
function readCard1(icdev: Integer; var cardNo: pansichar; var customeNo: pansichar; var orderdate: pansichar; var orderAmount: Integer; var orders: Integer; var orderTotal: Integer; var fgs: pansichar; var glz: pansichar; var ControllerNo: pansichar; var NodeNo: pansichar): integer; stdcall;------------------------------------------------------------------------------------------------------------------------
2017年4月13日
【vb开发中字符串传参出现‘口’符】 参照 消失的苦猫 的答案,抽了个时间在网上进行了相关资料的查找,最终参照《VB6.0中Unicode编码问题的灵活处理及妙用》一文的说明,进行了相关的测试。
按照文中叙述,使用了StrConv函数进行了字符串的转换,替代了原先固定字符的替换解决办法。部分代码如下:
Dim ret As IntegerDim CardNo As StringDim customeNo As StringDim orderDate As StringDim orderAmount As LongDim orders As IntegerDim orderTotal As LongDim fgs As StringDim glz As StringDim ControllerNo As StringDim NodeNo As Integerret = readCard(icdev, CardNo, customeNo, orderDate, orderAmount, orders, orderTotal, fgs, glz, ControllerNo, NodeNo)CardNo = StrConv(CardNo, vbFromUnicode)CardNo = Replace(CardNo, Chr(0), "")测试结果如下:
vb开发中字符串传参出现‘口’符

vb开发中字符串传参出现‘口’符

基本上说明了是编码问题导致的宽字符问题。具体的情况还有待学习研究。
感谢 消失的苦猫 的提示,相关参考:
杨红卫,吴星,毛鏐. VB6.0中Unicode编码问题的灵活处理及妙用. 电脑与信息技术,2005,(05):60-63.


    推荐阅读