web-dev-qa-db-ja.com

char *をBSTRに変換する方法は?

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

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

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

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

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

21
Joseph_blr

使用する _bstr_t

_bstr_t bstrt(buffer);

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

22
Aidan Ryan

MultiByteToWideChar()を呼び出してから、SysAllocString()またはSysAllocStringLen()を呼び出します。

BSTRが不要になったら、SysFreeString()を呼び出すことを忘れないでください。

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

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

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

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

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

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

22
sharptooth

これは私が使用して書いたコードです 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ターミネータが含まれることに注意してください

12
David Sykes

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

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

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

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

2
Martin

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

1
Raams