CdllからVBにchar*を渡すにはどうすればよいですか?
サンプルコードは次のとおりです。
void Cfunc(char *buffer,int len)
{
BSTR buf_bstr = SysAllocString((BSTR)buffer);
VBptr.VBfunc(buf_bstr,len);
}
この機能は機能していません。実際には、実際の値ではなく、他のいくつかの値がVBに送信されます。
誰かが解決策を提案できますか?
を呼び出してから、 またはMultiByteToWideChar()
のいずれかをSysAllocString()
呼び出しますSysAllocStringLen()
。
SysFreeString()
BSTR が不要になったら、忘れずに呼び出してください。
詳細 (SysAllocStringLen()
バリアント – 短くて高速です):
5 番目と 6 番目のパラメーターとして 0 を呼び出しMultiByteToWideChar()
て渡します。ANSI 文字列に相当する Unicode の文字数を返します。ANSI 文字列には、ASCII だけでなく、あらゆる文字を含めることができるため、ANSI 文字列の長さを指定して Unicode 文字数を手動で計算しようとすると、機能する場合と機能しない場合があることに注意してください。
で BSTR のバッファを割り当てSysAllocStringLen()
ます。最初のパラメーターとして 0 を渡し、2 番目のパラメーターとして Unicode 文字の数を渡します。これで、適切に割り当てられたが初期化されていない BSTR ができました。末尾のゼロの場所は既にあり、この末尾のゼロは適切に配置されています。
2 回目に呼び出し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 文字のみを使用するためです。