Re: compilation error when using CComPtr w/ CUnknown-derived objects
Igor,
Thanks for your advice. After some more experimentations, I figured out that
reinterpret_cast was indeed a wrong cast. But most importantly, the order of
declaration of the classes and interfaces from which the class derives also
affects the results : if I declare CTest as:
class CTest : public CUnknown, public IUnknown
won't give the same results after casts than if I declare CTest as:
class CTest : public IUnknown, public CUnknown
Here are the results of my tests:
-------------
// Example #1, CTest declared as:
// class CTest : public CUnknown, public IUnknown
CComPtr<CTest> pTest1;
CComPtr<CTest> pTest2;
CComPtr<CTest> pTest3;
CTest* pTest4;
CTest* pTest5;
CTest* pTest6;
void Instantiate(void)
{
HRESULT hr = S_OK;
CUnknown* punk = CTest::CreateInstance(NULL, &hr); // OK: punk = 0x003e5e50
{a=0x00000003 b=0x00000006 }
pTest1 = static_cast<CTest*>(punk); // Corrupted: pTest1 = {0x003e5e60}, p
= 0x00c15e60 {a=0xabababab b=0x00000000 }
pTest2 = dynamic_cast<CTest*>(punk); // Corrupted: pTest2 = {0x003e5e60}, p
= 0x00c15e60 {a=0xabababab b=0x00000000 }
pTest3 = reinterpret_cast<CTest*>(punk); // Corrupted: pTest3 =
{0x003e5e60}, p = 0x00c15e60 {a=0xabababab b=0x00000000 }
pTest4 = static_cast<CTest*>(punk); // OK: pTest4 = 0x003e5e50
{a=0x00000003 b=0x00000006 }
pTest5 = dynamic_cast<CTest*>(punk); // OK: pTest5 = 0x003e5e50
{a=0x00000003 b=0x00000006 }
pTest6 = reinterpret_cast<CTest*>(punk); // OK: pTest6 = 0x003e5e50
{a=0x00000003 b=0x00000006 }
CTest* pTest7 = static_cast<CTest*>(punk); // OK: pTest7 = 0x003e5e50
{a=0x00000003 b=0x00000006 }
CTest* pTest8 = dynamic_cast<CTest*>(punk); // OK: pTest8 = 0x003e5e50
{a=0x00000003 b=0x00000006 }
CTest* pTest9 = reinterpret_cast<CTest*>(punk); // OK: pTest9 = 0x003e5e50
{a=0x00000003 b=0x00000006 }
CComPtr<CTest> pTestA = static_cast<CTest*>(punk); // OK: pTestA =
{0x003e5e50}, p = 0x003e5e50 {a=0x00000003 b=0x00000006 }
CComPtr<CTest> pTestB = dynamic_cast<CTest*>(punk); // OK: pTestB =
{0x003e5e50}, p = 0x003e5e50 {a=0x00000003 b=0x00000006 }
CComPtr<CTest> pTestC = reinterpret_cast<CTest*>(punk); // OK: pTestC =
{0x003e5e50}, p = 0x003e5e50 {a=0x00000003 b=0x00000006 }
}
// Example #2, CTest declared as:
// class CTest : public IUnknown, public CUnknown
CComPtr<CTest> pTest1;
CComPtr<CTest> pTest2;
CComPtr<CTest> pTest3;
CTest* pTest4;
CTest* pTest5;
CTest* pTest6;
void Instantiate(void)
{
HRESULT hr = S_OK;
CUnknown* punk = CTest::CreateInstance(NULL, &hr); // OK: punk = 0x00345e54
{a=0x00000003 b=0x00000006 }
pTest1 = static_cast<CTest*>(punk); // OK: pTest1 = {0x00345e50}, p =
0x00345e50 {a=0x00000003 b=0x00000006 }
pTest2 = dynamic_cast<CTest*>(punk); // OK: pTest2 = {0x00345e50}, p =
0x00345e50 {a=0x00000003 b=0x00000006 }
pTest3 = reinterpret_cast<CTest*>(punk); // Corrupted: pTest3 =
{0x00345e54}, p = 0x00345e54 {a=0x00000006 b=0xfdfdfdfd }
pTest4 = static_cast<CTest*>(punk); // OK: pTest4 = 0x00345e50
{a=0x00000003 b=0x00000006 }
pTest5 = dynamic_cast<CTest*>(punk); // OK: pTest5 = 0x00345e50
{a=0x00000003 b=0x00000006 }
pTest6 = reinterpret_cast<CTest*>(punk); // Corrupted: pTest6 = 0x00345e54
{a=0x00000006 b=0xfdfdfdfd }
CTest* pTest7 = static_cast<CTest*>(punk); // OK: pTest7 = 0x00345e50
{a=0x00000003 b=0x00000006 }
CTest* pTest8 = dynamic_cast<CTest*>(punk); // OK: pTest8 = 0x00345e50
{a=0x00000003 b=0x00000006 }
CTest* pTest9 = reinterpret_cast<CTest*>(punk); // Corrupted: pTest9 =
0x00345e54 {a=0x00000006 b=0xfdfdfdfd }
CComPtr<CTest> pTestA = static_cast<CTest*>(punk); // OK: pTestA =
{0x00345e50}, p = 0x00345e50 {a=0x00000003 b=0x00000006 }
CComPtr<CTest> pTestB = dynamic_cast<CTest*>(punk); // OK: pTestB =
{0x00345e50}, p = 0x00345e50 {a=0x00000003 b=0x00000006 }
CComPtr<CTest> pTestC = reinterpret_cast<CTest*>(punk); // Corrupted:
pTestC = {0x00345e54}, p = 0x00345e54 {a=0x00000006 b=0xfdfdfdfd }
}
-------------
Thank you.
--
No?l
http://noeld.com/