비슷한 류의 오류라고 볼 수 있겠군요.
VS.NET 2003에서의 VC++ 프로젝트에서도 자동 생성 코드에서 오류가 있는 경우가 있습니다.
importlib("stdole2.tlb");
[
uuid(15C8BB20-023C-4FAD-9A72-E3267A27AC33),
helpstring("_ICTestCOMEvents Interface")
]
dispinterface _ICTestCOMEvents
{
properties:
methods:
[id(0x01)] void OnLoad( [in] VARIANT oEvent );
};
위의 IDL 파일을 컴파일해서, Connection Point 추가를 하게 되면 다음과 같은 코드가 자동생성됩니다.
if (pConnection)
{
CComVariant avarParams[1];
avarParams[0] = oEvent; avarParams[0].vt = VT_VARIANT;
DISPPARAMS params = { avarParams, NULL, 1, 0 };
hr = pConnection->Invoke(0x01, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL);
}
어떤 것이 오류일까요? ^^
avarParams[0].vt = VT_VARIANT;로 한번 더 처리해주는 코드 때문에 오류가 발생합니다.
위의 코드는 마치 oEvent.vt = VT_VARIANT;라고 하는 것과 다를 바가 없지요. 따라서,
oEvent.vt = VT_BSTR;
oEvent.bstrVal = CComBSTR( "TEST" ).Copy();
라고 해서 oEvent 인자로 이벤트를 발생시키는 코드를 다음과 같이 만들게 되면,
CProxy_ICTestCOMEvents::Fire_Event( oEvent );
내부적으로,
avarParams[0] = oEvent;
avarParams[0].vt = VT_VARIANT;
라고 해버리니 오류가 발생할 수밖에 없습니다.
이를 피하기 위해서는 자동 생성된 코드에서 avarParams[0].vt = VT_VARIANT; 코드를 삭제해 주거나 VARIANT 인자형을 쓰지 않는 방법을 고려해 볼 수 있습니다.
VS.NET 2005 정식버전에서는 어떻게 위의 코드가 자동 생성될지 기대가 됩니다. ^^