各位大哥大姐,你们好,小弟又遇到麻烦了,求救!
现有VB程序,转化为Delphi,如下:
vb中用到的两个动态连接库:
Public Declare Function CAN_Recv Lib "k8110.dll" (ByVal iIndex As Long, ByRef ibyte As Any, ByVal rtimeout As Long) As Boolean
Declare Function CAN_Enable_Interrupt Lib "k8110.dll" (ByVal iIndex As Long, ByVal kind As Long, ByVal pf As Long) As Boolean
要转换的语句:Call CAN_Enable_Interrupt(0, 2, AddressOf aaa)Sub aaa()
Dim j As Long
Dim i As Byte
Dim rxdlc As Byte
If (CAN_Recv(mindex, canbuff(0), 20)) Then
.
.
.
End Sub
问题出现在AddressOf 这个运算上。
现有VB程序,转化为Delphi,如下:
vb中用到的两个动态连接库:
Public Declare Function CAN_Recv Lib "k8110.dll" (ByVal iIndex As Long, ByRef ibyte As Any, ByVal rtimeout As Long) As Boolean
Declare Function CAN_Enable_Interrupt Lib "k8110.dll" (ByVal iIndex As Long, ByVal kind As Long, ByVal pf As Long) As Boolean
要转换的语句:Call CAN_Enable_Interrupt(0, 2, AddressOf aaa)Sub aaa()
Dim j As Long
Dim i As Byte
Dim rxdlc As Byte
If (CAN_Recv(mindex, canbuff(0), 20)) Then
.
.
.
End Sub
问题出现在AddressOf 这个运算上。
AddressOf 运算符
一个一元运算符,它将其后面的过程的地址传递给一个 API 过程,该 API 过程在参数表对应位置中需要一个函数指针。
语法
AddressOf procedurename
必需的 procedurename 指定要传递的地址是哪一个过程的地址。这个过程必须是发出调用命令的工程中的一个标准模块模块里的一个过程。
function CAN_Recv (const iIndex :Longint; const ibyte;rtimeout :Longint):boolean;stdcall;external'k8110.dll';
Function CAN_Enable_Interrupt (const iIndex :Longint; kind :Longint; const pf: Longint):boolean ;stdcall;external'k8110.dll';VAR
tt:^longint;
tt:=@aaa;\\编译出错!
CAN_Enable_Interrupt(0, 2,tt^);
procedure TForm1.aaa();
begin
.
.
.
CAN_Recv(mindex, canbuff(0), 20);
.
.
.
end;出错!请高手帮我转化一下,谢谢!
DLL文件中:
extern "C" __declspec(dllexport) BOOL __stdcall CAN_Enable_Interrupt(ULONG mindex,int kind,void (*pf)());VC中使用:
public:
void (*pf)();
void CK8110TestDlg::OnIsrReceive()
{
CString strtmp;
m_ctrlIndex.GetWindowText(strtmp); CAN_Enable_Interrupt(atoi(strtmp),2,pf); GetDlgItem(IDC_CHECK_RECEIVE)->EnableWindow(FALSE);
GetDlgItem(IDC_ISR_RECEIVE)->EnableWindow(FALSE);
GetDlgItem(IDC_ISR_DISABLE)->EnableWindow(TRUE);
}VB和VC都可以成功,就差Delphi,欢迎大家提供意见,谢谢!
楼上的哥哥,我是刚接触Delphi,能帮着写个例子吗?
谢谢!
>>extern "C" __declspec(dllexport) BOOL __stdcall CAN_Enable_Interrupt(ULONG mindex,int >>kind,void (*pf)());最后一个参数是函数指针,所以delphi中也要声明一个函数指针,typedef
TDllfun = procedure;//相当于VC的 void (*pf)();var
//Form1: TForm1; Function CAN_Enable_Interrupt (iIndex :DWORD; kind :integer; pf: TDllfun):BOOL ;stdcall;external'k8110.dll';//注意参数的类型VC的ULONG,在delphi中用DWORD,不必用Longint;
//VC中的BOOL,在delphi中,不要用boolean,而改为BOOL
begin
//...
end;2.修改你的函数:
procedure TForm1.aaa();VAR
tt:TDllfun;//定义过程指针begin
tt:=@pro_aaa;//获取上面过程的pro_aaa的指针
CAN_Enable_Interrupt(0, 2,tt);.
.
.
CAN_Recv(mindex, canbuff(0), 20);
.
.
.
end;
基本上就是这样写法,楼主自行调试一下~~~
您好,在vb中就是调用sub aaa()这个过程,您说的回调函数能给写个示例吗?
谢谢!
function CAN_Enable_Interrupt(const iIndex: Longint; kind: Longint; const pf: Longint): boolean; stdcall; external 'k8110.dll';procedure aaa(); stdcall;
begin
// CAN_Recv(mindex, canbuff(0), 20);
end;procedure TForm1.BitBtn1Click(Sender: TObject);
begin
CAN_Enable_Interrupt(0, 2, Integer(@aaa));
end;