![]() |
IPropertyPage macht Problämchen
Hiho,
ich arbeite grade mit IPropertyPage um eine HTML-Seite in einem nonVCL-Prog dazustellen. Das ganze sieht so aus:
Delphi-Quellcode:
Das Problem ist nun, dass hinter dem Code in meiner Main-Procedure ploetzlich wahlweise na Exception oder ein Fehler 216 auftritt. Hat jemand ne Idee wo das passiert? ZB in welcher Unit.
WM_INITDIALOG:
begin // Load settings LoadRegistrySettings(hwnd); SendDlgItemMessage(hwnd, IDC_RICHEDIT_AGREEMENT, EM_SETBKGNDCOLOR, 0, RGB($DD, $DD, $DD)); SetWindowLong(GetDlgItem(hwnd, IDC_RICHEDIT_AGREEMENT), GWL_USERDATA, SetWindowLong(GetDlgItem(hwnd, IDC_RICHEDIT_AGREEMENT), GWL_WNDPROC, Integer(@RichEditSubclassWndProc))); CoInitialize(nil); lib := LoadLibrary('MSHTML.DLL'); if lib <> 0 then begin @CreateHTMLPropertyPage := GetProcAddress(lib, 'CreateHTMLPropertyPage'); if CreateURLMoniker(nil, 'http://www.erm.tu-cottbus.de/rules/crrules.shtml', pUrlMoniker) = S_OK then if CreateHTMLPropertyPage(pUrlMoniker, ppPropertyPage) = S_OK then begin pUrlMoniker._Release; GetWindowRect(GetDlgItem(hwnd, IDC_RICHEDIT_AGREEMENT), rect); ScreenToClient(hwnd, rect.TopLeft); ScreenToClient(hwnd, rect.BottomRight); DestroyWindow(GetDlgItem(hwnd, IDC_RICHEDIT_AGREEMENT)); ppPropertyPage.Activate(hwnd, rect, True); end; end; end; WM_CLOSE: begin // Close the dialog and end the message loop ppPropertyPage.Deactivate; ppPropertyPage._Release; FreeLibrary(lib); CoUninitialize; EndDialog(hwnd, wParam); end; Danke im Voraus Oliver |
Re: IPropertyPage macht Problämchen
Hier sind uebrigens die benutzten Units:
Delphi-Quellcode:
Plus natuerlich System und SysInit. Keine der obigen hat aber eine initialization oder finalization
uses
Messages, ActiveX, UrlMon, RichEdit, CommCtrl, Windows; |
Re: IPropertyPage macht Problämchen
Hi,
Hab zwar mit den Propertypages noch nicht rumgespielt und die lok. Variablen fehlen aber an Deinem Code ist mit trotzdem was aufgefallen. Warum verwendet du explizite Aufrufe von <interface>._Release ? Hast Du aus aus der MSDN-Hilfe und einem C++ Beispiel kopiert ? Wenn du mit Interfaces (oder Longstrings, dyn Arrays) arbeitest, initialisiert der Delphi Compiler Variablen von diesem Typ automatisch und sorgt bei Verlassen des Sichtbarkeitsbereichs automatisch für einen Aufruf von _Release für Interfaces ( bzw FreeMem für Strings , Dynarrays). Ich tippe darauf, das der Compiler bei deinem Beispiel sieht Wert von zB ppPropertyPage ist ungleich nil und jetzt versucht den automatischen _Release aufzurufen loszuwerden für ein Interface dessen DLL Du längst entladen hast. Ersetze mal die _release Aufrufe durch :
Delphi-Quellcode:
und
pUrlMoniker := nil;
Delphi-Quellcode:
Dann sollten IMHO die Probleme weg sein
ppPropertyPage := nil;
Grüsse Bernd |
Re: IPropertyPage macht Problämchen
Hallo Bernd,
dank dir, das war es tatsaechlich. Das gibt doch glattweg ein Bienchen von mir :) ![]() Uebrigens, das Release von pUrlMoniker war auch im Beispielcode von MS gegeben. Vielleicht handhabt der C-Compiler das ja anders ;) Ich danke dir zumindest nochmal ;) |
Re: IPropertyPage macht Problämchen
Hi
Zitat:
Das gleiche gilt im übrigen für fast alle Aufrufe von _Release,die Dir in C++ Programmen über den Weg laufen. Grüsse Bernd |
Re: IPropertyPage macht Problämchen
Danke, das ist doch mal ein wertvoller Hinweis ;)
Borland wird sich schon was dabei gedacht haben, wenn die ganzen Methoden ploetzlich nen Unterstrich bekommen. Ausserdem hatte Hagen mal so ein schoenes Beispiel, wie man Interfaces in Delphi im Sinne von try finally missbrauchen kann ... so gesehen haette ich schon fast selber drauf kommen muesen. Oliver |
Re: IPropertyPage macht Problämchen
Eine Ausnahme gibt es aber. Transliert man C++ Source und dieser ruft explizit ._AddRef auf so muß das dazugehörige ._Release drinnen bleiben. Im C++ Source sollten dann zwei ._Release nacheinander vorkommen.
Gruß hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz