Return Interface Pointer
-
Hi! I am very new to COM and ATL and try to implement something like this: I have a simple COM server with the following interface:
[
object, ...
]
interface ITest : IUnknown
{
[id(1), helpstring("Methode GetInterface")] HRESULT GetInterface([in] int n, [out] ITest2** pITest2);
};The interface method
GetInterface
should return a new pointer to the interfaceITest2
. This function should not work likeQueryInterface
, the interfaceITest2
is not in the same coclass as theITest
, it's in another coclass. This function should work like the following DirectX (DirectDraw) functionCreateSurface
:LPDIRECTDRAW lpDD = NULL;
LPDIRECTDRAWSURFACE lpDDSPrimary = NULL;
...
HRESULT hError = lpDD->CreateSurface(&DDSurfaceDesc, &lpDDSPrimary, NULL);
...How can I implement the
GetInterface
function? TheITest2
interface (and the coclass of the interface) should not be creatable with theCoCreateInstance
, it should be only created by theGetInterface
method! Daniel ;) --------------------------- Never change a running system! -
Hi! I am very new to COM and ATL and try to implement something like this: I have a simple COM server with the following interface:
[
object, ...
]
interface ITest : IUnknown
{
[id(1), helpstring("Methode GetInterface")] HRESULT GetInterface([in] int n, [out] ITest2** pITest2);
};The interface method
GetInterface
should return a new pointer to the interfaceITest2
. This function should not work likeQueryInterface
, the interfaceITest2
is not in the same coclass as theITest
, it's in another coclass. This function should work like the following DirectX (DirectDraw) functionCreateSurface
:LPDIRECTDRAW lpDD = NULL;
LPDIRECTDRAWSURFACE lpDDSPrimary = NULL;
...
HRESULT hError = lpDD->CreateSurface(&DDSurfaceDesc, &lpDDSPrimary, NULL);
...How can I implement the
GetInterface
function? TheITest2
interface (and the coclass of the interface) should not be creatable with theCoCreateInstance
, it should be only created by theGetInterface
method! Daniel ;) --------------------------- Never change a running system! -
Hi! I am very new to COM and ATL and try to implement something like this: I have a simple COM server with the following interface:
[
object, ...
]
interface ITest : IUnknown
{
[id(1), helpstring("Methode GetInterface")] HRESULT GetInterface([in] int n, [out] ITest2** pITest2);
};The interface method
GetInterface
should return a new pointer to the interfaceITest2
. This function should not work likeQueryInterface
, the interfaceITest2
is not in the same coclass as theITest
, it's in another coclass. This function should work like the following DirectX (DirectDraw) functionCreateSurface
:LPDIRECTDRAW lpDD = NULL;
LPDIRECTDRAWSURFACE lpDDSPrimary = NULL;
...
HRESULT hError = lpDD->CreateSurface(&DDSurfaceDesc, &lpDDSPrimary, NULL);
...How can I implement the
GetInterface
function? TheITest2
interface (and the coclass of the interface) should not be creatable with theCoCreateInstance
, it should be only created by theGetInterface
method! Daniel ;) --------------------------- Never change a running system!If I didn't misunderstand you
static HRESULT CComObject::CreateInstance(CComObject** pp)
should be the solution to your problem. -
One solution is containment. Another solution is aggregation given that you want the client to gain direct access to the inner COM object. Kuphryn
Can you give my a sample application or a link to a tutorial? Thanks! Daniel ;) --------------------------- Never change a running system!
-
If I didn't misunderstand you
static HRESULT CComObject::CreateInstance(CComObject** pp)
should be the solution to your problem.Any sample or link to a tutorial? Thanks! Daniel ;) --------------------------- Never change a running system!
-
Any sample or link to a tutorial? Thanks! Daniel ;) --------------------------- Never change a running system!
Hello Daniel, I created a sample ATL project with two simple coclass's (Test and Test2). One of them, Test2 is specifically noncreatable. This noncreatble feature can be set easily by including the "noncreatable" attribute for the coclass statement in the IDL file : [ uuid(A6C64958-F337-4981-8F31-F35AEA02DD98), helpstring("Test2 Class"), noncreatable ] coclass Test2 { [default] interface ITest2; [default, source] dispinterface _ITest2Events; }; This attribute is very useful when your client apps are Visual Basic based. In VB, if a coclass is noncreatable, then when you attempt to create a new instance of it via the "New" keyword, e.g. : Dim Test2Obj As Test2 ... ... ... Set Test2Obj = New Test2 You will get an error message that reads : "Invalid use of New keyword". However, the "noncreatable" attribute is not sufficient for VC++ clients. In a VC++ client app, if you have the following statement : ITest2Ptr spTest2Ptr = NULL; spTest2Ptr.CreateInstance(__uuidof(Test2)); Surprise, surprise, you will still succeed and obtain an ITest2 smart pointer. In order to ensure that the above CreateInstance() function call will fail, you will need to comment out the Test2 Object Entry in the ATL Object Map of your ATL project : BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_Test, CTest) //OBJECT_ENTRY(CLSID_Test2, CTest2) <-- comment out this line. END_OBJECT_MAP() This will ensure that when your ATL DLL is asked to create an instance of an object of coclass Test2 (this happens in the global DllGetClassObject() function), a failure code will be returned. Note that the good thing about the "noncreatable" attribute and the commenting out of the OBJECT_ENTRY statement will not prevent you from internally creating the CTest2 object. This is, of course, required when the GetInterface() method is called. My implementation of GetInterface() is as follows : STDMETHODIMP CTest::GetInterface(int n, ITest2 **pITest2) { // TODO: Add your implementation code here CComObject *pTest2New = NULL; CComObject::CreateInstance(&pTest2New); if (pTest2New) { pTest2New -> QueryInterface (IID_ITest2, (void**)pITest2); } return S_OK; } I will email you the sample source codes plus VB and a VC++ client apps. Hope the aboe info will help. Best Regards, Bio.
-
Any sample or link to a tutorial? Thanks! Daniel ;) --------------------------- Never change a running system!
Hello Daniel, Please email me your email address so that I can send to you some sample codes. Best Regards, Bio.
-
Hello Daniel, Please email me your email address so that I can send to you some sample codes. Best Regards, Bio.
Thanks! It works fine! Cheers, Daniel. -- FIND A JOB YOU LOVE, AND YOU'LL NEVER HAVE TO WORK A DAY OF YOUR LIFE. ;)