Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi IPropertyPage macht Problämchen (https://www.delphipraxis.net/11947-ipropertypage-macht-problaemchen.html)

Assarbad 17. Nov 2003 15:12


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:
    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;
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.

Danke im Voraus

Oliver

Assarbad 17. Nov 2003 15:21

Re: IPropertyPage macht Problämchen
 
Hier sind uebrigens die benutzten Units:

Delphi-Quellcode:
uses
  Messages,
  ActiveX,
  UrlMon,
  RichEdit,
  CommCtrl,
  Windows;
Plus natuerlich System und SysInit. Keine der obigen hat aber eine initialization oder finalization

Bernd Ua 17. Nov 2003 16:00

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:
pUrlMoniker := nil;
und
Delphi-Quellcode:
ppPropertyPage := nil;
Dann sollten IMHO die Probleme weg sein

Grüsse Bernd

Assarbad 17. Nov 2003 16:11

Re: IPropertyPage macht Problämchen
 
Hallo Bernd,

dank dir, das war es tatsaechlich. Das gibt doch glattweg ein Bienchen von mir :)
http://www.diebienemaja.de/images/im_biene_maja.gif

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 ;)

Bernd Ua 17. Nov 2003 16:16

Re: IPropertyPage macht Problämchen
 
Hi

Zitat:

Uebrigens, das Release von pUrlMoniker war auch im Beispielcode von MS gegeben. Vielleicht handhabt der C-Compiler das ja anders
Eben ! Er tut nämlich nix, da muss man alles zu fuss machen - deswegen nehmen wir ja Delphi :lol:

Das gleiche gilt im übrigen für fast alle Aufrufe von _Release,die Dir in C++ Programmen über den Weg laufen.

Grüsse Bernd

Assarbad 17. Nov 2003 16:39

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

negaH 18. Nov 2003 08:07

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 21:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz