Implementing Unmanaged Interface in C#

S

Saad

Hi,

I have an unmanged interface which i have exposed through COM to C#. I
have been able to implement the interface in one of the C# classes
(say Class1) as well.

But now what i want to do is that i need to pass the reference of the
object of Class1 to this COM wrapper...and then from inside that
wrapper i want to call one of the func of that class1.

What i did roughly is something like this:

/
*********************************************************************************************************/
//this is the interface that was exposed
// IExportedClassWrapper
[
object,
uuid("7DD5445A-A8AE-471C-A065-629C3A004362"),
dual, helpstring("IExportedClassWrapper Interface"),
pointer_default(unique)
]
__interface IExportedClassWrapper : IDispatch
{
[id(4), helpstring("method CheckInterfaceOne")] HRESULT
CheckInterfaceOne(IDispatch* a, [out,retval] LONG* RetParam);
};
/
*********************************************************************************************************/

/
*********************************************************************************************************/
STDMETHODIMP CExportedClassWrapper::CheckInterfaceOne(IDispatch* a,
LONG* RetParam)
{
// TODO: Add your implementation code here
IExportedClassWrapper* objI = static_cast<IExportedClassWrapper*>(a);

//THIS IS THE LINE ON WHICH I'M GETTING EXCEPTION
//SAYING THAT THE CALLING CONVENTION IS NOT RIGHT....
objI->MethodSampleReturn(RetParam);

return S_OK;
}
/
*********************************************************************************************************/

/
*********************************************************************************************************/
//then the C# class implemented it like
public class Class1 : SampleCISCOATLCOMWrapper.IExportedClassWrapper
{
public Class1()
{
//
// TODO: Add constructor logic here
//
}

#region IExportedClassWrapper Members

public int CheckInterfaceOne(object a)
{
// TODO: Add Class1.CheckInterfaceOne implementation
//THIS IS THE METHOD
THAT I WANT TO CALL FROM COM
return 20;
}

#endregion
}
/
*********************************************************************************************************/
//and then i used this interface like this in C#

SampleCISCOATLCOMWrapper.CExportedClassWrapperClass objCl = new
SampleCISCOATLCOMWrapper.CExportedClassWrapperClass();

Class1 objClass = new Class1();

int nRet = objCl.CheckInterfaceOne(objClass);
/
*********************************************************************************************************/

this whole thing is sort of circular....:)

I think you got an idea of what i want to do...
Is it possible? :)
And how?

Note: I dont have much experience in COM ...

Thanks,
Saad.
 
M

Martin Bonner

Hi,

I have an unmanged interface which i have exposed through COM to C#. I
have been able to implement the interface in one of the C# classes
(say Class1) as well.

But now what i want to do is that i need to pass the reference of the
object of Class1 to this COM wrapper...and then from inside that
wrapper i want to call one of the func of that class1.

/****************************************************************/
STDMETHODIMP CExportedClassWrapper::CheckInterfaceOne(IDispatch* a,
LONG* RetParam)
{
// TODO: Add your implementation code here
(Aside. you have added your implementation - remove the TODO comment.
IExportedClassWrapper* objI = static_cast<IExportedClassWrapper*>(a);

I suspect your problem is here. You are breaking the rules of COM,
and paying the price. If you have one interface pointer ("a" in this
case), and you want to get another one from it ("objI" in this case),
the *only* legitimate way to do so is to call a->QueryInterface. The
problem is almost certainly that the Interop code is passing in a
pointer to an IDispatch interface on some generic proxy. If you
QueryInterface for IExportedClassWrapper it will create a more
suitable proxy, and return you that pointer - but a simple static_cast
won't cut it.
//THIS IS THE LINE ON WHICH I'M GETTING EXCEPTION
//SAYING THAT THE CALLING CONVENTION IS NOT RIGHT....
objI->MethodSampleReturn(RetParam);

return S_OK;
}
/****************************************************************/
this whole thing is sort of circular....:) It often is!

I think you got an idea of what i want to do...
Is it possible? :)
And how?

Note: I dont have much experience in COM ...
Aah! Welcome to a world of pain :)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top