2012-01-10 20 views
0

についてFYI私はbegginer COM \ ATLとUnicodeはSafeArrayPutElement

に私は私のコードでSafeArrayPutElement(safearray*,LONG,void*)を使用していていますし、問題が...ここ

である私が第3のパラメータを与えたときに、機能が正常に動作しますL"ItWorks" すなわち

SafeArrayPutElement(safearray*,LONG, L"ItWorks"); 

しかし、私は

wchar_t str; 
str = 'a'; 
SafeArrayPutElement(safearray*,LONG,&str); 
を使用している場合

この機能は、私は上記の機能のための三番目のパラメータとしてこれを使用する必要があるいくつかの方法を、私はchar*変数に文字列を持って、私の必要性がある、ここでE_OUTOFMEMORY

を言って失敗します。 誰でもこの点について私を助けてください。

TIA

のNaveen

+0

実際のコードをポストすると、safearray *とLONGを関数に渡すことは決してできません。 SAFEARRAYの文字列は、wchar_tではなくBSTRでなければなりません。 –

答えて

2

BSTRにCOMで使用しても安全である文字列型のみではなく、生wchar_t*。これは、BSTRには、マーシャリングの目的でCOMが使用する余分な内部データが含まれているためです。例えば、wchar_t*から新しいBSTRを割り当て、その後、あなたはそれを使用して終了したときにそれを解放するためにSysFreeString()を使用するSysAllocString()またはSysAllocStringLen()を使用します。

BSTR bstr = SysAllocString(L"ItWorks"); 
SafeArrayPutElement(..., bstr); 
SysFreeString(bstr); 

wchar_t str = L'a'; 
BSTR bstr = SysAllocStringLen(&str, 1); 
SafeArrayPutElement(..., bstr); 
SysFreeString(bstr); 
+0

返信ありがとうございます、ここでL'a 'の' L 'の代替語は何ですか、私はすでにvaraiableの文字列を持っていますので、どのように変換するのですか – Naveen

+0

どのような変数を使用していますか?私はあなたに 'wchar_t'と' wchar_t * 'を変換する方法を示しました。何か他のものを使っていますか? –

関連する問題