PB10以上版本调用windows API函数的问题

pb10以上版本默认的字符集为Unicode,而windows API函数其默认字符集为ansi,所以如果在PB10以上版本直接调用API函数经常会出现一些奇怪的问题:如调用不正确;调用时传入的字符串出现乱码;调用后程序异常,不正常退出。以下为编程时遇到的问题和解决办法M,使用的PB版本为11.5。

大部分API都有A(ANSI)和W(uNICODE)2个声明版本,个人呢建议尽量使用W。

WNET API函数集:

FUNCTION ulong WNetAddConnection(ref string lpszNetPath,ref string lpszPassword,ref string lpszLocalName) LIBRARY "mpr.dll" ALIAS FOR "WNetAddConnectionA;Ansi"

无问题
FUNCTION ulong WNetCancelConnection(ref string lpszName,boolean bForce) LIBRARY "mpr.dll" ALIAS FOR "WNetCancelConnectionA;Ansi"

无问题
Function ulong WNetAddConnection2(ref netresource lpNetResource,ref string lpPassword,ref string lpUserName,ulong dwFlags) LIBRARY "mpr.dll" ALIAS FOR "WNetAddConnection2A;Ansi"

无问题

定义1:ANSI
FUNCTION  ulong WNetUseConnectionA (ulong hwndOwner,REF s_netresource lpNetResource,string lpPassword,string lpUsername,ulong   dwFlags,REF string lpAccessName,REF ulong lpBufferSize,REF   ulong   lpResult)   library   "mpr.dll" alias for "WNetUseConnectionA;Ansi"     

定义2:Unicode

FUNCTION ulong WNetUseConnectionA(ulong hwndOwner,REF s_netresource lpNetResource,string lpPassword,string lpUsername,ulong dwFlags,REF string lpAccessName,REF ulong lpBufferSize,REF   ulong   lpResult)   library   "mpr.dll" ALIAS FOR   "WNetUseConnectionW"

无问题


FUNCTION ulong WNetGetConnection(ref string lpszLocalName,ref string lpszRemoteName,ref ulong cbRemoteName) LIBRARY "mpr.dll" ALIAS FOR "WNetGetConnectionA;Ansi"

调用后会出现异常退出,参数必须进行字符集转换,例子如下:

string ls_remote,ls_local='w:'
ls_local=String(Blob(ls_local,EncodingANSI!),EncodingANSI!)
ls_remote=String(Blob(ls_tmp,EncodingANSI!),EncodingANSI!)
ulong li_size=255
WNetGetConnection(ls_local,ls_remote,li_size)
Messagebox('',ls_remote)

另:现在很多网上关于API调用资料都是老版本PB,如何要直接网页拷贝代码特别要注意声明中是否带有有转换(ALIAS FOR)语句,直接拷贝到PB10+以上版本会有奇怪的问题,个人建议下载源代码由PB重新编译,问题会少些。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值