我在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 test = { VT_I4, 0, 0, 0 };
VARIANTARG vaResult;
DISPID dispidnamed = DISPID_PROPERTYPUT;
DISPPARAMS param = { &test, &dispidnamed, 1, 1 };
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
{
//printf("DispID of Visible=%d ",dispid);
hr = pDispatch->lpVtbl->Invoke(pDispatch,dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYPUT, ¶m, &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;
} 其中参数数组VARIANTARG test = { VT_I4, 0, 0, 0 }设置不对,请大家给看看应该如何设置?
{
*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 test = { VT_I4, 0, 0, 0 };
VARIANTARG vaResult;
DISPID dispidnamed = DISPID_PROPERTYPUT;
DISPPARAMS param = { &test, &dispidnamed, 1, 1 };
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
{
//printf("DispID of Visible=%d ",dispid);
hr = pDispatch->lpVtbl->Invoke(pDispatch,dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYPUT, ¶m, &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;
} 其中参数数组VARIANTARG test = { VT_I4, 0, 0, 0 }设置不对,请大家给看看应该如何设置?
DISPPARAMS disp = { pvars, NULL, 3, 0 };
pvars[0] = a;
pvars[1] = b;
pvars[2] = total;
OLECHAR* szMember = L"Add";
DISPID dispid;
VARIANTARG test[3];
VARIANT arg1,arg2;
//第一个参数
arg0.vt= VT_I4;
arg0.lVal = 1;
//第二个参数
arg1.vt= VT_I4;
arg1.lVal = 2;
//返回值参数
arg2.vt= VT_I4; test[0]=arg0;
test[1]=arg1;
test[2]=arg2; VARIANTARG vaResult;
dispparamsArgs.rgvarg=vargs; DISPID dispid;
DISPPARAMS param = {NULL, NULL, 0, 0};
param.rgvarg=test;
param.cArgs = 3;