我写的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
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
LPSTR str=(TCHAR*)bstr;
/*还用过
CComBSTR bstr=bstrStr;
CString str(bstr);
的方法*/
MessageBox(str);
”改成: CString strValue = bstrStr;
MessageBox( NULL, strValue, "OK", MB_OK ); 试试看。
wchar_t bstr[30];
memcpy(bstr,"VC Test!",30);
m_ATest.ShowStr(bstr);这是为什么呀?我总不能让用户这样使用我开发的ActiveX 控件吧?
#include <comutil.h>
#pragma comment(lib, "comsupp.lib")
STDMETHODIMP CATest::ShowStr(BSTR bstrStr)
{
MessageBox(_com_util::ConvertBSTRToString(str));
}
CoCreateInstance(CLSID_MyMessageBox, NULL, CLSCTX_INPROC_SERVER , IID_IMyMessageBox, (void**)&pMyMess); BSTR myMess = SysAllocString(L"hello world");
pMyMess->ShowMessage(myMess);
SysFreeString(myMess); OleUninitialize();
用这个方法把BSTR转化过来
wchar_t bstr[30];
memcpy(bstr,"VC Test!",30);
m_ATest.ShowStr(bstr);
为什么呀?
请高手朵朵指点!
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字符串。
wchar_t bstr[30];
memcpy(bstr,"VC Test!",30);
m_ATest.ShowStr(bstr);
为什么呀?
请高手朵朵指点!那就先用这个方法不就得了?另外,好像问题出现在,字符串必须用宽字符,看看问题是不是出现在这里?
我刚开始学ATL,请高手多多指教!