描述:
我想用IDispatch接口操作 Excel,代码如下:(我是用C++Builder写的,如果那位高手能用VC++实现这个功能,帮我用原始的IDispatch接口实现一下。不要用智能指针。谢谢了)
IDispatch *pDisp = CreateOleObject("Excel.Application");
OLECHAR *pMName = L"Quit";
DISPID DispId;
HRESULT hr = pDisp->GetIDsOfNames(IID_NULL, &pMName, 1,
LOCALE_SYSTEM_DEFAULT, &DispId);
if(SUCCEEDED(hr))
{
ShowMessage(DispId);
}
DISPPARAMS disps = {NULL, NULL, 0, 0};
hr = pDisp->Invoke(DispId, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &disps, NULL, NULL, NULL);
if(SUCCEEDED(hr))
{
ShowMessage("Invoke OK");
}
我能正确调用GetIDsOfNames并获得Dispid,但是调用Invoke是,返回值正确,但是实际上,Excel的进程并没有结束。
本来是想调用Visible这个属性的。但是他需要传递参数,也不知道参数的哪里写错了,调用Visible时,返回的hr都是错的。代码如下(Visible属性的Dispid可以正确获得):
VariantInit(&vararg[0]);
disps.rgvarg = vararg;
disps.rgvarg[0].vt = varInteger;
disps.rgvarg[0].lVal = LOCALE_USER_DEFAULT;
disps.rgvarg[1].vt = varBoolean;
disps.rgvarg[1].boolVal = VARIANT_TRUE;
//disps.rgdispidNamedArgs = &DispId;
DISPID mydispid[1] = {DISPID_PROPERTYPUT};
disps.rgdispidNamedArgs = mydispid;
disps.cArgs = 2,
disps.cNamedArgs = 1;
hr = pDisp->Invoke(DispId, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYPUT, &disps, NULL, NULL, NULL);
if(SUCCEEDED(hr)) //返回错误
{
ShowMessage("Invoke OK");
}
怎么办
您可能想查找下面的文章:
- 实现了IDispatch接口的组件和ActiveX控件用起来有什么不同呢?我觉得一样可以用在Web页面上,为什么ActiveX控件还要多实现那么多各种各样
- 实现了IDispatch接口的组建,用vbscript怎么调用?
- MSFlexGrid有一个Picture属性,是一个IDispatch接口指针,请问如何操作?
- 怎样查询ActiveX控件的IDispatch接口每个ID代表函数
- MFC实现IDispatch接口问题?
- 如何hook住com接口的idispatch接口的虚函数invoke?
- IDispatch双接口,自动化,是一样的东西吗
- 如果一个组件实现IDispatch接口,那么能否是一个"自描述"的组件?
- C++SDK怎么使用IDispatch接口实现函数管理
- mfcdriller示例程序中,派生的IDispatch接口方法GetIDsOfNames的参数cNames是指什么?