我已经试了一些方法都不行,请高手帮帮忙吧:)
我在VC中的声明是:
int __stdcall a (void * ss,char bb[],);
在VB中的声明是:
Private Declare Function a Lib "test.dll" (ByVal ss As Long, _
ByVal bb As String ) As Long
调用是:
j = a(ss, bb)
我在VC中的声明是:
int __stdcall a (void * ss,char bb[],);
在VB中的声明是:
Private Declare Function a Lib "test.dll" (ByVal ss As Long, _
ByVal bb As String ) As Long
调用是:
j = a(ss, bb)
ByVal bb As String ) As Long既然 ss 给的是指针,就是传址。
char*temp---->BSTR temp
否则vb无法接受数据然后使用vb的varptr方法,以下是我写的一个这个是vb调用vc的例子,反过来也是:
Public Function Read(ByVal strFileName As String) As Boolean
Dim ptr As Long
On Error Resume Next
ptrDicom = VarPtr(DataStruct)
VCReadFile "E:\Projection\c++6\AAA\" & strFileName, ptr
Read = True
If Err.Number <> 0 Then
Read = False
End If
End Function注意ptr的类型,DataStruct是你在vb的结构,然后将其传入VCReadFile,就可watch出有数据传入
这个我已经告诉不少像你一样的需要互操作的网友,验证是正确的,但是有一点你要注意,就是要如果以后升级到.NET的话,就可能有队varptr的使用要改变形式
vb中仍然用byval bb as string*4(假设传出字符串为4个字母)。
但是在VC中调试时仍然存在错误:
User breakpoint callde from code at 0x77f813b1
请帮忙分析一下:)
int __stdcall a (DWORD hwnd,其他参数)
{...你处理代码
sendmessage (hwnd,wm_copydata,blen,pRst);其中pRst 为所传替的数据的指针,blen 为数据的长度
}
在VB中利用 子类获取 wm_copydata 消息.然后
dim s() as byte
redim s(blen)
copymemory sptr(s),byval lparam,wparam
看看可以不
ByVal bb As long) As LongDim s As Strings = StrConv("abcd",vbFromUnicode)
a LenB(s), StrPtr(s)
你是不是在告诉我怎样传入字符串,呵呵,我是想从VC的Dll中传出字符串。还是谢谢你!To: limitworld(黑色幽灵)
我用的是Dll,请问,可以用sendmessage 吗?
或者建立PIPE,或建立内存影射文件,其他方法我不知道.
还是谢谢了,你的这种方法我会记下的,以备以后用的着:)
cstring strtemp;
strtemp=(L_CHAR *)ShowValue(...)
a=strTemp.AllocSysString();
你说的方法我试了,可是还是传不出字符串啊!我把字符串变成byte型传出时,就可以读出来,不过对汉字是不好用的(VB和VC中对于同一个汉字转化成的byte值是不同的)。谢谢你的帮忙,我也不知道什么地方有问题啊!
您的意思是不是:在VB中byref方式传一个字符串,在VC中用 char*接收,然后赋值给char*,再传出来就可以了。我试过这种方式,不能传出来。我个人也认为,这不是一个复杂的问题,而且肯定能实现的,可是在实际用的时候就是传不出来,呵呵,有些上火啊。
请问 strtemp=(L_CHAR *)ShowValue(...)
这句的作用是什么,编译出错L_CHAR *、ShowValue不识别,是不是要加头啊?
我也给您发了一条留言,不知您有没有看到。
另外,这种方法可以传汉字吗?
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private Declare Function a Lib "test.dll" (ByRef ss As Long, ByRef bb() As Byte) As LongPrivate Sub Command1_Click()
Dim ss As Long, bb() As Byte
Dim str1 As String, str2 As String
j = a(ss, bb)
str1 = GetStr(ss)
str2 = StrConv(bb, vbUnicode)
MsgBox str1 '输出ss
MsgBox str2 '输出bb
End SubPrivate Function GetStr(pStr As Long)
Dim strRet As String
CopyMemory ByVal VarPtr(strRet), ByVal pStr, 4
GetStr = strRet
End Function
Dim strRet As String
CopyMemory ByVal VarPtr(strRet), ByVal pStr, 4
GetStr = strconv(strRet,vbUnicode)
End Function
肯定能行哟~