t1.cpp代码
extern "C"  __declspec(dllexport) BSTR  __stdcall  GetBalance(BSTR   InStr)
{   
        //参数InStr值此处暂不用,只是为了测试CString转成BSTR,可结果VB调用后只返回一个字符a,如果Buf = "汉bc",调用后返回的是乱码
CString   Buf;   
Buf   =   "abc";   
return  Buf.AllocSysString();   
}   
vb调用代码Private Declare Function GetBalance Lib "WebService.DLL" (ByVal UserID As String) As StringPrivate Sub Command1_Click()
 MsgBox GetBalance("参数")
End Sub问题1:CString转成BSTR作为返回值,若返回值为ascii码,则VB调用后只返回一个字符,为什么不返回"abc",怎么解决
问题2:CString转成BSTR作为返回值,若返回值为中文字符,则VB调用后只返回是乱码,怎么解决

解决方案 »

  1.   

    这个问题比较麻烦,涉及的东西比较多呀,编译的时候选择的字符集是啥呀,如果是Unicode,和vb的挂接就简单了.如果是多字节就要加东西了.
    extern "C"  __declspec(dllexport) BSTR  __stdcall  GetBalance(BSTR  InStr)

            CComBSTR bstr( "abc" );
            CComBSTR bstr1( InStr );
            bstr+=bstr1;
    //*pVal=bstr.Copy();
           return bstr.Copy();

      

  2.   

    似乎只用普通unsigned char *也能解决楼主想要的问题,
      

  3.   

    用vs2003来写的dll,怎么在编译的时候选择的字符集为Unicode
      

  4.   

    其实用char * 是可以直接获取字符串的,也可以返回正确的结果,我现在的想法是这样的
    (1)我用vs2003开发了一个webservice接口很简单index.asmx部分代码如下:
    [WebMethod]
    public string GetBalance(string UserID)
    {
                            //此处只是为了返回一个字符串
    return "尊敬的"+UserID+",您的余额为20元";
    }

    (2)再用vs2003开发,vc7开发了一个非托管的WebService.dll来调用这个服务
    WebService.cpp部分代码如下:
    using namespace index;//webservice类extern "C"  __declspec(dllexport) BSTR  __stdcall  GetBalance(BSTR   UserID)
    {   
            HRESULT hr = S_OK;
    CComBSTR  hiResult;
    Cindex* index = new Cindex;//webservice类
            
            //类视图中的调用说明GetBalance(BSTR UserID,BSTR *GetBalanceResult) hr = index->GetBalance(UserID,&hiResult); //注意,返回值是以指针形式反回的 delete index;
    if(FAILED(hr))
    {
    BSTR  str("调用失败")
    return "调用失败";
    }
    else
    {
                    //应该返回"尊敬的"+UserID+",您的余额为20元";可实际返回不了值
    CString str(hiResult);
    return str.AllocSysString();
    }
    }   
    (3)vb调用代码 form1.frm部分代码如下:
    Private Declare Function GetBalance Lib "WebService.DLL" (ByVal UserID As String) As String Private Sub Command1_Click() 
            '应该显示 尊敬的小强,您的余额为20元,可是返回不了
            MsgBox GetBalance("小强") 
    End Sub 这是我做的程序有以下调用问题,
    (1)为什么传到index.asmx的GetBalance方法中参数UserID变成乱码,
    public string GetBalance(string UserID)
    {
                            //此处只是为了返回一个字符串
    return "尊敬的"+UserID+",您的余额为20元";
    }
    (2)WebService.cpp中无法正确调用web服务的返回值
                      CString str(hiResult);
    return str.AllocSysString();(3)vb无法得到正确返回值 (4)哪位朋友有类似的程序或遇到我这样问题帮忙解决一下,感激!
      

  5.   

    工程 -》 属性,-》Character Set
      

  6.   

    已经设置字符集为Unicode 了还是不行
      

  7.   

    http://www.xtremevbtalk.com/showthread.php?t=213907