Вызов COM DLL динамически - PullRequest
3 голосов
/ 04 марта 2010

У меня есть приложение на VC ++, которое должно выполнить предоставленную ему функцию (имя функции, введенное в текстовое поле) из COM DLL (имя файла указано в другом текстовом поле).

Я видел код для загрузки библиотеки Win32, используя LoadLibrary и GetProcAddress.

Как это можно сделать для файла COM DLL (созданного в Visual Basic 6.0)? Есть ли ссылка, где я могу получить больше информации?

1 Ответ

2 голосов
/ 04 марта 2010

Если вызываемый вами компонент поддерживает 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(), если есть.

...