저는 구조체를 C++ 클라이언트에서 COM을 사용하는 C++ 서버로 전달하는 방법을 연구했습니다. 나는 많은 예를 발견했으나 실제로 나에게 설명해 주었다. 나는 5가 아니라, 내가 원하는 것을하는 방법에 대한 확고한 이해를 제공했다. COM 인터페이스를 통해 양면이있는 C++ 구조체를 전달하기 만하면된다. C++. 쉬워야 할거야, 그렇지?COM C++ 클라이언트에서 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의 사용이 올바르지 않은지 궁금하고, 실제로 타입 변환 할 수 있는지 궁금합니다.
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;
pxxxData 란 무엇입니까? 서버가 out-of-proc이고 서버가 전혀 사용할 수 없으면 서버 주소 공간의 잘못된 메모리 위치를 가리 킵니다. 또한 pImageData 회원 데이터는 무엇입니까? 코드 샘플이 완료되지 않은 것 같습니다 – Andrey
죄송합니다. 코드를 조금 어색하게 수정하고 있습니다. 나는 그것을 위에 고치고 또한 나의 최신 수정을 제공했다는 것을 믿는다. 그 메모에, 당신 말이 맞아. 그것은 out-of-proc입니다. 이를 방지하기 위해 VARIANT *를 사용하여 VARIANT를 출력하는 대신 제안 하시겠습니까? – RootAtShell