C++动态库
//------------------------------------
#define __DLLEXP extern "C" __declspec(dllexport)
typedef void(__stdcall*MDCallBack)(int &a, int &b);__DLLEXP int __stdcall  sum(int a,int b,MDCallBack pcall){
   int c=a*b,d=a-b;
   pcall(c,d);
   return a+b;
}
//------------------------------------------//vb 中是这样调用的,怎么也不成功,不知道要怎么才能取得a b的值
Private Declare Function sum Lib "cdll.dll" (ByVal a As Integer, ByVal b As Integer, ByVal lpCallBack As Long) As IntegerFunction MyCallBack(ByVal a As Integer, ByVal b As Integer) As Integer
    Text3.Text = a
    Text4.Text = b
End FunctionPrivate Sub Command1_Click()
Dim t1 As Integer
t1 = sum(12, 22, MyCallBack)End Sub

解决方案 »

  1.   

    c++ 中这样调用就行int a= sum(12,22,(MDCallBack) cCallBack);
     ShowMessage(a);
      

  2.   

    MyCallBack写在标准模块里(即*.bas里),并且为Public,然后代码修改如下:
    t1 = sum(12, 22, AddressOf MyCallBack)
      

  3.   

    '窗口中代码
    Private Declare Function sum Lib "cdll.dll" (ByVal a As Long, ByVal b As Long, ByVal lpCallBack As Long) As Long
    Private Sub Command1_Click()
    Dim t1 As Integer
    t1 = sum(12, 22, MyCallBack)
    End Sub
    '模板中代码
    Public Function MyCallBack(ByVal a As Long, ByVal b As Long)
       msg = MsgBox(a)
    End Function程序通过了,但显示数据不对,并且显示数据后直接退出。
    请各位大虾们不吝赐教。
      

  4.   

    int &a, int &b 在vb 中要申明成什么类型? 是不是我的类型搞错了。
      

  5.   

    提示 
    运行时错误 '91'
    未设置对象变量或 with block 变量。然后就直接退出程序了。
      

  6.   

    Public sub MyCallBack(ByVal a As Long, ByVal b As Long)
      msg = MsgBox(a)
    End submsg 是什么东东?定义了没?
      

  7.   

    Public Declare Function sum Lib "cdll.dll" (ByVal a As Long, ByVal b As Long, ByVal lpCallBack As Long) As Long
    Public Function mCallBack(ByVal c As Long, ByVal d As Long)
      MsgBox (c)
       MsgBox (d)
    End Function
    Private Sub Command1_Click()
    Dim t1 As Integer
    t1 = sum(6, 6, AddressOf mCallBack)
    MsgBox (t1)
    End Sub
      

  8.   

    第一个参数传回的是正确的,第二个就不对了。
    然后就报运行时错误 '91'
    未设置对象变量或 with block 变量。然后就直接退出程序了。
      

  9.   

    C++ 中 int &a 是引用传递只以C++中起做用,标准的API 调用是没有引用传递的
     如果你vb中这样定义的函数
    Function MyCallBack(ByVal a As Integer, ByVal b As Integer) As Integer
    那么C++就该这么定义它的函数指针
    typedef int(__stdcall *MDCallBack)(int a, int b);如果你vb中这样定义的函数
    Function MyCallBack(ByRef a As Integer, ByRef b As Integer) As Integer
    那么C++就该这么定义它的函数指针
    typedef int(__stdcall *MDCallBack)(int *a, int *b);ByVal 是值传递 ByRef 是地址传地
      

  10.   

    还有 函数取地址运算符是  AddressOf  我看你也没用啊,你直接写函数名能行吗?
      

  11.   


    #define __DLLEXP extern "C" __declspec(dllexport)
    typedef void(__stdcall*MDCallBack)(int a, int b);__DLLEXP int __stdcall sum(int a,int b,MDCallBack pcall){
      int c=a*b,d=a-b;
      pcall(c,d);
      return a+b;
    }Option ExplicitPrivate Declare Function sum Lib "ddlSum.dll" Alias "_sum@12" _
                  (ByVal a As Long, ByVal b As Long, ByVal lpCallBack As Long) As LongPublic Sub pSum()
        sum 10, 5, AddressOf pcall
    End SubPrivate Function pcall(ByVal a As Long, ByVal b As Long) As Long
      MsgBox "a:" & CStr(a) & "b:" & CStr(b)
      pcall = 2
    End Function