各位大哥大姐,你们好,小弟又遇到麻烦了,求救!
现有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  这个运算上。

解决方案 »

  1.   

    CSDN中:
    AddressOf 运算符
    一个一元运算符,它将其后面的过程的地址传递给一个 API 过程,该 API 过程在参数表对应位置中需要一个函数指针。
    语法
    AddressOf procedurename
    必需的 procedurename 指定要传递的地址是哪一个过程的地址。这个过程必须是发出调用命令的工程中的一个标准模块模块里的一个过程。
      

  2.   

    我的Delphi中:
    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;出错!请高手帮我转化一下,谢谢!
      

  3.   

    VC中:
    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,欢迎大家提供意见,谢谢!
      

  4.   

    把那个参数的类型在Delphi当中改用Pointer,然后传参数的时候强行转换为Pointer就好了.
      

  5.   

    unsigned(僵哥(很恐怖,差点在梦中不想醒来)):
    楼上的哥哥,我是刚接触Delphi,能帮着写个例子吗?
    谢谢!
      

  6.   

    你的DLL是用VC写的?>>VC中:DLL文件中:
    >>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
      

  7.   

    然后你的程序这样写,1.先写一个过程procedure pro_aaa();
    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;
    基本上就是这样写法,楼主自行调试一下~~~
      

  8.   

    xixuemao(散分是一种美德~接分是一种责任~)
    您好,在vb中就是调用sub aaa()这个过程,您说的回调函数能给写个示例吗?
    谢谢!
      

  9.   

    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';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;