7,763
社区成员
发帖
与我相关
我的任务
分享
#ifndef _HW_CHAR_DEFINED
#define _HW_CHAR_DEFINED
typedef char HW_CHAR;
#endif // _HW_CHAR_DEFINED
#ifndef _HW_LPCSTR_DEFINED
#define _HW_LPCSTR_DEFINED
typedef const HW_CHAR* HW_LPCSTR;
#endif // _HW_LPCSTR_DEFINED
这是EZLINK_RECV_PROC的定义
#ifndef _EZLINK_RECV_PROC_DEFINED
#define _EZLINK_RECV_PROC_DEFINED
// void CALLBACK EZLinkRecvProc(HEZLINK hLink, HW_INT64 llTaskID, int iIndex, double dTime, const double* lpValue, bool bFinal, DWORD dwParam);
typedef void (CALLBACK* EZLINK_RECV_PROC)(HEZLINK hLink, HW_INT64 llTaskID, int iIndex, double dTime, const double* lpValue, bool bFinal, DWORD dwParam);
#endif // _EZLINK_RECV_PROC_DEFINED
typedef struct{} *HEZLINK;
EZLINK_API void EZLink_Disconnect(IN HEZLINK hLink)
像上面这个函数的参数以为这个类型,应该怎么声明
Private Declare Function EZLink_Connect Lib "EasyLink.dll" ( _
ByVal lpszServerName As String, _
ByVal wServerPort As Integer, _
ByVal lpszuser As String, _
ByVal lpszPassword As String, _
ByVal llTaskID_Low As Long, _
ByVal llTaskID_Hig As Long, _
ByVal proc As Long, _
ByVal dwProcParam As Long, _
ByVal lpszLocalIP As String) As Long
Option Explicit
' * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Private Sub Main(): End Sub '请不要修改或删除这一行!!!
' * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Private Function DllMain(ByVal hModule As Long, _
ByVal ul_reason_for_call As Long, _
ByVal lpReserved As Long) As Long
DllMain = 1
End Function
' 导出函数: 在函数中用消息显示接收到的参数值
Private Function TestCall(ByVal hWnd As Long, ByVal m As Double) As Long
Call MessageBox(hWnd, m, "DLL 消息", 64&)
TestCall = 0&
End Function
然后另外创建一个标准EXE工程,调用这个DLL的API进行测试。
其中主要的函数声明如下:
Private Declare Function TestA Lib "Test.dll" Alias "TestCall" ( _
ByVal hWnd As Long, ByVal v As Double) As Long
Private Declare Function TestB Lib "Test.dll" Alias "TestCall" ( _
ByVal hWnd As Long, _
ByVal pa As Long, ByVal pb As Long) As Long
对第二种声明形式的调用测试代码如下:
Private Sub Command2_Click()
Dim w As LARGINT
Dim v As Double
v = Val(txtNum.Text)
Call MsgBox("输入数据:" & vbLf & v, 64)
Call MemCopy(8&, w, v)
Call TestB(Me.hWnd, w.LowLong, w.HigLong)
End Sub
虽然上面 TestB 这个声明形式,跟“API参数原型”表面上看起来“完全是牛头不对马嘴”的!
不但参数个数不相符,而且类型也是完全不同的。
但是,事实证明,API中却是正确获取了传入的数据。
这个拆分传递的方法对于“Double参数”有效,对于INT64类型的参数其实照样有效!
dll我已经编译好了,跟测试工程一起打包传到了我的百度网盘中。
楼主可以下载来看看,分享链接7天后失效。
链接: http://pan.baidu.com/s/1skZhqqT
密码: qc68
m_hLink = EZLink_Connect(m_szServerIP, 3965, vbNullString, vbNullString, m_llTalkID.LowLong, m_llTalkID.HigLong, 0&, 0&, m_szLocalIP)
m_hLink = EZLink_Connect(ByVal StrPtr(m_szServerIP), 3965, vbNullString, vbNullString, m_llTalkID.HigLong, 0&, 0&, ByVal StrPtr(m_szLocalIP))
#ifdef _MSC_VER
#ifndef _HW_UINT64_DEFINED
#define _HW_UINT64_DEFINED
typedef unsigned __int64 HW_UINT64;
#endif // _HW_UINT64_DEFINED
#ifndef _HW_INT64_DEFINED
#define _HW_INT64_DEFINED
typedef __int64 HW_INT64;
#endif // _HW_INT64_DEFINED
#endif // _MSC_VER
我试了只传32位的话还是提示错误49,但是我联系给我dll文件的人他说是用stdcall的
有什么方法可以检验这个是什么调用约定的吗?我看网上说如果不是stdcall的话需要做个封装dll,但感觉过程太复杂了,不会弄。。。。Private Declare Function EZLink_Connect Lib "EasyLink.dll" ( _
ByVal lpszServerName As String, _
ByVal wServerPort As Integer, _
ByVal lpszUser As String, _
ByVal lpszPassword As String, _
ByVal llTaskID_Low As Long, _
ByVal llTaskID_Hig As Long, _
ByVal proc As Long, _
ByVal dwProcParam As Long, _
ByVal lpszLocalIP As Long) As Long
Private Type LARGINT
LowLong As Long
HigLong As Long
End Type
' 调用示例:
Private Sub Command1_Click()
Dim m_llTalkID As LARGINT
Dim m_hLink As Long
' 注意 INT64数据的赋值:
' 假设: llTaskID = &H11223344AABBCCDD ← 64bit整数
m_llTalkID.LowLong = &HAABBCCDD
m_llTalkID.HigLong = &H11223344
m_hLink = EZLink_Connect("ServerName", 3965, "UserName", "PassWord", _
m_llTalkID.LowLong, m_llTalkID.HigLong, 0&, 0&, 0&)
End Sub