首页 > 编程语言 > VB.net调用dll,char*类型为输出参数的声明
2013
10-15

VB.net调用dll,char*类型为输出参数的声明

DC_API int WINAPI DC_RecogImg(DCCTX h,const char*reqname,const char*reqpwd,int softwaretype,int recotimeout,int imglen,char*img,char*imgid,char*result);

dll api声明如上所述,其中imgid和result为输出参数.
各参数类型翻译为VB.NET类型分别为(Integer,String,String,Integer,Integer,Integer,Byte(),String,String),但是最后两个参数为输出参数,而String一旦声明就不可改变,以String类型作为实参时必然会引起”内存保护”错误,在VB6中,可以声明为字节数组,然后引用字节数组的第一字节,函数执行完毕后再进行转换,用起来较为麻烦.
不过在.net中,.net提供了StringBuilder的可变字符串对象,可以很方便解决这个问题.需要注意的一点是,因为StringBuilder本身已经为可变字符串,所以在api中需要传引用的字节数组类型直接传StringBuilder值就可以了.
所以,以上API可声明为:

Declare Ansi Function DC_RecogImg Lib "dc.dll" (ByVal h As Integer, ByVal user As String, ByVal pass As String, ByVal softwaretype As Integer, ByVal recotimeout As Integer, ByVal imglen As Integer, ByVal img() As Byte, ByVal imgid As StringBuilder, ByVal imgid As StringBuilder) As Integer

调用时,先初始化2个StringBuilder对象

Dim re As Integer
Dim imgid As New StringBuilder(32)
Dim result As New StringBuilder(8)

Dim img As Byte()

FileToBinary(img, Application.StartupPath & "\code.jpg") '将本地图片读入二进制流变量,当然也可以是任意图片的二进制流
re = DC_RecogImg(h, TextBoxUser.Text, TextBoxPass.Text, 0, 60, img.Length, img, imgid, result)
imgid.Length = 32 '因为StringBuilder为变长字符串对象,所以传引用后,需要重新设置下长度
If re > -1 Then
	TextBoxImgId.Text = imgid.ToString()
	TextBoxResult.Text = result.ToString()
Else
	RichTextBox1.AppendText("识别失败" & ControlChars.CrLf)
End If
最后编辑:
作者:NINE
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。