Как преобразовать структуру в VARIANT в C ++ - PullRequest
3 голосов
/ 07 января 2012

Я хочу передать структуру в C ++ функции javascript. Я могу передать переменную VARIANT в JavaScript, но я не знаю, как преобразовать структуру в VARIANT.

Например, я могу передать function f строку, преобразованную в VARIANT:

void f(VARIANT x);  
f(_variant_t("hello!"));

Теперь я хочу передать такую ​​структуру:

struct TMyStruct
{
  int x;
  int y;
};

------- Часть моего кода ниже:

// Load Html on CHtmlView and after load is completed, get its document.
LPDISPATCH pDoc = ... // document of CHtmlView
CComQIPtr<IHTMLDocument2> m_pViewDoc;
pDoc->QueryInterface(IID_IHTMLDocument2, (void**)&m_pViewDoc);
CComPtr<IDispatch> m_pScript;
m_pViewDoc->get_Script(&m_pScript);
struct TMyStruct
{
    int x;
    int y;
    // .... other fields...
} z;
//z = .... Initialize z.
VARIANT myVariant;
// myVariant = z ????   // How to pass z to variant.
DISPID dispid = NULL;
HRESULT hr = m_pScript->GetIDsOfNames(IID_NULL, &CComBSTR(myJavaScriptFunctionName), 1, LOCALE_SYSTEM_DEFAULT, &dispid);
ATLASSERT(SUCCEEDED(hr));
if(SUCCEEDED(hr))
{
    COleDispatchDriver ocOleDispatchDriver(pScript, FALSE);
    ocOleDispatchDriver.InvokeHelperV(dispid, DISPATCH_METHOD, VT_NONE, nullptr, (BYTE*)VTS_VARIANT, myVariant);
}

1 Ответ

2 голосов
/ 19 мая 2012

Эта страница показывает, что вы не можете делать то, что пытаетесь сделать.

ВАЖНО: структуры не могут использоваться клиентами сценариев!

ref: http://vcfaq.mvps.org/com/4.htm

Мне кажется, что вы вошли в мир COM, и вы все еще не уверены, как все это работает. По сути, COM должен знать о типах, которые вы передаете, поскольку он обеспечивает и управляет переходом между вещами, называемыми COM-квартирами. Пересекая границы квартир, подсистема СОМ поработает над тем, чтобы соблюдать правила СОМ и ничего (слишком) не могло произойти. Он не может творить чудеса, если где-нибудь не доступно описание интерфейса или типа. Таким образом, при передаче структур из одного класса C ++ в другой класс C ++ у вас есть несколько вариантов, чтобы облегчить это, но у вас может не быть такого уровня контроля при попытке передать данные клиенту сценариев.

...