2

COPYDATASTRUCTを使用してVARIANT値を別のアプリケーションに送信する必要があります。これが私がメッセージを送信するために使用している構造です。

struct {
   int     i_MsgId;
   VARIANT variant_Value;
}Message;

私のコードでは、VARIANTを初期化してBSTRと入力し、次のように文字列を割り当てます。

Message structMessage;
VariantInit(&structMessage.variant_Value);
structMessage.var_Value.vt = VT_BSTR;

structMessage.variant_Value.bstrVal = ::SysAllocString(L"I am a happy BSTR");

次に、COPYDATASTRUCTを使用してこれを次のように送信します。

    COPYDATASTRUCT structCDS;

structCDS.cbData = sizeof(structMessage);
structCDS.dwData = 12;
structCDS.lpData = (LPVOID)(&structMessage);

::SendMessage(this->m_RemoteWindow,WM_COPYDATA,(WPARAM)this->GetSafeHwnd(),(LPARAM)&structCDS);

このメッセージは2番目のアプリケーションに正常に受信されますが、元の構造体にキャストバックすると、「bstrVal」は不正なポインターを示します

私はこのエラーに苦しんでいるので、あなたの貴重な助けを期待しています。他のvarinatタイプ(int、double)は正常に変換して戻すことができ、このエラーはbstrでのみ発生することに注意してください。:(

ありがとうございました

4

1 に答える 1

0

WM_COPYDATAは、データ構造(lpDataによって参照されるもの)を他のアプリケーションと共有します。データ構造内に含まれているものはすべて、他のアプリからアクセスできます。ただし、bstrValはアプリケーション内のメモリを参照するポインタであり、他のアプリがそれを参照しようとすると失敗します。

これが1つの解決策です。両側で余分な作業が必要です。

送信側では、データ構造(structMessage)を割り当てるときに、文字列を保持するのに十分なスペースを追加します。データ構造の最後に文字列を追加します(そして、必ずdwDataを適切なサイズだけ増やしてください)。

受信側では、文字列を取得し、その時点でSysAllocString呼び出しを使用してbstrValを割り当てることができます。完了したら、SysFreeに電話することを忘れないでください。

于 2010-01-09T06:15:19.927 に答える