全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2015
推到 Plurk!
推到 Facebook!

关于调用VC写的DLL调用失败的问题

答題得分者是:Skyer
wxc189
一般會員


發表:4
回覆:7
積分:2
註冊:2002-11-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-28 20:02:19 IP:61.145.xxx.xxx 未訂閱
我有一个CASIO DT900采集器,想从采集器上把数据给采集出来,现在有一个VB写的程式,调用那个VC的DLL会成功,而我改用DELPHI来调用,却是失败的, 有人帮忙看看吗? ps:这里不能上传档案,要是能帮忙的话,给我一个EMail地址我把VB源码和DLL文件传过去。 --*************-- 蝸牛小混混 --*************--
------
鬱悶中.........
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-07 18:28:49 IP:220.130.xxx.xxx 未訂閱
那是因為 VC 通常Export 函數前面會加上 _, 後面會加上 @數字 像這樣 _Func@8 以至於 Delphi 無法使用,但有一法可行,使用 index, 抓序號 procedure Func(a: Integer); external 'xx.dll' index 23; 序號,可以用 tdump 來找 tdump -em xx.dll -- Regards, Skyer
------
--
Regards,
Skyer
wxc189
一般會員


發表:4
回覆:7
積分:2
註冊:2002-11-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-11 08:09:05 IP:61.145.xxx.xxx 未訂閱
Skyer 你好,是这样的,我可以调用DLL的函数,只是不能正确的使用 下面是VB的一些代码,DLL.bas Attribute VB_Name = "Module3" Option Explicit Public Type INITTBL speed As Long '4:19200bps length As Long '0:8bit parity As Long ' sbit As Long '1:1bit ptout As Long ctout As Long cretry As Long stopkey1 As Long stopkey2 As Long End Type Public Type CINFTBL htid As String * 6 htdmy As String * 2 adv As Long fileno As Long filesize As Long jobcmd As Long datatype As Long End Type Public Declare Function hst_idtblclr Lib "hostcm32.dll" () As Integer '清除ID表 Public Declare Function hst_idtbladd Lib "hostcm32.dll" (ByVal iddata As String) As Integer '清除ID表 Public Declare Function hst_open Lib "hostcm32.dll" (ByVal chno As Long, initab As INITTBL) As Integer '清除ID表 Public Declare Function hst_close Lib "hostcm32.dll" () As Integer '清除ID表 Public Declare Function hst_polling Lib "hostcm32.dll" (recno As Long, ByVal ioboxno As Long) As Integer '轮寻 Public Declare Function hst_idtblgetidno Lib "hostcm32.dll" () As Integer '清除ID表 Public Declare Function hst_getcinffirst Lib "hostcm32.dll" (inftab As CINFTBL) As Integer '清除ID表 Public Declare Function hst_getcinfnext Lib "hostcm32.dll" (inftab As CINFTBL) As Integer '清除ID表 Public Declare Function hst_filerecv Lib "hostcm32.dll" (ByVal pname As String, inftab As CINFTBL) As Integer '清除ID表 Public Declare Function hst_filesend Lib "hostcm32.dll" (ByVal pname As String, inftab As CINFTBL) As Integer '清除ID表 Public Declare Function hst_disconnect Lib "hostcm32.dll" (ByVal mode As Long, inftab As CINFTBL) As Integer '清除ID表 Public Declare Function hst_idtblgetid Lib "hostcm32.dll" (ByVal recno As Long, ByVal iddata As String) As Integer '轮寻 调用的代码 VERSION 5.00 Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "Comdlg32.ocx" Begin VB.Form frmmain Caption = "调用动态库通讯" ClientHeight = 3195 ClientLeft = 60 ClientTop = 345 ClientWidth = 4680 LinkTopic = "Form1" ScaleHeight = 3195 ScaleWidth = 4680 StartUpPosition = 3 '窗口缺省 Begin VB.Frame Frame1 Caption = "选择使用的串口" Height = 1455 Left = 2400 TabIndex = 3 Top = 120 Width = 2175 Begin VB.OptionButton Option1 Caption = "com1" Height = 495 Left = 240 TabIndex = 5 Top = 360 Value = -1 'True Width = 1815 End Begin VB.OptionButton Option2 Caption = "com2" Height = 495 Left = 240 TabIndex = 4 Top = 840 Width = 1815 End End Begin MSComDlg.CommonDialog CommonDialog1 Left = 2880 Top = 2040 _ExtentX = 847 _ExtentY = 847 _Version = 393216 End Begin VB.CommandButton Command3 Caption = "退出" Height = 735 Left = 360 TabIndex = 2 Top = 2040 Width = 1815 End Begin VB.CommandButton Command2 Caption = "接收文件" Height = 735 Left = 360 TabIndex = 1 Top = 1080 Width = 1815 End Begin VB.CommandButton Command1 Caption = "下传文件" Height = 735 Left = 360 TabIndex = 0 Top = 120 Width = 1815 End Begin VB.Label Label1 AutoSize = -1 'True Height = 180 Left = 2520 TabIndex = 6 Top = 1800 Width = 90 End End Attribute VB_Name = "frmmain" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Public Fname As String Private Sub Command1_Click() Dim Port As Integer Dim inftbl As CINFTBL Dim lcp As INITTBL Dim iddata As String Dim ret As Integer Dim time1 As Long Dim i As Double Dim pollret As Integer Dim DataPath As String If Option1.Value = True Then Port = 0 '0表示com1口,1表示com2口 Else Port = 1 End If '以下参数为默认参数,请不要修改 inftbl.htid = "&&&&&&" inftbl.jobcmd = 0 lcp.length = 0 lcp.ptout = 100 lcp.ctout = 1000 lcp.cretry = 99 lcp.stopkey1 = 2 lcp.stopkey2 = 0 lcp.speed = 4 lcp.parity = 0 lcp.sbit = 1 On Error GoTo ErrHandler '设置过滤器。 CommonDialog1.CancelError = True CommonDialog1.Filter = "all Files (*.*)|*.*" '指定缺省过滤器。 CommonDialog1.FilterIndex = 1 '显示“打开”对话框 CommonDialog1.InitDir = App.Path CommonDialog1.ShowOpen '调用打开文件的过程。 Fname = CommonDialog1.FileName If Dir(Fname) = "" Then i = MsgBox(Fname & Chr(13) & "这个文件不存在", vbInformation vbOKOnly, "文件打开") Exit Sub End If FileCopy Fname, App.Path & "\ware.txt" DataPath = App.Path & "\ware.txt" iddata = "&&&&&&" ret = hst_idtblclr() '清除ID表 iddata = "&&&&&&" ret = hst_idtbladd(iddata) '加入一个可通讯的手持机ID号,"&&&&&&"表示所有手持机 If ret <> 0 Then MsgBox "严重错误:加入ID号错误!!!", 16, "上海鸣泽" End End If ret = hst_open(Port, lcp) '打开通讯端口 If ret <> 0 Then i = MsgBox("严重错误:打开通讯口错误,请重设通讯口或选择取消退出应用程序后关机重启动!!!", 17, "上海鸣泽") If i = 2 Then End End If Exit Sub End If time1 = Timer() Do pollret = hst_polling(1, 1) '轮寻端口 Loop Until Timer > time1 5 Or pollret > 0 If pollret > 0 Then '大于零表示轮寻到端口有数据发到 ret = hst_getcinffirst(inftbl) '取通讯信息头 If ret = 0 Then '取到信息 If inftbl.jobcmd = 1 Then 'inftbl.jobcmd=1 表示下传文件,inftbl.jobcmd=0 表示上传文件 ' DataPath = "c:\data.txt" '指定下传的一个文件或一个目录 inftbl.fileno = 1 '指定下传的文件数,如上面的datapth为一个目录则为此目录下的所有文件数 inftbl.filesize = FileLen(DataPath) '指定的下传的文件大小,如上面的datapth为一个目录则为此目录下的所有文件的大小总和 frmmain.Label1.Caption = "卡西欧终端数据更新..." ret = hst_filesend(DataPath, inftbl) '将指定的文件下传到手持机上,如上面的datapth为一个目录则为此目录下的所有文件下传到手持机中 If ret = 0 Then MsgBox "卡西欧终端数据更新 成功!!!", 64, "上海鸣泽" Else MsgBox "卡西欧终端数据更新 错误!!!", 64, "上海鸣泽" End If frmmain.Label1.Caption = "" End If End If Else MsgBox "传输错误:请检查连线、通迅座和终端是否正常!!!", 16, "上海鸣泽" End If ret = hst_disconnect(1, inftbl) '关闭通讯连接 ret = hst_close() '关闭通讯端口 If ret <> 0 Then MsgBox "严重错误:关闭通讯口 错误!!!", 16, "上海鸣泽" End End If Exit Sub ErrHandler: '用户按“取消”按钮。 Exit Sub End Sub Private Sub Command2_Click() Dim Port As Long Dim Path As String Dim UploadPath As String Dim inftbl As CINFTBL Dim lcp As INITTBL Dim ret As Integer Dim iddata As String Dim pollret As Integer On Error Resume Next If Option1.Value = True Then Port = 0 '0表示com1口,1表示com2口 Else Port = 1 End If Path = App.Path & "\temp" UploadPath = Path & "\" '指定接收上传文件的目录 If Dir(Path, vbDirectory) = "" Then MkDir (Path) '自动生成上传文件目录 End If '以下参数为默认参数,请不要修改 inftbl.htid = "&&&&&&" inftbl.jobcmd = 0 lcp.length = 0 lcp.ptout = 100 lcp.ctout = 1000 lcp.cretry = 99 lcp.stopkey1 = 2 lcp.stopkey2 = 0 lcp.speed = 4 lcp.parity = 0 lcp.sbit = 1 iddata = "&&&&&&" ret = hst_idtblclr() '清除ID表 iddata = "&&&&&&" ret = hst_idtbladd(iddata) '加入一个可通讯的手持机ID号,"&&&&&&"表示所有手持机 If ret <> 0 Then MsgBox "加入ID号错误", 16, "上海鸣泽" Exit Sub End If ret = hst_open(Port, lcp) '打开通讯端口 If ret <> 0 Then MsgBox "打开通讯口错误!!", 16, "上海鸣泽" Exit Sub End If pollret = hst_polling(1, 1) '轮寻端口,此处只轮寻一次,而在下传文件处的程序则 '可以在一个时间段内轮寻,可根据具体情况选择使用那一种 If pollret > 0 Then '大于零表示轮寻到端口有数据发到 ret = hst_getcinffirst(inftbl) '取通讯信息头 If ret = 0 Then '取到信息 If inftbl.jobcmd = 0 Then 'inftbl.jobcmd=1 表示下传文件; 'inftbl.jobcmd=0 表示上传文件 '可根据实际情况将上传或下传的程序合成到一块,由 '此值来判断是上传还是下传 frmmain.Label1.Caption = "卡西欧终端上传数据..." ret = hst_filerecv(UploadPath, inftbl) '将手持机指定的文件上传到指定接收的一个目录 If ret = 0 Then MsgBox "卡西欧终端上传数据 成功", 64, "上海鸣泽" FileCopy UploadPath & "wareh.txt", Fname Kill UploadPath & "wareh.txt" End If frmmain.Label1.Caption = "" Else MsgBox "卡西欧终端数据上传 错误", 16, "上海鸣泽" End If End If Else MsgBox "传输错误:请检查连线、通迅座和终端是否正常!!!", 16, "上海鸣泽" End If ret = hst_disconnect(1, inftbl) '关闭通讯连接 ret = hst_close() '关闭通讯端口 If ret <> 0 Then MsgBox "关闭通讯口 错误", 16, "上海鸣泽" End End If End Sub Private Sub Command3_Click() Unload Me End Sub --*************-- 蝸牛小混混 --*************--
------
鬱悶中.........
系統時間:2024-05-05 18:15:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!