πΠ Π°ΡΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π²Π°ΠΌ ΠΎ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ°Ρ Π² Π½ΠΎΠ²ΠΎΠΌ ΡΠ΅Π»ΠΈΠ·Π΅, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΡΠΎΠΏΡΡΡΠΈΠ»ΠΈ.
ΠΠΎΠ²Π°Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° Π΄Π»Ρ C++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² β V1114.
ΠΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π½Π°ΡΠ΅Π»Π΅Π½ΠΎ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΠΎΠΈΡΠΊΠΎΠΌ ΠΏΠΎΠ΄ΠΎΠ·ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ dynamic_cast ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ COM-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ. ΠΠ°ΡΠ°ΡΡΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π΄ΠΎΡΡΡΠΏΡ ΠΊ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ. ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅, ΡΡΠΎ Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Ρ COM-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ IDraw ΠΈ IShape, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΎΡ IUnknown. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΈΠ½ΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ:
`void foo(IDraw ptrIDraw) { IShape ptrIShape = dynamic_cast(ptrIDraw); if (ptrIShape) ptrIShape->GetArea(area); .... }
Π ΠΊΠΎΠ΄Π΅ Π²ΡΡΠ΅, Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ dynamic_cast. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ QueryInterface, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ COM-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ. Π Π΅Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²Ρ ΠΎΠ΄ΡΡ:
- ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°, ΡΡΠΎ ΠΊ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ;
- Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ;
- ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΡΡΡΠ»ΠΎΠΊ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ.
ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ:
`void foo(IDraw ptrIDraw) { IShape ptrIShape = nullptr; if (SUCCEEDED(ptrIDraw->QueryInterface(IID_IShape, &ptrIShape)) .... }
ΠΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π²Π°Ρ ΠΊΠΎΠ΄ Π±ΡΠ΄Π΅Ρ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½ΡΠΌ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ π
#PVS_Studio #cpp``Β· 22.10
ΠΠΈΠ½Π°ΠΌΠΈΠΊ ΠΊΠ°ΡΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅Π»ΡΠ·Ρ ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ! ΠΠΎΡΠ΅ΠΌΡ Π±Ρ Π½Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ CComQIPtr???
ΠΎΡΠ²Π΅ΡΠΈΡΡ
Π΅ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅Π½Ρ Π² ΡΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π΅
Π΅ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅Π½Ρ Π² ΡΡΠΎΠΌ ΡΠΎΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π΅
Π²ΠΎΠΉΠ΄ΠΈΡΠ΅, ΡΡΠΎΠ±Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ
ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΠΏΡΠΎΡΠΈ