我已经试了一些方法都不行,请高手帮帮忙吧:)
我在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)

解决方案 »

  1.   

    Private Declare Function a  Lib "test.dll" (ByRef ss As Long, _
                        ByVal bb As String ) As Long既然 ss 给的是指针,就是传址。
      

  2.   

    你必须在VB中建立对应结构这是一点,还有一点,你必须查看从VC里传出的结构中有没有char*的成员,如果有,那么,你还必须修改vc里的那个数据结构改为:
    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的使用要改变形式
      

  3.   

    我按照有些资料所说,在VC中的声明改为int __stdcall a (void * ss,char *bb);
    vb中仍然用byval bb  as string*4(假设传出字符串为4个字母)。
    但是在VC中调试时仍然存在错误:
    User breakpoint callde from code at 0x77f813b1
    请帮忙分析一下:)
      

  4.   

    这样获取可以
    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
    看看可以不
      

  5.   

    Private Declare Function a  Lib "test.dll" (ByRef ss As Long, _
                        ByVal bb As long) As LongDim s As Strings = StrConv("abcd",vbFromUnicode)
    a LenB(s), StrPtr(s)
      

  6.   

    To:Tiger_Zhao() 
    你是不是在告诉我怎样传入字符串,呵呵,我是想从VC的Dll中传出字符串。还是谢谢你!To: limitworld(黑色幽灵) 
    我用的是Dll,请问,可以用sendmessage 吗?
      

  7.   

    弄错了,不好意思,具体看看 wm_copydata 说明
    或者建立PIPE,或建立内存影射文件,其他方法我不知道.
      

  8.   

    To:limitworld(黑色幽灵)
    还是谢谢了,你的这种方法我会记下的,以备以后用的着:)
      

  9.   

    不是说了么,char*不能和vb里的string对等,要把char* a改为BSTR a在转换赋值的时候要用
    cstring strtemp;
    strtemp=(L_CHAR *)ShowValue(...)
    a=strTemp.AllocSysString();
      

  10.   

    To: whiledo(小玉) 
    你说的方法我试了,可是还是传不出字符串啊!我把字符串变成byte型传出时,就可以读出来,不过对汉字是不好用的(VB和VC中对于同一个汉字转化成的byte值是不同的)。谢谢你的帮忙,我也不知道什么地方有问题啊!
      

  11.   

    vb、vc间传字符串一般都是调用方负责准备好用来存放字符串的缓冲区,所以,只要调用方这里准备好了缓冲区然后传个地址给被调用函数就可以了,事情就是这么简单,不要想太复杂了啊
      

  12.   

    To: supergreenbean(超级绿豆 - 世界上只有一种人不能得罪 —— 女人) 
    您的意思是不是:在VB中byref方式传一个字符串,在VC中用 char*接收,然后赋值给char*,再传出来就可以了。我试过这种方式,不能传出来。我个人也认为,这不是一个复杂的问题,而且肯定能实现的,可是在实际用的时候就是传不出来,呵呵,有些上火啊。
      

  13.   

    To : whiledo(小玉) 
    请问 strtemp=(L_CHAR *)ShowValue(...)
    这句的作用是什么,编译出错L_CHAR *、ShowValue不识别,是不是要加头啊?
    我也给您发了一条留言,不知您有没有看到。
    另外,这种方法可以传汉字吗?
      

  14.   

    Option Explicit
    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
      

  15.   

    char 对应的是VB中的BYTE类型
      

  16.   

    使用我上面的GetStr函数就可以指针 转化为 里面的字符数据 如果里面包含的是unicode的话 这样改:Private Function GetStr(pStr As Long)
        Dim strRet As String
        CopyMemory ByVal VarPtr(strRet), ByVal pStr, 4
        GetStr = strconv(strRet,vbUnicode)
    End Function
      

  17.   

    我也才看见你的短信息啊,真不好意思,我给你回叻我告诉你那个(L_CHAR*)你别管,那是我自己定义的,你要传汉字的话,说真的,我没试过,你可以尝试一下两个,一个是cstring还有就是wchar_t
    肯定能行哟~