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重新编译,问题会少些。