Re: Why could not display the string?
Lee Tow wrote:
Hello all:
First I create a component using atl,look:
STDMETHODIMP CTpsz::PrtStr(wchar_t **str)
{
// TODO: Add your implementation code here
ULONG cb=60;
wchar_t *tmp;
tmp=(wchar_t*)CoTaskMemAlloc(cb);
Here you allocate memory for the string you want to return. So far, so good.
tmp=L"Hello World!";
Very bad: tmp now points not to the allocated buffer, but to a different
location. You have to copy the string into tmp using strcpy (or rather wcscpy).
I assume that the parameter "str" of "ITpsz::PrtStr" is no BSTR type, but really
wchar_t**. If you want to use BSTR (as is pretty much the standard way of
passing strings around with COM), you have to use the ::SysAllocString method of
the COM API.
str=&tmp;
return S_OK;
}
and the CLSID is CLSID_Tpsz,interface ID is IID_ITpsz;
then I want to get the string and display on client,look:
void main()
{
HRESULT hr;
hr=CoInitialize(NULL);
if(FAILED(hr))
{
MessageBox(NULL,L"Initial COM Fail",L"Caption",MB_OK);
Bad: You use MessageBox to output a wide string. This only works if your
application uses UNICODE. In general you can:
- use MessageBoxA to display ANSI strings: MessageBoxA (NULL, "",...)
- use MessageBoxW to display wide (UNICODE) strings:
MessageBoxW (NULL, L"", ...)
- use either of these functions, depending on whether your application should
support UNICODE or not: MessageBox (NULL, _T(""), ...)
Note that MessageBox and _T are macros that are expanded to MessageBoxA and
ANSI-strings, if _UNICODE is not defined, or to MessageBoxW and UNICODE strings
if _UNICODE is defined. So the third alternative can be used if you don't know
yet whether your application will be a UNICODE or ANSI application.
return;
}
ITpsz *pITpsz=NULL;
hr=CoCreateInstance(CLSID_Tpsz,NULL,CLSCTX_INPROC_SERVER,IID_ITpsz,(void**)&
pITpsz);
if(FAILED(hr))
{
MessageBox(NULL,L"Create object fail",L"Caption",MB_OK);
return;
}
wchar_t *str=NULL;
hr=pITpsz->PrtStr(&str);
if(FAILED(hr))
{
MessageBox(NULL,L"Get Inteface fail",L"Caption",MB_OK);
}
MessageBox(NULL,str,L"Caption",MB_OK);
CoTaskMemFree(str);
pITpsz->Release();
CoUninitialize();
}
but I display nothing,why?how to solve?Thanks very much.
If your app doesn't define _UNICODE, all wide strings will be interpreted as
ANSI strings, and due to the design of UNICODE, every UNICODE string will be
interpreted as empty ANSI string.
Regards,
Stuart