我一直在研究使用 COM 将结构作为参数从 C++ 客户端传递到 C++ 服务器。我找到了很多例子,但没有一个像我五岁那样真正向我解释它,也没有一个真正提供了对如何做我想做的事情的深刻理解,这只是通过双方都是的 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;