CdllからVBにchar *を渡すにはどうすればよいですか?
サンプルコードは次のとおりです。
void Cfunc(char *buffer,int len)
{
BSTR buf_bstr = SysAllocString((BSTR)buffer);
VBptr.VBfunc(buf_bstr,len);
}
この関数は機能していません。実際には、実際の値ではなく、他のいくつかの値がVBに送信されます。
誰かが解決策を提案できますか?
MultiByteToWideChar()
を呼び出してから、SysAllocString()
またはSysAllocStringLen()
を呼び出します。
BSTRが不要になったら、SysFreeString()
を呼び出すことを忘れないでください。
詳細(SysAllocStringLen()
バリアント–短くて速い):
MultiByteToWideChar()
を呼び出し、5番目と6番目のパラメーターとして0を渡します。これは、ANSI文字列に相当するUnicodeの文字数を返します。 ANSI文字列にはASCIIだけでなく任意の文字を含めることができるため、ANSI文字列の長さを指定してUnicode文字の数を手動で計算しようとすると、機能する場合と機能しない場合があります。
SysAllocStringLen()
を使用してBSTRにバッファを割り当てます。最初のパラメーターとして0を渡し、2番目のパラメーターとしてUnicode文字数を渡します。これで、適切に割り当てられたが初期化されていないBSTRができました。末尾のゼロの場所はすでにあり、この末尾のゼロは適切に配置されています。
もう一度MultiByteToWideChar()
を呼び出し、今度は割り当てられたBSTRをそこに渡します。この関数は文字列をUnicodeに変換し、結果をBSTRにコピーします。これで、ANSI文字列に相当するUnicodeを含む適切に割り当てられたBSTRができました。
BSTRをVBに渡します。楽しい。
SysFreeString()
を呼び出して、BSTRの割り当てを解除します。
これは私が使用して書いたコードです sharptooths 回答
int wslen = MultiByteToWideChar(CP_ACP, 0, str, strlen(str), 0, 0);
BSTR bstr = SysAllocStringLen(0, wslen);
MultiByteToWideChar(CP_ACP, 0, str, strlen(str), bstr, wslen);
// Use bstr here
SysFreeString(bstr);
文字列の長さに-1を使用すると、結果にnullターミネータが含まれることに注意してください
Ajryanの答えに異議はありませんが、別の方法があります...
SysAllocStringは、タイプOLECHAR *のパラメーターを受け取るように定義されています。あなたはそれにchar *を与えています。これらは同じものではありません。それらが同じものである可能性がある特定の状況がありますが、それに依存することはできません。したがって、まず最初に、char *をOLECHAR *に変換する必要があります。これを実行できるA2OLEというマクロがあり、char *とOLECHAR *が同じものである場合、マクロは何もコンパイルされません(私は思います)。
A2OLEとその仲間の詳細については、 このページ を参照してください。
ああ、char *をBSTRにキャストしても、実際にはまったく変更されません。BSTRでもOLECHAR *でもありません。
char *配列の代わりに、_tchar *配列を試してください。Sysallocstringは32ビットアプリケーションではUnicode文字のみを使用するためです。