我写了一个VC的动态库,供VB调用,返回VB一个字符串。发现总是不对,在VB中得到的字符串要比在VC中赋给它的多一个字符。调了一晚上,也没有想通,后来仔细跟踪了一下,发现:
  当VC返回的字符串长度为奇数时,在VB中的长度就会加1,变成偶数;
  当VC返回的字符串长度为偶数时,在VB中的长度就会不变,跟VC中的长度一样。
我在VC中是这样返回的:
  return SysAllocString(BSTR(p1));
其中,p1是一个字符串。
这是怎么回事呢?在网上还没有找到相关资料,真是郁闷死人!!
用的是VB6、VC6。
请问这是怎么回事?怎么解决啊?

解决方案 »

  1.   

    因为在你这个函数返回的时候,VB自动作了一次StrConv(xxx,vbUnicode)的转换另外,你最好以参数返回字符串,SysAllocString一次,却没有SysFreeString,似乎就不大好了
      

  2.   

    那该如何处理?
    用参数返回是不是就可以避免这种转换?能给出一个用参数返回的代码例子吗?
    我不知道在VB中如何预先分配空间,及在VC中如何给这个BSTR字符串赋值。
      

  3.   

    http://community.csdn.net/Expert/topic/3532/3532686.xml?temp=.8203699
      

  4.   

    谢谢!
    不过,
    我试了那段代码,返回的字符串还是不对。我在VB中是用下列语句看的:
    Debug.Print "[" & Left$(s, InStr(s, Chr(0))) &"]"
    发现在方括号中间不等于我在VC中赋的值,末尾总是多一个字符,而且无论在VC中返回的长度是奇数还是偶数。
    应该不会是我的机器有问题吧?:)
      

  5.   

    还是自动转换的问题。你可以通过传Long型指针而不是String的方式避免出现这种情况。
      

  6.   

    这个问题是很奇怪,可能是VB在后台作了什么转换?
    目前我还没有研究出来。
    不过你若是急用,我可以告诉你一个速效的解决方案:
    这是我常用的混合编程方法,当需要VC给VB提供字符串时,
    由VB传给DLL一个TextBox控件的句炳,然后DLL用SetWindowText函数
    把字符串投放到TextBox控件中,最后VB从TextBox控件中拿字符串就可以了。VC代码---------------------------------------------------------void GetBSTRByText(HWND HwndTextBox,long i)
    {
    char* p1;
    if (1==i) 
    {
    p1="哈哈haha";
    }
    else
    {
    p1="哈哈hah";
    }
    SetWindowTextA(HwndTextBox, p1);

    }VB代码---------------------------------------------------------
    Private Declare Sub GetBSTRByText Lib "String.dll" (ByVal Hwnd As Long, ByVal i As Long)Private Sub Command3_Click()
    GetBSTRByText Text1.Hwnd, 1
    MsgBox Text1.Text
    MsgBox Len(Text1.Text)
    End SubPrivate Sub Command4_Click()
    GetBSTRByText Text1.Hwnd, 0
    MsgBox Text1.Text
    MsgBox Len(Text1.Text)End Sub----------------------------------------------------------------
    要完整代码请到这下载
    http://lqweb.crcoo.com/mycode/VCVBString.rar
      

  7.   

    我上面的代码写错了,更正一下
    VC代码---------------------------------------------------------
    void _stdcall GetBSTRByText(HWND HwndTextBox,long i){
      

  8.   

    不知道你的dll是不是在98(2000以下的系统)下开发的,如果是你需要对字符进行UNicode转换_T(“”),2000以上的系统默认的是UNIcode所以会自动完成