以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]API调用的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=80061)

--  作者:chnfo
--  发布时间:2016/1/15 11:22:00
--  [求助]API调用的问题
有一个外部的第三方标准dll。里面有一个函数接口是这样定义的。

BS_FT(

unsigned char* pid,

int * count

)


pid:    [in]产品标识, 为固定长度8个字节的字符串;

count[out]返回的设备个数;


我要怎么样调用它呢?要用什么样的步骤?


帮助文档里有一个调用第三方的东东,但套用过去,提示错误


我是这样操作的

1、把第三方标准dll在管理项目-外部引用中添加到foxtable的安装目录下

2、在全局代码中定义Public Declare Function BS_FT Lib "外部API.dll" Alias "BS_FT" (ByVal PID As string) As Integer \'连接设备

3、在命令窗口中执行

Dim iRetUSB As Integer = BS_FT("ASDFGHJK")


If iRetUSB = 1 Then

    MessageBox.Show("设备连接成功")

Else

    MessageBox.Show("设备连接失败")

End If


结果报错了

[此贴子已经被作者于2016/1/15 13:52:29编辑过]

--  作者:Hyphen
--  发布时间:2016/1/15 11:47:00
--  
函数定义试试
Public Declare Function BS_FT Lib "外部API.dll" (ByVal pid$ ,ByRef count As Byte) 

Count是指针,需要定义字节数组进行接收, 具体还要看接口文档才知道
Dim ret(4) As Byte
BS_FT("ASDFGHJK",ret(0))

--  作者:chnfo
--  发布时间:2016/1/15 12:37:00
--  

pid:    [in]产品标识为固定长度8个字节的字符串;

count[out]返回的设备个数;


Hyphen的方式不行哟。

函数定义里提示错误:

编译错误:无法加载引用的库“C:\\foxtable\\开发版\\外部API.dll: 试图加载格式不正确的程序



--  作者:chnfo
--  发布时间:2016/1/15 14:07:00
--  
第三方标准dll的接口说明是这么写的:

BS_FT(

unsigned char* pid,

int * count

)

功能说明:

查找计算机上指定pidBS个数。

参数:

pid:    [in]产品标识, 为固定长度16个字节的字符串;

count[out]还回的设备个数;

返回值:

BSY:执行成功,Count为查找到的ET的数目。

BSN:没有可以用的硬件,此时Count值为0


--  作者:Hyphen
--  发布时间:2016/1/15 14:30:00
--  
dll不要引用,放到“C:\\foxtable\\开发版”里面就可以,2楼的方法应该可以,

接口有没有。net的例子,看看别人怎么定义的

--  作者:chnfo
--  发布时间:2016/1/15 14:54:00
--  
编译错误:无法加载引用的库“C:\\foxtable\\开发版\\外部API.dll”: 试图加载格式不正确的程序。
--  作者:狐狸爸爸
--  发布时间:2016/1/15 14:56:00
--  
帮助告诉你不要引用。
5楼也告诉你不要引用。
你为什么还要引用呢?

--  作者:chnfo
--  发布时间:2016/1/15 15:25:00
--  
1、现在我已经去掉了引用。直接把dll复制到了foxtable的安装目录下。
2、在全局代码中做了这个定义
Public Declare Function BS_FT Lib “第三方API.dll" Alias "BS_FT" ( ByVal pid As String , ByVal count As Integer ) As Integer  ‘这个成功提交了
3、新建一个窗口,一个按钮,一个文本框。按钮事件如下

Dim retcode As integer

Dim IPID As String

Dim IPCount As Integer

 

retcode = BS_FT(IPID, IPCount)

If (retcode <> 0) Then

    e.Form.Controls("TextBox1").text = "找到了"

Else

    e.Form.Controls("TextBox1").text = "失败"

End If



结果提示下面的内容:
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

这是为何?
[此贴子已经被作者于2016/1/15 15:26:07编辑过]

--  作者:Hyphen
--  发布时间:2016/1/15 15:49:00
--  
成功提交不代表定义值正确的

Public Declare Function BS_FT Lib “第三方API.dll" Alias "BS_FT" ( ByVal pid As String , ByRef count As Integer ) As Integer

不行再试下面:

Public Declare Function BS_FT Lib “第三方API.dll" Alias "BS_FT" ( ByVal pid As String , ByRef count As byte) As Integer
Dim IPCount(16) As Byte
dim retcode = BS_FT("ASDFGHJK", IPCount(0))

--  作者:chnfo
--  发布时间:2016/1/15 16:12:00
--  
唉,还是不行呀。
直接在命令窗口执行以下

Public Declare Function BS_FT  Lib "ABC_API.dll" Alias "BS_FT " ( ByVal pid As String , byref count As Byte) As Integer  ‘不论是ByVal还是Byref都不行’
Dim retcode As Integer = BS_FT("6B55003D", 0)
Output.Show(retcode )

提示错误是:
编译错误:关键字作为标识符无效    难道count是关键字?
[此贴子已经被作者于2016/1/15 16:14:13编辑过]