Если вызываемый вами компонент поддерживает IDispatch
(что весьма вероятно, если он был создан в VB), вы можете использовать позднюю привязку для динамического вызова методов интерфейса COM.
Например:
IDispatch *pDispatch;
// Assumes pUnknown is IUnknown pointer to component that you want to call.
HRESULT hr = pUnknown->QueryInterface(IID_IDispatch, reinterpret_cast<void **>(&pDispatch));
if(SUCCEEDED(hr))
{
DISPID dispid;
// Assumes sMethodName is BSTR containing name of method that you want to call.
hr = pDispatch->GetIDsOfNames(IID_NULL, &sMethodName, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if(SUCCEEDED(hr))
{
// Assumes that the method takes zero arguments.
VARIANT vEmpty;
vEmpty.vt = VT_EMPTY;
DISPPARAMS dp = { &vt, 0, 0, 0 };
hr = pDispatch->Invoke(dispid, IID_INULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dp, 0, 0, 0);
}
pDispatch->Release();
}
В этом примере извлекается DISPID
названного метода из IDispatch::GetIDsOfNames()
, затем вызывается этот метод путем передачи *От 1015 * до IDispatch::Invoke()
.
Для ясности я предположил, что у метода, который вы хотите вызвать, нет аргументов, но вы можете изменить DISPPARAMS
структура , которая передается в Invoke()
, если есть.