以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  DLL文件加载的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=55475)

--  作者:supwork
--  发布时间:2014/8/17 19:47:00
--  DLL文件加载的问题

一个DLL文件在VB6,VC, Delphi中均能正常调用,怎么在FT中就不能加载了?

外部引用后

在进行窗口设计时,要调用这个DLL文件时,显示DLL文件错误不能加载。之后关闭,再次打开项目后。

窗口不能进入了设计 了“未将对象引用设置到对象的实例”

只能 退出了,继续则进入 什么模式窗口了,只能强行退出了。

  

 

现在要完成的代码设置为:

 

Private Sub UpdatePortNameList()
  Dim str1 As String
  Dim Buf As String * GCAL_MAX_LEN_OF_PORTNAME_STRING
  Dim lSize As Long
 
  str1 = ComboPortName.Text
  ComboPortName.Clear
  Buf = Space$(GCAL_MAX_LEN_OF_PORTNAME_STRING)
  If GCal_GetFirstPortName(Buf, GCAL_MAX_LEN_OF_PORTNAME_STRING) <> 0 Then
    Do
      lSize = InStr(Buf, vbNullChar)
      If lSize > 0 Then
        ComboPortName.AddItem Left(Buf, lSize)
      End If
      Buf = Space$(GCAL_MAX_LEN_OF_PORTNAME_STRING)
    Loop Until GCal_GetNextPortName(Buf, GCAL_MAX_LEN_OF_PORTNAME_STRING) = 0
  End If
  If "" <> str1 Then
    ComboPortName.Text = str1
  Else
    ComboPortName.ListIndex = 0
  End If
End Sub

Private Sub RestartDevice()
  If 0 <> DeviceID Then
    GCal_CloseDevice (DeviceID)
  End If
  DeviceID = GCal_OpenDevice(ComboPortName.Text, ComboDeviceDescription.Text, Val(ComboBaudRate.Text))
  DeviceChannel = Val(TextChannel.Text)
  If 0 <> DeviceID Then
    GCal_SetChannel DeviceID, DeviceChannel, 1
  End If
End Sub

Private Sub ComboBaudRate_Change()
  RestartDevice
End Sub

Private Sub ComboBaudRate_Click()
  RestartDevice
End Sub

Private Sub ComboDeviceDescription_Change()
  RestartDevice
End Sub

Private Sub ComboDeviceDescription_Click()
  RestartDevice
End Sub

Private Sub ComboPortName_Change()
  RestartDevice
End Sub

Private Sub ComboPortName_Click()
  RestartDevice
End Sub

Private Sub CommandData_Click()
  AddData
End Sub

Private Sub CommandExit_Click()
  Unload Me
End Sub

Private Sub CommandZero_Click()
  If 0 <> DeviceID Then
    GCal_ZeroChannel DeviceID, DeviceChannel
  End If
End Sub

Private Sub Form_Load()
  DeviceID = 0
  DeviceChannel = 0
  GCal_SetCallBackProc AddressOf OnDataProc
  UpdatePortNameList
 
  ComboDeviceDescription.Clear
  ComboDeviceDescription.AddItem "Auto1"
  ComboDeviceDescription.AddItem "Auto1A"
  ComboDeviceDescription.AddItem "Auto64A"
  ComboDeviceDescription.AddItem "Ack64"
  ComboDeviceDescription.AddItem "Ack64A"
 
  ComboBaudRate.Clear
  ComboBaudRate.AddItem "4800"
  ComboBaudRate.AddItem "9600"
 
  RestartDevice
End Sub

Private Sub Form_Unload(Cancel As Integer)
  GCal_CloseAllDevices
End Sub

Private Sub ListData_Click()

End Sub

Private Sub TextChannel_Change()
  Dim ch1 As Long
  ch1 = Val(TextChannel.Text)
  If ch1 <> DeviceChannel Then
    GCal_SetChannel DeviceID, DeviceChannel, 0
    DeviceChannel = ch1
    GCal_SetChannel DeviceID, DeviceChannel, 1
  End If
End Sub

 

 

 

Global DeviceID As Long
Global DeviceChannel As Long

Public Sub AddData()
  With FormMain
    If "" <> .LabelData.Caption Then
      .ListData.AddItem .LabelData.Caption
      .ListData.ListIndex = .ListData.ListCount - 1
    End If
  End With
End Sub

Public Sub OnDataProc(ByVal ID As Long, ByVal Channel As Long, ByVal Value As Long, ByVal KeyPressed As Byte)
  Dim f As Double
  Dim n1 As Long
  Dim fmt As String
 
  If (ID = DeviceID) And (Channel = DeviceChannel) Then
    f = Val(FormMain.TextMultiplier.Text)
    If 0 = f Then
      f = 1
    End If
    f = f * Value / 100
    n1 = Val(FormMain.TextDecimalDigits.Text)
    fmt = IIf(0 = n1, "0", "0." & String(n1, "0"))
    FormMain.LabelData.Caption = Format$(f, fmt)
    If 0 <> KeyPressed Then
      AddData
    End If
  End If
End Sub

 

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:gcalcommonsharedevice.rar

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:在线检测.foxdb


图片点击可在新窗口打开查看此主题相关图片如下:在线检测.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2014-8-17 21:49:19编辑过]

--  作者:有点甜
--  发布时间:2014/8/17 19:51:00
--  

 你这个dll不是可托管的dll,也就是可以注册使用的,不能直接在foxtable里面直接引用。

 

 对于那些com的dll,你需要先用vs新建一个项目,添加控件,然后会得到dll,在foxtable里面引用这个dll文件。


--  作者:有点甜
--  发布时间:2014/8/17 19:57:00
--  
 看了你的例子,你想表达什么啊,什么代码都没有,调用的代码也没有。
--  作者:supwork
--  发布时间:2014/8/17 21:10:00
--  
DLL引用不了,代码就不能往下写了。这个实例需要从 要引用的GCalCommonShareDevice.dll程序中,接收COM口所取得的数据,真正的代码很简单,直接读取就行。
--  作者:supwork
--  发布时间:2014/8/17 21:11:00
--  

GCalCommonShareDevice.dll 这个引用不了,甜大师能不能帮转换一下,生成FT可以使用的DLL

 

Public Sub OnDataProc(ByVal ID As Long, ByVal Channel As Long, ByVal Value As Long, ByVal KeyPressed As Byte)
  Dim f As Double
  Dim n1 As Long
  Dim fmt As String
 
  If (ID = DeviceID) And (Channel = DeviceChannel) Then
    f = Val(FormMain.TextMultiplier.Text)
    If 0 = f Then
      f = 1
    End If
    f = f * Value / 100
    n1 = Val(FormMain.TextDecimalDigits.Text)
    fmt = IIf(0 = n1, "0", "0." & String(n1, "0"))
    FormMain.LabelData.Caption = Format$(f, fmt)
    If 0 <> KeyPressed Then
      AddData
    End If
  End If
End Sub

 

 

关键需要读取的数据就是 Value 这个变更的值。

[此贴子已经被作者于2014-8-17 21:13:04编辑过]

--  作者:有点甜
--  发布时间:2014/8/17 21:13:00
--  
 你这个GCalCommonShareDevice要怎么调用?调用代码是什么?
--  作者:supwork
--  发布时间:2014/8/17 21:15:00
--  
 

\' GCalCommonShareDevice developments software package. \'

 \' GCalCommonShareDevice开发软件包 \'

 \' GCalCommonShareDevice秨祇硁ン \'

 \' Includes:

 \'  GCalCommonShareDevice.DLL   User interface DLL

 \'  GCalCommonShareDevice.h     Header file for C

 \'  GCalCommonShareDevice.lib   lib file for C

 \'  GCalCommonShareDevice.pas   Unit file for Delphi

 \'  GCalCommonShareDevice.bas   Module file for Visual Basic

 \'  Some protocol processing DLLs

 \'

\'

\' 这里的说明使用了英文、简体中文、繁体中文等。

 \' 如果您的系统不支持其中的某种语言,显示可能会是乱码。

 \' 处理数据的回调过程的原型。

 \' 接收到数据时回调过程将被调用。

 \' ID就是OpenDevice时返回的非0值,每个不同的ID代表一个连接到不同端口的设备。

 \' Channel是多通道设备的通道索引号码,使用单通道设备时Channel为0。

 \' Value是该通道的数值

 \' KeyPressed=TRUE则表示按下了采样键

Global Const GCAL_MAX_LEN_OF_PORTNAME_STRING = 80

Global Const GCAL_MAX_LEN_OF_PRODUCTID_STRING = 80

\' 设置回调过程的地址。

 \' 在一个程序中只需设置一次就行。

 \' 如果返回FALSE则表示发生了错误。

Public Declare Function GCal_SetCallBackProc Lib "GCalCommonShareDevice" (ByVal CallBackProc As Long) As Byte

\' 打开设备。

 \' PortName就是设备所连接的端口名称,比如"COM1"或"USB"。

 \' DeviceDescription可以是产品ID或协议名称,如果是USB口ProtocolName可以为空,这时自动选择连接到USB口的设备。               1

 \' BaudrateValue是波特率值,0表示使用默认值。

 \' 如果成功则返回非0的设备ID,否则返回0。 \'

Public Declare Function GCal_OpenDevice Lib "GCalCommonShareDevice" (ByVal PortName As String, ByVal DeviceDescription As String, ByVal BaudrateValue As Long) As Long

 \' 允许或禁止设备通道。

 \' ID就是欲设置的设备ID。

 \' Channel就是欲设置的通道号。

 \' Enabled为TRUE则该通道被允许,否则禁止。

 \' 如果返回FALSE则表示发生了错误。 \'

Public Declare Function GCal_SetChannel Lib "GCalCommonShareDevice" (ByVal ID As Long, ByVal Channel As Long, ByVal Enabled As Byte) As Byte

\' 清0。

 \' ID就是欲清0的设备ID。

 \' Channel就是欲清0的通道号。

 \' 如果返回FALSE则表示发生了错误。

Public Declare Function GCal_ZeroChannel Lib "GCalCommonShareDevice" (ByVal ID As Long, ByVal Channel As Long) As Byte


\' 所有通道清0。

 \' ID就是欲清0的设备ID。

 \' 如果返回FALSE则表示发生了错误。


Public Declare Function GCal_ZeroAllChannels Lib "GCalCommonShareDevice" (ByVal ID As Long) As Byte

\' 所有设备的所有通道清0。

 \' 如果返回FALSE则表示发生了错误。

 \'Public Declare Function GCal_ZeroAllDeviceChannels Lib "GCalCommonShareDevice" () As Byte

\' 关闭设备。

 \' ID就是欲关闭设备ID。

 \' 如果返回FALSE则表示发生了错误。 \'

Public Declare Function GCal_CloseDevice Lib "GCalCommonShareDevice" (ByVal ID As Long) As Byte

\' 关闭所有打开的设备。

 \' 如果返回FALSE则表示发生了错误。

Public Declare Function GCal_CloseAllDevices Lib "GCalCommonShareDevice" () As Byte

\' 设置使用无线连接的起始通道号及无线连接的最大延迟时间。

 \' ID就是欲设置的设备ID。

 \' Channel是使用无线连接的起始通道号。                                                                                    2

 \' Delay是无线连接的最大延迟时间。

 \' 如果返回FALSE则表示发生了错误。

Public Declare Function GCal_SetWirelessChannel Lib "GCalCommonShareDevice" (ByVal ID As Long, ByVal Channel As Long, ByVal Delay As Long) As Byte

\' 获取可用的第一个端口名称。

 \' Buf用于保存名称。

 \' BufSize是Buf的大小。

 \' 如果返回FALSE则表示没有端口或发生了错误。


Public Declare Function GCal_GetFirstPortName Lib "GCalCommonShareDevice" (ByVal Buf As String, ByVal BufSize As Long) As Byte

\' 获取可用的下一个端口名称。

 \' Buf用于保存名称。

 \' BufSize是Buf的大小。

 \' 如果返回FALSE则表示已经没有下一个端口或发生了错误。

Public Declare Function GCal_GetNextPortName Lib "GCalCommonShareDevice" (ByVal Buf As String, ByVal BufSize As Long) As Byte

\' 获取第一个USB设备的产品ID。

 \' Buf用于保存产品ID。

 \' BufSize是Buf的大小。

 \' 如果返回FALSE则表示没有USB设备或发生了错误。

Public Declare Function GCal_GetFirstUsbProductID Lib "GCalCommonShareDevice" (ByVal Buf As String, ByVal BufSize As Long) As Byte

\' 获取下一个USB设备的产品ID。

 \' Buf用于保存产品ID。

 \' BufSize是Buf的大小。

 \' 如果返回FALSE则表示已经没有下一个USB设备或发生了错误。

Public Declare Function GCal_GetNextUsbProductID Lib "GCalCommonShareDevice" (ByVal Buf As String, ByVal BufSize As Long) As Byte

                                                                                                                            3


--  作者:有点甜
--  发布时间:2014/8/17 21:17:00
--  

 不是给你做了一个例子了吗?你先测试这个例子,如果这个例子可以使用,那么你用这个例子改一下vs的代码使用。

 

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=55154&skin=0

 


--  作者:supwork
--  发布时间:2014/8/17 21:50:00
--  
测试例子可以打开,但运行时不能取得数据
--  作者:有点甜
--  发布时间:2014/8/17 21:54:00
--  
以下是引用supwork在2014-8-17 21:50:00的发言:
测试例子可以打开,但运行时不能取得数据

 

如果你的vs例子可以运行取到数据,那么foxtalbe里面的运行应该是能够取到数据的。打开的那个窗口,设置好以后,就应该能读取到数据的。