动态调用COM DLL

时间:2010-03-04 09:36:55

标签: visual-c++ dynamic dll com vb6

我在VC ++中有一个应用程序,它需要从COM DLL(另一个文本框中提供的文件名)执行提供给它的函数(在文本框中输入的函数名)。

我见过使用LoadLibraryGetProcAddress加载Win32库的代码。

如何为COM DLL文件(在Visual Basic 6.0中创建)做到这一点?是否有链接可以获取更多信息?

2 个答案:

答案 0 :(得分:2)

如果您正在调用的组件支持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(),然后通过将DISPID传递给IDispatch::Invoke()来调用该方法。

为了清楚起见,我假设您要调用的方法没有参数,但是如果存在,则可以修改传递给Invoke()的{​​{3}}。 / p>

答案 1 :(得分:0)

这里有一个COM dll的LoadLibraryGetProcAddress的C ++示例 How do I use a COM DLL with LoadLibrary in C++