我在VC ++中有一个应用程序,它需要从COM DLL(另一个文本框中提供的文件名)执行提供给它的函数(在文本框中输入的函数名)。
我见过使用LoadLibrary
和GetProcAddress
加载Win32库的代码。
如何为COM DLL文件(在Visual Basic 6.0中创建)做到这一点?是否有链接可以获取更多信息?
答案 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的LoadLibrary
和GetProcAddress
的C ++示例
How do I use a COM DLL with LoadLibrary in C++