Похоже, вы используете C ++ в качестве COM-клиента, полагаясь на встроенную поддержку COM компилятора VC ++. Чтобы упростить кодирование клиента, вы использовали #import
для генерации классов-оболочек C ++, которые пытаются скрыть от вас все детали COM или, по крайней мере, упростить детали COM. Таким образом, вы не используете COM SDK напрямую, а используете клиентскую платформу (я думаю, что она представляет собой облегченную платформу только для COM, похожую на ATL или MFC).
Однако ваш пример кода, похоже, смешивает прямой низкоуровневый COM SDK (VARIANT
s, BSTR
, SysAllocString
) с #import
COM-фреймворком (_variant_t
, _bstr_t
, XXXXPtr
). COM из C ++ поначалу сложен, поэтому в идеальном мире я бы предложил ознакомиться с основами COM, прежде чем идти слишком далеко вперед.
Однако, если вы просто хотите, чтобы что-то работало, я бы угадал это версия 101B * -стиля-COM-клиентов, которую вы предоставили:
_variant_t example1Var;
_variant_t example1Var;
SIMUL8::S8SimObjectQIPtr example1; // I'm guessing at this type-name from the VB code
SIMUL8::S8SimObjectQIPtr example2;
example1Var = pis8->GetSimObject(_bstr_t(L"Example 1"));
example2Var = pis8->GetSimObject(_bstr_t(L"Example 2"));
if (example1Var.vt == VT_DISPATCH && example2Var.vt == VT_DISPATCH)
{
// **UPDATE** to try to spoon feed the QI ptr...
example1 = IDispatchPtr((IDispatch*)example1Var);
example2 = IDispatchPtr((IDispatch*)example2Var);
// Does this screw-up reference counting?
int numberOfexamples = example1->CountContents + example2->CountContents;
}
UPDATE:
Документация по #import
Это значительно упрощает использование COM из C ++, но еще одна вещь для изучения ...