-1

COM を使用して、構造体をパラメーターとして C++ クライアントから C++ サーバーに渡す方法を研究しています。私は多くの例を見つけましたが、私が5歳のようにそれを実際に説明したものも、私がやりたいことを行う方法をしっかりと理解したものもありませんでした.COMインターフェイスを介してC++構造体を渡すだけですC++. 簡単なはずですよね?

サーバー側の IDL ファイルで次のように構造体を確立しました。

[
    uuid(7F0C9A48-3C41-425B-B4E6-8156B61D5355),
    version(1.0)
]
typedef struct xxxData
{
    int iWidth;
    int iHeight;
    SafeArray(short) pxxxData;
} xxxData;

// Fix for UUID DECLARATION FOR _uuidof() functionality
// From http://go4answers.webhost4life.com/Example/error-c2787-no-guid-been-associated-158947.aspx
cpp_quote("struct __declspec(uuid(\"{7F0C9A48-3C41-425B-B4E6-8156B61D5355}\")) xxxData;")

私が知る限り、どちらが機能しますか。

今私のクライアントは、次のように示す GetImageData を呼び出します。

[id(16)] HRESULT GetImageData([in,out] VARIANT* pData);

これで、この関数を使用したクライアント呼び出しは次のようになります。

VARIANT* pData = new VARIANT;
VariantInit( pData );
xxxData* data = new xxxxData;
HRESULT hr = mpCOMEvents->GetImageData(pData);
data = (FBIS_ImageData*)(pData->pvRecord);
int length = data->iWidth * data->iHeight;

ただし、長さによって間違った住所の場所が表示されます。これは、私の pvRecord の使用が間違っているかどうか、そして本当に型キャストできるかどうか疑問に思います。

これが私のCOMサーバー側です:

xxxData data;
//SAFEARRAY *psa;
IRecordInfo *pRI;
HRESULT hr;

/* Pass in Structure Information */
data.iHeight = 100;
data.iWidth = 100;

// Used http://vcfaq.mvps.org/com/4.htm as reference
hr = GetRecordInfoFromGuids(LIBID_xxxLib, 1, 0, 0x409, _uuidof(xxxData), &pRI);
VariantInit(pData);
pData->vt = VT_RECORD;
pData->pvRecord = &data;
pData->pRecInfo = pRI;
pRI = NULL;
4

1 に答える 1