api调用参数问题。

xhenry 2004-06-23 10:38:05
api函数的参数为dword类型。而我只知道要传递一个字符串过去,我如何取得字符串的地址值?
...全文
37 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
rainstormmaster 2004-06-23
或者先将字串转为byte数组,然后传递数组第一个元素对应的地址(用varptr获得)
回复
rainstormmaster 2004-06-23
Dim s As String
s = "aaa"
Dim i As Long
i = StrPtr(s)

i就是字串s对应的地址
回复
cso 2004-06-23
StrPtr:返回真正的UNICODE字符串缓冲区的地址

StrPtr

该函数主要用来产生高效的UNICODE API调用。在VB4,UNICODE形式的API函数的调用必须借助于Byte数组,例如:

Declare Sub MyUnicodeCall Lib "MyUnicodeDll.dll" (pStr as Byte)

Sub MakeCall (MyStr as String)

Dim bTmp() as Byte
bTmp=MyStr & vbNullChar
MyUnicodeCall bTmp(0)
MyStr=bTmp
MyStr=left(MyStr, Len(MyStr)-1)

End Sub

如果使用StrPtr,上面的代码精简为:

Declare Sub MyUnicodeCall Lib "MyUnicodeDll.dll" (pStr as Byte)

Sub MakeCall (MyStr as String)

MyUnicodeCall StrPtr(MyStr)

End Sub

VarPtr/StrPtr/ObjPtr的执行速度非常非常快,因此调用UNICODE函数所赞成有系统负担实际上小于调用相对应的ANSI函数。因为前者不需进行转换。

StrPtr还能用于优化ANSI API函数的调用。在调用时使用StrConv和StrPtr就能避免将一个字符串变量多资传递给函数以及为每个调用而执行转换操作所造成的系统负担。例如原来的:

Declare Sub MyAnsiCall Lib "MyAnsiDll.dll" (ByVal pStr As String)

MyAnsiCall MyStr

现在变为:

Declare Sub MyAnsiCall Lib "MyAnsiDll.dll" (ByVal pStr As Long)

MyStr=StrConv(MyStr,vbFromUnicode)
MyAnsiCall StrPtr(MyStr)
MyStr=StrConv(MyStr,vbUnicode) '并不总是要求

StrPtr还是唯一能直观地告诉你空字符串和null字符串的不同的方法。对于null字符串(vbNullString),StrPtr的返回值为0,而对于空字符串,函数的返回值为非零。

http://www.vbnew.net/wz/qcwz1/list.asp?id=999
回复
发帖
API
创建于2007-09-28

1461

社区成员

VB API
申请成为版主
帖子事件
创建了帖子
2004-06-23 10:38
社区公告
暂无公告