我写的ActiveX控件ATest有一个如下方法:
STDMETHODIMP CATest::ShowStr(BSTR bstrStr)
{
_bstr_t bstr=bstrStr;
LPSTR str=(TCHAR*)bstr;
/*还用过
CComBSTR bstr=bstrStr;
CString str(bstr);
的方法*/
MessageBox(str);
}VB调用如下:
ATest1.ShowStr "VB Test!"
弹出的MessageBox都很正常C++ Bulider调用如下:
wchar_t* wstr=new wchar_t[30];
String str="C++ Bulider Test!";
str.WideChar(wstr,30);
ATest1->ShowStr(wstr);
弹出的MessageBox也很正常VC调用如下:
//m_ATest定义:CATest m_ATest;
m_ATest.ShowStr(_bstr_t("VC Test!"));
/*还用过
CString str="VC Test!";
BSTR bstr=str.AllocSysString();
m_ATest.ShowStr(bstr);
的方法*/
可是弹出的MessageBox中都是只有第一个字母V

解决方案 »

  1.   

    CoCreateInstance 创建COM对象,而不是直接声明CATest m_ATest;
      

  2.   

    把“ _bstr_t bstr=bstrStr;
    LPSTR str=(TCHAR*)bstr;
    /*还用过
    CComBSTR bstr=bstrStr;
    CString str(bstr);
    的方法*/
    MessageBox(str);
    ”改成:     CString strValue = bstrStr;
        MessageBox( NULL, strValue, "OK", MB_OK ); 试试看。
      

  3.   

    楼上的,我用你的方法实验了,也是不行!现在发现了另外一种可以正确的显示方法,如下:
    wchar_t bstr[30];
    memcpy(bstr,"VC Test!",30);
    m_ATest.ShowStr(bstr);这是为什么呀?我总不能让用户这样使用我开发的ActiveX 控件吧?
      

  4.   

    文件前面加上
    #include <comutil.h>
    #pragma comment(lib, "comsupp.lib")
    STDMETHODIMP CATest::ShowStr(BSTR bstrStr)
    {
    MessageBox(_com_util::ConvertBSTRToString(str));
    }
      

  5.   

    On client side IMyMessageBox* pMyMess; OleInitialize(NULL);
    CoCreateInstance(CLSID_MyMessageBox, NULL, CLSCTX_INPROC_SERVER , IID_IMyMessageBox, (void**)&pMyMess); BSTR myMess = SysAllocString(L"hello world");
    pMyMess->ShowMessage(myMess);
    SysFreeString(myMess); OleUninitialize();
      

  6.   

    _com_util::ConvertBSTRToString(str)
    用这个方法把BSTR转化过来
      

  7.   

    大家的方法我都试验了,还是只有我自己的方法才行!如下:
    wchar_t bstr[30];
    memcpy(bstr,"VC Test!",30);
    m_ATest.ShowStr(bstr);
    为什么呀?
    请高手朵朵指点!
      

  8.   

    告诉你原因:因为组件不是在UNICODE下编译通过的,所以
    LPSTR str=(TCHAR*)bstr;
    的结果是声明了一个char*的指针指向一个
    宽字节unsigned short *的指针。
    str[0] = 'V'
    str[1] = 0
    所以messagebox调用后只看到了"V",你后来的方法虽然使用了wchar_t bstr[30];
    但是memcpy(bstr,"VC Test!",30);使得bstr里
    实际存的是Ansi字符串。
      

  9.   

    大家的方法我都试验了,还是只有我自己的方法才行!如下:
    wchar_t bstr[30];
    memcpy(bstr,"VC Test!",30);
    m_ATest.ShowStr(bstr);
    为什么呀?
    请高手朵朵指点!那就先用这个方法不就得了?另外,好像问题出现在,字符串必须用宽字符,看看问题是不是出现在这里?
      

  10.   

    还有其他更详细的解释吗?
    我刚开始学ATL,请高手多多指教!