22

CdllからVBにchar*を渡すにはどうすればよいですか?

サンプルコードは次のとおりです。

void Cfunc(char *buffer,int len)
{
  BSTR buf_bstr = SysAllocString((BSTR)buffer);
  VBptr.VBfunc(buf_bstr,len);
}

この機能は機能していません。実際には、実際の値ではなく、他のいくつかの値がVBに送信されます。

誰かが解決策を提案できますか?

4

5 に答える 5

22

使用_bstr_t

_bstr_t bstrt(buffer);

これが文字列変換記事の聖杯です

于 2009-03-03T11:51:15.730 に答える
22

を呼び出してから、 またはMultiByteToWideChar()のいずれかをSysAllocString()呼び出しますSysAllocStringLen()

SysFreeString()BSTR が不要になったら、忘れずに呼び出してください。

詳細 (SysAllocStringLen()バリアント – 短くて高速です):

  1. 5 番目と 6 番目のパラメーターとして 0 を呼び出しMultiByteToWideChar()て渡します。ANSI 文字列に相当する Unicode の文字数を返します。ANSI 文字列には、ASCII だけでなく、あらゆる文字を含めることができるため、ANSI 文字列の長さを指定して Unicode 文字数を手動で計算しようとすると、機能する場合と機能しない場合があることに注意してください。

  2. で BSTR のバッファを割り当てSysAllocStringLen()ます。最初のパラメーターとして 0 を渡し、2 番目のパラメーターとして Unicode 文字の数を渡します。これで、適切に割り当てられたが初期化されていない BSTR ができました。末尾のゼロの場所は既にあり、この末尾のゼロは適切に配置されています。

  3. 2 回目に呼び出しMultiByteToWideChar()、今回は割り当てられた BSTR をそこに渡します。関数は文字列を Unicode に変換し、結果を BSTR にコピーします。これで、ANSI 文字列に相当する Unicode を含む BSTR が適切に割り当てられました。

  4. BSTR を VB に渡します。楽しみ。

  5. SysFreeString()BSTR の割り当てを解除するために呼び出します。

于 2009-03-03T11:59:59.797 に答える
13

これは、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 ターミネータが結果に含まれることに注意してください。

于 2013-06-12T13:21:43.737 に答える
2

ajryanの答えに異議はありませんが、別の方法があります...

SysAllocStringは、タイプOLECHAR*のパラメーターを受け取るように定義されています。あなたはそれにchar*を与えています。これらは同じものではありません。それらが同じものであるかもしれない特定の状況がありますが、あなたはそれに頼ることができません。したがって、まず最初に、char*をOLECHAR*に変換する必要があります。これを実行できるA2OLEというマクロがあり、char*とOLECHAR*が同じものである場合、マクロは何もコンパイルされません(私は思います)。

A2OLEとその仲間の詳細については、このページを参照してください。

ああ、char *をBSTRにキャストしても、実際にはまったく変更されません。BSTRでもOLECHAR*でもありません。

于 2009-03-03T11:58:28.957 に答える
1

char* 配列の代わりに、_tchar* 配列を試してください。Sysallocstring は 32 ビット アプリケーションで Unicode 文字のみを使用するためです。

于 2014-01-27T10:31:27.820 に答える