Guybrush Threepwood Geschrieben 30. Januar 2003 Geschrieben 30. Januar 2003 Hi, wie kann ich überprüfen ob ein angeforderter Pointer auf eine COM Schnittstelle überhaupt gültig ist? Weil im nachfolgendem Code bekomme ich immer ein Access Violation: hFlash = GetDlgItem(hDlg,IDC_FLASH); if (hFlash == NULL) Fehler("hFlash == 0",0); AtlAxGetHost(hFlash,(IUnknown**)&pIFlashAmbient); if (pIFlashAmbient == NULL) Fehler("pIFlashAmbient == 0",0); pIFlashAmbient->put_BackColor(COLOR_WINDOW); //Access Violation [/PHP] Ich meine da mal was in der Art von IsValid() oder so gelesen zu haben, konnte es aber nicht mehr finden. Gruß Guybrush
Klotzkopp Geschrieben 30. Januar 2003 Geschrieben 30. Januar 2003 Was für ein Interfacepointer ist pIFlashAmbient? Ich bin mir nicht sicher, ob du nicht bei AfxAxGetHost wirklich ein IUnknown** angeben musst, und dir dann den Zeiger auf das richtige Interface mit QueryInterface holen musst.
Guybrush Threepwood Geschrieben 30. Januar 2003 Autor Geschrieben 30. Januar 2003 Der ist vom Typ IAxWinAmbientDispatch. Das könnte natürlich auch sein, allerding brauch ich dafür ja REFIID. Mal schauen ob ich die irgendwo finde.
Guybrush Threepwood Geschrieben 30. Januar 2003 Autor Geschrieben 30. Januar 2003 Ok, habs jetzt so gelöst wie du gesagt hast. Die letzte Zeile bewirkt zwar irgendwie nichts, aber wenigstens kommt keine Access Violation mehr. hFlash = GetDlgItem(hDlg,IDC_FLASH); if (hFlash == NULL) Fehler("hFlash == 0",0); AtlAxGetHost(hFlash,&pIUnknown); pIUnknown->QueryInterface(IID_IAxWinAmbientDispatch, (void**)&pIFlashAmbient); if (pIFlashAmbient == NULL) Fehler("pIFlashAmbient == 0",0); pIFlashAmbient->put_BackColor(COLOR_GRAYTEXT); [/PHP] Um nochmal zum Thema zurückzukommen, bewirkt es eigentlich etwas sinnvolles wenn ich den Interfacepointer auf NULL überprüfe? Danke! Gruß Guybrush
Klotzkopp Geschrieben 30. Januar 2003 Geschrieben 30. Januar 2003 Originally posted by Guybrush Threepwood Um nochmal zum Thema zurückzukommen, bewirkt es eigentlich etwas sinnvolles wenn ich den Interfacepointer auf NULL überprüfe?Sicher. Das Problem hier war aber kein Nullzeiger, sondern eine vtable, der so gar nicht da war. An der Stelle der vtable von IAxWinAmbientDispatch, an der put_BackColor steht, ist die vtable von IUnknown (die ja nur drei Einträge hat) schon lange vorbei. Aber das, was da steht, wird als Funktionszeiger interpretiert und aufgerufen. Da ist eine Schutzverletzung nicht weiter verwunderlich.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden