CLR Hosting in C++ : how to use Type.InvokeMember with out Parameter
I'm doing some work with CLR Hosting (with C++). I followed the sample
that microsoft provided and I can load .net runtime and load assemblies,
create some object instance and so on.
Now I have a question about using _Type.InvokeMember.
virtual HRESULT __stdcall InvokeMember (
/*[in]*/ BSTR name,
/*[in]*/ enum BindingFlags invokeAttr,
/*[in]*/ struct _Binder * Binder,
/*[in]*/ VARIANT Target,
/*[in]*/ SAFEARRAY * args,
/*[in]*/ SAFEARRAY * modifiers,
/*[in]*/ struct _CultureInfo * culture,
/*[in]*/ SAFEARRAY * namedParameters,
/*[out,retval]*/ VARIANT * pRetVal ) = 0;
I can use other overload version of it to invoke the object method
successfully. However, now I want to invoke a method with a out/ref
parameter like:
double TestOutParam(out double output);
The tricky part is the modifiers. I've tried passing a boolean array or
even creating a dotnet ParameterModifier to fill with it. All I get is
0x80131533. COR_E_SAFEARRAYTYPEMISMATCH.
Here is my sample code:
CComSafeArray<VARIANT> parameters; //The InvokeMember Args Array
parameters.Create(2L,0L);
parameters.SetAt(0,_variant_t(input)); //The first parameter
double dbResult=0;
_variant_t outParam,vtOutput;
outParam.vt= VT_R8;
outParam.dblVal=0;
parameters.SetAt(1,outParam,0);//The second parameter
CComSafeArray<VARIANT> parameterMods; //The ParameterModifier Array
parameterMods.Create(1L,0L);
auto parameterModifier=DotNetParameterModifier::Create(2); //Create a
dotnet ParameterModifier
parameterModifier->SetItem(0,false);
parameterModifier->SetItem(1,true);//Set 2nd item to true, means the 2nd
parameter is out parameter
parameterMods.SetAt(0,parameterModifier->GetVtObject(),0);//GetVtObject
return the VARIANT point the ParameterModifier
/*A wrapper of the _type.InvokeMember. The actual code is
HRESULT hr = _typePtr->InvokeMember(bstrMethodName,
static_cast<BindingFlags>(
BindingFlags_InvokeMethod | BindingFlags_Instance | BindingFlags_Public),
NULL, vtObject,parameters, parameterModifier,NULL,NULL,&vtRetValue);
*/
_variant_t
boolResult=this->InvokeMember("TestOutParam",parameters,parameterMods);
parameterMods.Destroy();
parameters.Destroy();
if(boolResult.boolVal)
return outParam.dblVal;
return 0;
Somebody have any idea?
No comments:
Post a Comment