CPP:
#define DLL_EXPORTS
#include "SatelliteMap.h"
typedef int (__stdcall *CallbackFunc)(int); // option:/GzCallbackFunc g_callback = 0;
SATELLITEMAP_API int __stdcall SetCallbackFunc(CallbackFunc callback)
{
   g_callback = callback;
   return 0;
}
SATELLITEMAP_API int __stdcall UnsetCallbackFunc(void)
{
   g_callback = 0;
   return 0;
}SATELLITEMAP_API int __stdcall DownloadMap(void)
{
int value = 118;
int ret = 0;
g_callback(value);
    return 0;
}
DEF:
EXPORTS
    DownloadMap
SetCallbackFunc
VB模块
Public Declare Function DownloadMap Lib "SatelliteMap.dll" () As Integer
Public Declare Function SetCallbackFunc Lib "SatelliteMap.dll" (ByVal lpCallbackFunc As Long) As Integer
Public Declare Function UnsetCallbackFunc Lib "SatelliteMap.dll" () As Integer'函数体必须放到标准的.BAS模块中
Public Function Download_Complete(ByVal value As Long) As Long
    Dim parameter As String
    parameter = value
    MsgBox "parameter = " + parameter, vbOKOnly, "Callback function"
   
End Function
事件:
Private Sub Command1_Click()
    Dim nSpeed As Integer
    Call SetCallbackFunc(AddressOf Download_Complete)
    
    Call DownloadMap    Call UnsetCallbackFunc
End Sub
此过程已经实现值的回调,但是我现在要把一个字符串传回去,应该怎么改?

解决方案 »

  1.   

    首先,VC 中的 int 对应 VB 中的 Long,Declare 中类型有错误。
    要返回字符串,VB 中将 Download_Complete 的返回值定义为 String 就可以了,VC 中要将 CallbackFunc 的返回值定义为 BSTR。
      

  2.   

    高手们能解答下不?
    Tiger_Zhao 的方法不行啊。急!! 
      

  3.   

    把Public Declare Function DownloadMap Lib "SatelliteMap.dll" () As Integer 
    中的SatelliteMap.dll 设置成绝对路径 试验一下
        看看行不行行的话就是路径的问题不行在找其他原因
      

  4.   

    字符串到底要往那个方向传?VB→VC 还是 VC→VB
      

  5.   

    嘻嘻,这种事情俺还着实干过不少.VC里面声明:extern "C" __declspec(dllexport) long __stdcall FunA( LPSTR strRe );  //strRe为要返回的字符串
    VB里面调用:
    Public Declare Function FunA Lib ".\SatelliteMap.dll" (ByVal strRe As String) As Long
      

  6.   

    ByVal strRe As String虽然声明的是传值,但是字符串的值确实可以改变.
      

  7.   

    是希望通过 Download_Complete 的 Value 参数传递字符串吧。
    VB 中 Public Function Download_Complete(ByVal value As String) As Long 
    VC 中调用 g_callback 时需要给一个 BSTR 类型的参数。
      

  8.   

    同志们,能具体点不?希望通过 Download_Complete 的 Value 参数传递字符串上面的方法不行啊
      

  9.   

    CallbackFunc 怎么定义的,是否已经限定了参数类型?
      

  10.   

    是的。typedef BSTR(__stdcall *CallbackFunc)(char*)
      

  11.   

    C 的 typedef 不熟,大概是 typedef int(__stdcall *CallbackFunc)(BSTR),要与 VB 中的定义一致。
      

  12.   

    修改的程序为
    CPP: 
    #define DLL_EXPORTS 
    #include "SatelliteMap.h" 
    typedef BSTR(__stdcall *CallbackFunc)(char*); // option:/Gz CallbackFunc g_callback = 0; 
    SATELLITEMAP_API BSTR__stdcall SetCallbackFunc(CallbackFunc callback) 

       g_callback = callback; 
       return 0; 

    SATELLITEMAP_API BSTR__stdcall UnsetCallbackFunc(void) 

       g_callback = 0; 
       return 0; 
    } SATELLITEMAP_API int __stdcall DownloadMap(void) 

    char* value=NULL;
    strcpy(value,"Hello");
    g_callback(value);
        return 0;

    DEF: 
    EXPORTS 
        DownloadMap 
        SetCallbackFunc 
        UnsetCallbackFunc
    VB模块 
    Public Declare Function DownloadMap Lib "SatelliteMap.dll" () As Integer 
    Public Declare Function SetCallbackFunc Lib "SatelliteMap.dll" (ByVal lpCallbackFunc As Long) As Integer 
    Public Declare Function UnsetCallbackFunc Lib "SatelliteMap.dll" () As Integer '函数体必须放到标准的.BAS模块中 
    Public Function Download_Complete(ByVal value As string) As Long 
        
        MsgBox "value= " + value, vbOKOnly, "Callback function" 
        
    End Function 
    事件: 
    Private Sub Command1_Click() 
        Dim nSpeed As Integer 
        Call SetCallbackFunc(AddressOf Download_Complete) 
         
        Call DownloadMap     Call UnsetCallbackFunc 
    End Sub
      

  13.   

    char* value=NULL; 
    strcpy(value,"Hello"); 这两句就足以引起崩溃了,不信你做个最小程序试试!
    请仔细阅读 strcpy 的 MSDN 说明。
      

  14.   

    嘿嘿,char s[100];
        //int value=118;
    char* value=s;

    strcpy(value,"Hello");
    改成这样
      

  15.   

    报Copplie error
    Expected End Function
      

  16.   

    VB 中的 String 对应 VC 的 BSTR,char* 是不行的。
      

  17.   

    上面的错误是我写错了,还是崩溃啊。 
    到这里
    cpp
    char* value=s; strcpy(value,"Hello"); 
    MessageBox(0,value,0,0);vb
    MsgBox "value= " + value, vbOKOnly, "Callback function"  能弹出“Hello”随后崩溃
      

  18.   

    typedef int (__stdcall *CallbackFunc)(BSTR);
    已经强制类型转换了。
    g_callback((BSTR)value);继续崩溃
      

  19.   

    >:-(
    BSTR 和 char* 是不同的,请先将基础知识搞清楚!
      

  20.   

    嘿嘿。新手。
    那char* value=s;  strcpy(value,"Hello");  
    MessageBox(0,value,0,0); 定义成BSTR 
    怎么得到字符串呢
      

  21.   


    Option Explicit
    Private Declare Sub CopyMemory Lib "kernel32" _
                    Alias "RtlMoveMemory" (Destination As Any, _
                                           Source As Any, _
                                           ByVal Length As Long)Private Sub Command1_Click()
    Dim s1(5) As Byte
    s1(0) = Asc("a")
    s1(1) = 0
    s1(2) = Asc("a")
    s1(3) = 0
    s1(4) = Asc("s")
    s1(5) = 0
    Dim s2 As String
    s2 = Space(255)
    CopyMemory ByVal StrPtr(s2), s1(0), UBound(s1) + 1
    Debug.Print s2
    End Sub一个简单例子,c语言中的字符串就像s1哪个字节数组,一个字节,就是一个字符。而VB中的字符串是两个字节一个字符(UNICODE)
    C语言中的字符串的指针就是第一个字符的指针,也就是字节数组的指针;而VB中的字符串的指针(字符串所表示的实际字符)和字符串变量的指针根本不是一回事儿!varptr(s2)和strptr(s2),根本不同。
      

  22.   

    以上基本上就是BSTR 和 char* 的不同
      

  23.   

    VC,VB我都很熟。
    VC里可以传char*,
    VB 中 Public Function Download_Complete(ByVal value As String) As Long
    value =  StrConv(value, vbUnicode)就能将收到的char*转成VB里的String了。
      

  24.   

    上面“weiym”的方法不行啊。StrConv找不到这个函数?
    我要求value得到一个字符串传回去。有具体的方法没有?
    在22楼里面要改些什么地方能解决。