- 论坛徽章:
- 5
|
30可用积分
COM中有一个Add函数,其中参数a,b是输入值,total是输出值,如下:- static STDMETHODIMP Add(IExample2 *this, long a,long b,long *total)
- {
- *total=a+b;
- return(S_OK);
- }
复制代码 现在通过IDispatch中的GetIDsOfNames与invoke来调用Add方法:-
- #include <windows.h>
- #include <adoid.h>
- #include <stdio.h>
- int main(int argc, char* argv[])
- {
- char szName[200];
- char buf[200];
- CLSID clsid;
- HRESULT hr;
- IDispatch* pDispatch;
- OLECHAR* szMember = L"Add";
- DISPID dispid;
- VARIANTARG vaResult;
- DISPPARAMS params;
- VARIANTARG args[3];
- DISPID ids[3]={0,1,2};
- memset(args,0,sizeof(args));
- memset(¶ms,0,sizeof(params));
- args[0].vt=VT_I4;
- args[0].lVal =1;
- args[1].vt=VT_I4;
- args[1].lVal =2;
- args[2].vt=VT_I4;
- args[2].lVal =2;
-
- params.rgvarg=args;
- params.cArgs = 3;
-
- CoInitialize(0);
- hr = CLSIDFromProgID(L"IExample2.object", &clsid);
-
- hr=CoCreateInstance(&clsid, NULL, CLSCTX_ALL, &IID_IDispatch, (void **)&pDispatch);
-
- if ( SUCCEEDED ( hr ) )
- {
-
- WideCharToMultiByte(CP_ACP, 0, szMember, -1, szName, 256, NULL, NULL);
- pDispatch->lpVtbl->GetIDsOfNames(pDispatch,&IID_NULL, &szMember,1,LOCALE_SYSTEM_DEFAULT,&dispid);
- if(FAILED(hr))
- {
- printf("GetIDsOfNames failed");
- sprintf(buf,"GetIDsOfNames('%s') failed w/err 0x%08lx",szName,hr);
- }else
- {
- hr = pDispatch->lpVtbl->Invoke(pDispatch,dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYPUT, ¶ms, &vaResult, NULL, NULL);
- if(FAILED(hr))
- {
- printf("Invoke failed\n");
- sprintf(buf,"Invoke('%s'=%08lx) failed w/err 0x%08lx",szName,dispid,hr);
- }
- }
- }
- else
- {
- printf("GetIDsOfNames failed\n");
- printf("DispID of Visible 0x%08lx ",hr);
-
- }
-
- CoUninitialize();
- return 0;
- }
复制代码 其中主要是DISPPARAMS 结构体中的一些成员设置不对(主要是VARIANTARG的设置),请大家帮助给看看应该如何设置? |
最佳答案
查看完整内容
hr = pDispatch->lpVtbl->Invoke(pDispatch,dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD, &dms, &vaResult, NULL, NULL);
|