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 Zitieren
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. Zitieren
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. Zitieren
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 Zitieren
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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.