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
此过程已经实现值的回调,但是我现在要把一个字符串传回去,应该怎么改?
#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
此过程已经实现值的回调,但是我现在要把一个字符串传回去,应该怎么改?
要返回字符串,VB 中将 Download_Complete 的返回值定义为 String 就可以了,VC 中要将 CallbackFunc 的返回值定义为 BSTR。
Tiger_Zhao 的方法不行啊。急!!
中的SatelliteMap.dll 设置成绝对路径 试验一下
看看行不行行的话就是路径的问题不行在找其他原因
VB里面调用:
Public Declare Function FunA Lib ".\SatelliteMap.dll" (ByVal strRe As String) As Long
VB 中 Public Function Download_Complete(ByVal value As String) As Long
VC 中调用 g_callback 时需要给一个 BSTR 类型的参数。
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
strcpy(value,"Hello"); 这两句就足以引起崩溃了,不信你做个最小程序试试!
请仔细阅读 strcpy 的 MSDN 说明。
//int value=118;
char* value=s;
strcpy(value,"Hello");
改成这样
Expected End Function
到这里
cpp
char* value=s; strcpy(value,"Hello");
MessageBox(0,value,0,0);vb
MsgBox "value= " + value, vbOKOnly, "Callback function" 能弹出“Hello”随后崩溃
已经强制类型转换了。
g_callback((BSTR)value);继续崩溃
BSTR 和 char* 是不同的,请先将基础知识搞清楚!
那char* value=s; strcpy(value,"Hello");
MessageBox(0,value,0,0); 定义成BSTR
怎么得到字符串呢
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),根本不同。
VC里可以传char*,
VB 中 Public Function Download_Complete(ByVal value As String) As Long
value = StrConv(value, vbUnicode)就能将收到的char*转成VB里的String了。
我要求value得到一个字符串传回去。有具体的方法没有?
在22楼里面要改些什么地方能解决。