Click here to Skip to main content
16,006,749 members
Home / Discussions / C / C++ / MFC
   

C / C++ / MFC

 
GeneralRe: C2676 Pin
Joaquín M López Muñoz13-Feb-02 3:55
Joaquín M López Muñoz13-Feb-02 3:55 
Generalthank you Pin
13-Feb-02 4:01
suss13-Feb-02 4:01 
GeneralRetrieve program location Pin
radix13-Feb-02 3:21
radix13-Feb-02 3:21 
GeneralRe: Retrieve program location Pin
Joaquín M López Muñoz13-Feb-02 3:29
Joaquín M López Muñoz13-Feb-02 3:29 
GeneralRe: Retrieve program location Pin
radix13-Feb-02 15:06
radix13-Feb-02 15:06 
GeneralBuild project Pin
Kishore Ratna P13-Feb-02 3:10
Kishore Ratna P13-Feb-02 3:10 
GeneralRe: Build project Pin
Nish Nishant13-Feb-02 3:15
sitebuilderNish Nishant13-Feb-02 3:15 
GeneralSafe Array and COM + Pin
13-Feb-02 3:13
suss13-Feb-02 3:13 
I have written a function that given an Interface GUID, class name, method name, and parameters; it will execute the method. Now I need to get the return values for byref parameters.

I call invoke as follows

hr = pdisp->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&dispparams,pval,&excep,&uArgErr);

Now I want to return the values of dispparams.rgvarg out through a safe array.

Can anyone help??
Confused | :confused:

-------------------------------
STDMETHODIMP CClassWrapper::RunMethod(BSTR strIIDImplemented, BSTR strClassName, BSTR strFunctionName, INT intArgCount, VARIANT * ArgType, VARIANT * ArgVals, VARIANT * ArgValsRet, VARIANT *pval)
{

HRESULT hr = S_OK; // Result code
IID ImplemInteface; // Interface to implement
CLSID clsid; // CLSID of ActiveX object.
LPDISPATCH pdisp = NULL; // IDispatch of ActiveX object.
DISPID dispid; //dispatch id of function


//get the Interface Pointer from Giud passed in
hr = IIDFromString(strIIDImplemented,&ImplemInteface);


if (FAILED(hr))
{

return hr;
}

// Retrieve CLSID from the ProgID that the user specified.
hr = CLSIDFromProgID(strClassName, &clsid);
if (FAILED(hr))
{

return hr;
}

//init com
hr = OleInitialize(NULL);

// create object
hr = CoCreateInstance(clsid, NULL, CLSCTX_SERVER, ImplemInteface, reinterpret_cast<void**>(&pdisp) );
if (FAILED(hr))
{
CoUninitialize();
return hr;
}

//get id for function
hr = pdisp->GetIDsOfNames(IID_NULL,&strFunctionName,1, LOCALE_SYSTEM_DEFAULT,&dispid);
if (FAILED(hr))
{
CoUninitialize();
return hr;
}


SAFEARRAY *sa, *saTypes, *saReturn, *saDisp ;
sa = (*ArgVals->pparray);
saTypes = (*ArgType->pparray);

if(pval) ::VariantClear(pval);

DISPPARAMS dispparams = {NULL,NULL,0,0};

if (intArgCount > 0 )
{
dispparams.cArgs = intArgCount;
dispparams.cNamedArgs = 0;
dispparams.rgdispidNamedArgs = NULL;
dispparams.rgvarg = new VARIANTARG[intArgCount];


VARIANT* rgElems, *rgElemsTypes, *rgElemRets;
SafeArrayAccessData(sa, (LPVOID*)&rgElems);
SafeArrayAccessData(saTypes, (LPVOID*)&rgElemsTypes);

for(int i=intArgCount-1;i>=0;i--)
{
switch (rgElemsTypes[i].intVal)
{

case VT_UI1:
dispparams.rgvarg[i].vt = VT_UI1;
dispparams.rgvarg[i].bVal = rgElems[i].bVal;
break;
case VT_I2:
dispparams.rgvarg[i].vt = VT_I2;
dispparams.rgvarg[i].iVal = rgElems[i].iVal;
break;
case VT_I4:
dispparams.rgvarg[i].vt = VT_I4;
dispparams.rgvarg[i].lVal = rgElems[i].lVal;
break;
case VT_R4:
dispparams.rgvarg[i].vt = VT_R4;
dispparams.rgvarg[i].fltVal = rgElems[i].fltVal;
break;
case VT_BOOL:
dispparams.rgvarg[i].vt = VT_BOOL;
dispparams.rgvarg[i].boolVal = rgElems[i].boolVal;
break;
case VT_CY:
dispparams.rgvarg[i].vt = VT_CY;
dispparams.rgvarg[i].cyVal = rgElems[i].cyVal;
break;
case VT_BSTR:
dispparams.rgvarg[i].vt = VT_BSTR;
dispparams.rgvarg[i].bstrVal = rgElems[i].bstrVal;
break;
case VT_UNKNOWN:
dispparams.rgvarg[i].vt = VT_UNKNOWN;
dispparams.rgvarg[i].punkVal = rgElems[i].punkVal;
break;
case VT_DISPATCH:
dispparams.rgvarg[i].vt = VT_DISPATCH;
dispparams.rgvarg[i].pdispVal = rgElems[i].pdispVal;
break;
case VT_ARRAY:
dispparams.rgvarg[i].vt = VT_ARRAY;
dispparams.rgvarg[i].parray = rgElems[i].parray;
break;
case VT_VARIANT:
dispparams.rgvarg[i].vt = VT_VARIANT;
dispparams.rgvarg[i] = rgElems[i];
break;
default:
break;
}

}

SafeArrayUnaccessData(sa);
SafeArrayUnaccessData(saTypes);

EXCEPINFO excep;
UINT uArgErr;

hr = pdisp->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&dispparams,pval,&excep,&uArgErr);

}
else
{
EXCEPINFO excep;
UINT uArgErr;

hr = pdisp->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&dispparams,pval,&excep,&uArgErr);

}

//release com
CoUninitialize();


return hr;

}
GeneralRe: Safe Array and COM + Pin
Matt Philmon13-Feb-02 15:47
Matt Philmon13-Feb-02 15:47 
QuestionInterupts...???? Pin
alex.barylski13-Feb-02 2:58
alex.barylski13-Feb-02 2:58 
AnswerRe: Interupts...???? Pin
Nish Nishant13-Feb-02 3:11
sitebuilderNish Nishant13-Feb-02 3:11 
GeneralRe: Interupts...???? Pin
alex.barylski13-Feb-02 4:12
alex.barylski13-Feb-02 4:12 
QuestionFont size? Pin
JCY13-Feb-02 2:52
JCY13-Feb-02 2:52 
AnswerRe: Font size? Pin
alex.barylski13-Feb-02 2:59
alex.barylski13-Feb-02 2:59 
AnswerRe: Font size? Pin
Ravi Bhavnani13-Feb-02 3:00
professionalRavi Bhavnani13-Feb-02 3:00 
GeneralRenaming a file Pin
13-Feb-02 1:58
suss13-Feb-02 1:58 
GeneralRe: Renaming a file Pin
alex.barylski13-Feb-02 2:03
alex.barylski13-Feb-02 2:03 
GeneralRe: Renaming a file Pin
Mazdak13-Feb-02 2:13
Mazdak13-Feb-02 2:13 
GeneralRe: Renaming a file Pin
Nish Nishant13-Feb-02 2:18
sitebuilderNish Nishant13-Feb-02 2:18 
GeneralCommand Line and GUI Pin
13-Feb-02 1:46
suss13-Feb-02 1:46 
GeneralRe: Command Line and GUI Pin
alex.barylski13-Feb-02 2:02
alex.barylski13-Feb-02 2:02 
GeneralRe: Command Line and GUI Pin
Josh Knox (disabled)13-Feb-02 6:43
Josh Knox (disabled)13-Feb-02 6:43 
General::OpenPrinter() - Help !!! Pin
13-Feb-02 1:09
suss13-Feb-02 1:09 
GeneralRe: ::OpenPrinter() - Help !!! Pin
Shog913-Feb-02 7:16
sitebuilderShog913-Feb-02 7:16 
GeneralRe: ::OpenPrinter() - Help !!! Pin
13-Feb-02 21:36
suss13-Feb-02 21:36 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.