描述:
我写的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:
告诉你原因:
因为组件不是在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字符串。
把“ _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 );
试试看。
_com_util::ConvertBSTRToString(str)
用这个方法把BSTR转化过来
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();
文件前面加上
#include <comutil.h>
#pragma comment(lib, "comsupp.lib")
STDMETHODIMP CATest::ShowStr(BSTR bstrStr)
{
MessageBox(_com_util::ConvertBSTRToString(str));
}