Foxtable(狐表)用户栏目专家坐堂 → [求助]API调用的问题


  共有4217人关注过本帖树形打印复制链接

主题:[求助]API调用的问题

帅哥哟,离线,有人找我吗?
chnfo
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2204 积分:18140 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]API调用的问题  发帖心情 Post By:2016/1/15 11:22:00 [显示全部帖子]

有一个外部的第三方标准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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2204 积分:18140 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2016/1/15 12:37:00 [显示全部帖子]

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

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


Hyphen的方式不行哟。

函数定义里提示错误:

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



 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2204 积分:18140 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By: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


 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2204 积分:18140 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2016/1/15 14:54:00 [显示全部帖子]

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

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2204 积分:18140 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2204 积分:18140 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2204 积分:18140 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2016/1/15 16:18:00 [显示全部帖子]

第三方提供了VB的例子:

Dim retcode As Long

Dim Ipid As String

Dim Icount As Integer

Dim curline As Integer

 

Private Sub Command1_Click()

    If (Text1.Text = "") Then

        MsgBox "请输入PID"

        Exit Sub

    End If

 

    curline = 0

    List1.Clear

    Ipid = Text1.Text

   

    retcode = BS_FT(Ipid, Icount)

    If (retcode <> 0) Then

        List1.List(curline) = " Failed "

        Exit Sub

    Else

        List1.List(curline) = " Success"

    End If

End Sub

[此贴子已经被作者于2016/1/15 16:18:32编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2204 积分:18140 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2016/1/15 16:44:00 [显示全部帖子]

非常感谢,搞定。

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2204 积分:18140 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2016/1/17 9:41:00 [显示全部帖子]

再请教。第三方dll中,标识为OUT的要用指针?VB中不定义函数能直接用吗?狐表中不定义用不成吧
[此贴子已经被作者于2016/1/17 9:58:55编辑过]

 回到顶部