Groups | Blog | Home
all groups > dotnet interop > june 2005 >

dotnet interop : how to Invoke Static .Net Members from COM application


mohammad via DotNetMonster.com
6/27/2005 8:41:50 PM
Hi,

I am trying to use my .Net component from COM application.
I have some static members in my .Net component.
I tried to use reflection to invoke static members.
Any body has example of invoking static members?

Thanks
Mohammad
namespace Mcc.TestAutomation.Utilities
{
public class MyStatics
{
static MyStatics()
{
}
public static void printHelloWorld()
{
Console.Out.WriteLine("Hello World!");
}
}
}
And Adam Nathan Book. But it can not call my static member
HRESULT InvokeStaticMember(BSTR typeName, BSTR memberName,
BindingFlags memberType, SAFEARRAY* parameters, VARIANT* retval)
{
HRESULT hresult;
IUnknown * pUnk = NULL;
_Object* pObj = NULL;
_Type* pType = NULL;
_Type* pTypeOfType = NULL;
_Type* pDesiredType = NULL;

VARIANT typeNameParam;
VARIANT getTypeRetVal;
VARIANT nullObject;

SAFEARRAY* psa;
LONG index;
BSTR getTypeName = SysAllocString(L"GetType");

VariantInit(&typeNameParam);
VariantInit(&getTypeRetVal);
VariantInit(&nullObject);

hresult = CoCreateInstance(CLSID_Object, NULL, CLSCTX_INPROC_SERVER,
IID_IUnknown, (void **)&pUnk);
if (FAILED(hresult)) goto cleanup;

//Get The object Interface so we can call GetType
hresult = pUnk->QueryInterface(IID__Object, (void **)&pObj);
if (FAILED(hresult)) goto cleanup;

hresult = pObj->GetType(&pType);
if (FAILED(hresult)) goto cleanup;

hresult = pType->GetType(&pTypeOfType);
if (FAILED(hresult)) goto cleanup;

psa = SafeArrayCreateVector(VT_VARIANT, 0, 1);
typeNameParam.vt = VT_BSTR;
typeNameParam.bstrVal = typeName;
index =0;

hresult = SafeArrayPutElement(psa, &index, &typeNameParam);
if (FAILED(hresult)) goto cleanup;

nullObject.vt = VT_EMPTY;
hresult = pTypeOfType->InvokeMember_3(getTypeName,
(BindingFlags)(BindingFlags_InvokeMethod | BindingFlags_Public |
BindingFlags_Static | BindingFlags_FlattenHierarchy), NULL,
nullObject, psa, &getTypeRetVal);
if (FAILED(hresult)) goto cleanup;

hresult = getTypeRetVal.punkVal->QueryInterface(IID__Type, (void **)
&pDesiredType);
if (FAILED(hresult)) goto cleanup;

hresult = pDesiredType->InvokeMember_3(memberName,
(BindingFlags) (memberType | BindingFlags_Public |
BindingFlags_Static | BindingFlags_FlattenHierarchy), NULL,
nullObject, parameters, retval);
if (FAILED(hresult)) goto cleanup;

cleanup:
if (pUnk) pUnk->Release();
if (pObj) pObj->Release();
if (pType) pType->Release();
if (pTypeOfType) pTypeOfType->Release();
if (pDesiredType) pDesiredType->Release();
if (getTypeName) SysFreeString(getTypeName);
SafeArrayDestroy(psa);
VariantClear(&typeNameParam);
VariantClear(&getTypeRetVal);
VariantClear(&nullObject);

return hresult;
mohammad via DotNetMonster.com
6/28/2005 9:23:19 PM
Here is the solution.

IUnknown* pUnk = NULL;
IDispatch* pDisp = NULL;
HRESULT hresult;
BSTR memberName;
_Type* pType = NULL;
_Type* pDesiredType = NULL;
VARIANT nullObject;
VARIANT retVal;
VariantInit(&nullObject);
VariantInit(&retVal);
nullObject.vt = VT_EMPTY;
_Object* pObj = NULL;

//initialize COM
hresult = CoInitialize(NULL);
if (FAILED(hresult))
{
printf("ERROR: Cannot initialize COM 0x%x\n", hresult);
return -1;
}

hresult = CoCreateInstance(CLSID_MyStatics, NULL, CLSCTX_INPROC_SERVER,
IID_IUnknown, (void **)&pUnk);
if (FAILED(hresult))
{
printf("ERROR: Cannot create object 0x%x\n", hresult);
return -1;
}
//Get The object Interface so we can call GetType
hresult = pUnk->QueryInterface(IID__MyStatics, (void **)&pObj);
if (FAILED(hresult))
{
printf("ERROR: Cannot obtain IDispatch interface pointer 0x%x\n",
hresult);
return -1;
}
hresult = pObj->GetType(&pType);
if (FAILED(hresult))
{
printf("ERROR: Cannot obtain IDispatch interface pointer 0x%x\n",
hresult);
return -1;
}
memberName = SysAllocString(L"printHelloWorld");

hresult = pType->InvokeMember_3(memberName,
(BindingFlags) (BindingFlags_InvokeMethod | BindingFlags_Public |
BindingFlags_Static | BindingFlags_FlattenHierarchy), NULL,
nullObject, NULL, &retVal);
if (FAILED(hresult))
{
printf("ERROR: Cannot obtain IDispatch interface pointer 0x%x\n",
hresult);
return -1;
}
CoUninitialize();

[quoted text, click to view]


--
Message posted via DotNetMonster.com
AddThis Social Bookmark Button