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 Delphi6 + MakeObjectInstance FreeObjectInstance (https://www.delphipraxis.net/2268-delphi6-makeobjectinstance-freeobjectinstance.html)

Motzi 15. Jan 2003 13:25


Delphi6 + MakeObjectInstance FreeObjectInstance
 
Hi!

Seit ich mein Projekt auf Delphi 6 konvertiert hab bekomm ich immer die Warnung "Symbol 'MakeObjectInstance is deprecated" (detto für FreeObjectInstance). Gibt es seit Delphi6 neue Möglichkeiten einem Fenster mittels SubClassing eine Objekt-Methode als neue Window-Procedure unterzuschieben :?:

[edit=Sakura]Leerzeichen in Überschrift gesetzt, zwecks Listendarstellung[/edit]

X-Dragon 15. Jan 2003 13:47

Ich hab zwar keine Lösung aber ein ähnliches Problem :).

In meinem Projekt wird es verursacht durch eine Komponente die wohl nicht ganz Delphi6-Kompatibel ist.

Meine Warnmeldung:

Symbol 'AllocateHWnd' is deprecated
Symbol 'DeAllocatedHWnd' is deprecated

Da meine Suche, vor einigen Wochen, nach einer Lösung vergeblich war und es auch mit diesen Warnungen einwandfrei funktioniert, hab ich es bisher einfach ignoriert.

Aber wenn ich nicht der einzige bin, mit so einer art Fehlermeldung gibts ja vielleicht noch Hoffnung :).

jbg 15. Jan 2003 15:31

deprecated bedeutet, dass die Funktion "veraltet" ist. In der Online Hilfe steht sicherlich näheres zu diesen Funktionen, und ob sie überhaupt noch gebraucht werden.


Die Funktionen AllocateHWnd und DeallocateHWnd wurden aus der Forms.pas in die Classes.pas verschoben. Aus Kompatiblitätsgründen ist die Aufruf der Forms.De/AllocateHWnd noch vorhanden. Es wird eine Warnung ausgegeben. Eine Lösung ist, die Reihenfolge der Units bei der Uses-Anwendung zu verauschen. Also zuerst Forms und dann Classes. Eine andere Lösung ist, dem Aufruf den Unitnamen voranzustellen.

Delphi-Quellcode:
wnd := Classes.AllocateHWnd(...);
Classes.DeallocateHWnd(Wnd);

Motzi 15. Jan 2003 16:22

Zitat:

Zitat von jbg
deprecated bedeutet, dass die Funktion "veraltet" ist. In der Online Hilfe steht sicherlich näheres zu diesen Funktionen, und ob sie überhaupt noch gebraucht werden.

Soweit hab ich das zwar auch noch verstanden, aber trotzdem danke! :wink:

Zitat:

Zitat von jbg
Die Funktionen AllocateHWnd und DeallocateHWnd wurden aus der Forms.pas in die Classes.pas verschoben. Aus Kompatiblitätsgründen ist die Aufruf der Forms.De/AllocateHWnd noch vorhanden. Es wird eine Warnung ausgegeben. Eine Lösung ist, die Reihenfolge der Units bei der Uses-Anwendung zu verauschen. Also zuerst Forms und dann Classes. Eine andere Lösung ist, dem Aufruf den Unitnamen voranzustellen.

Delphi-Quellcode:
wnd := Classes.AllocateHWnd(...);
Classes.DeallocateHWnd(Wnd);

Ich glaube nicht, dass das einzige eine Verschiebung aus der Unit Forms in die Unit Classes ist, denn sofern MakeObjectInstance/FreeObjectInstance "veraltet" ist, so muss das auch für die Funktionen AllocateHwnd/DeallocateHwnd gelten, denn diese verwenden intern die Funktionen MakeObjectInstance/FreeObjectInstance! Zu AllocateHwnd bzw DeallocateHwnd steht nix wirklich hilfreiches in der OH und über MakeObjectInstance schweigt sie sich überhaupt ganz aus...

X-Dragon 16. Jan 2003 08:50

Zitat:

Zitat von jbg
deprecated ...
Die Funktionen AllocateHWnd und DeallocateHWnd wurden aus der Forms.pas in die Classes.pas verschoben. Aus Kompatiblitätsgründen ist die Aufruf der Forms.De/AllocateHWnd noch vorhanden. Es wird eine Warnung ausgegeben. Eine Lösung ist, die Reihenfolge der Units bei der Uses-Anwendung zu verauschen. Also zuerst Forms und dann Classes. Eine andere Lösung ist, dem Aufruf den Unitnamen voranzustellen.

Delphi-Quellcode:
wnd := Classes.AllocateHWnd(...);
Classes.DeallocateHWnd(Wnd);

Ah danke. Hab jetzt ein "Classes." jeweils vorgeschrieben und die Warnung ist weg :).
Hätte man ja vielleicht auch über die Windows-Suchfunktion rausfinden können, das der Befehl ausgelagert wurde ... :angle2:

@Motzi
Zitat:

Applies to: MakeObjectInstance and FreeObjectInstance (located in Forms.pas until Delphi 5. In Delphi 6, they are located in Classes.pas).
Quelle: http://codecentral.borland.com/codec...sting?id=16380
Jetzt hast du auch Ruhe vor den Warnungen :).

Motzi 16. Jan 2003 09:29

Zitat:

Zitat von X-Dragon
@Motzi
Zitat:

Applies to: MakeObjectInstance and FreeObjectInstance (located in Forms.pas until Delphi 5. In Delphi 6, they are located in Classes.pas).
Quelle: http://codecentral.borland.com/codec...sting?id=16380
Jetzt hast du auch Ruhe vor den Warnungen :).

Thx! Das hilft mir weiter! :bounce1:

sakura 18. Jan 2003 11:11

@X-Dragon:

Danke für den Link :!: Der hat mir mehr geholfen, als Du es auch nur erahnen kannst. http://codecentral.borland.com/codec...sting?id=16380

Titel des Beitrages des Links VCL leak fix for dynamic DLLs. Jeder, der mit der VCL mehr macht, als eine einfache Anwendung zu erstellen, sollte sich diesen Link genauer anschauen! Leider darf die Lösung nicht weitergegeben werden, da diese den auisdrücklich :!: Lizenzbesdingungen von Borland unterliegt. D.h., diese muss von jedem manuell eingearbeitet werden. Der Aufwand liegt bei ca. 10 Minuten, sollte aber gemacht werden.

Ich suche seit über einem Jahr nach einem Speicherloch in einer unserer Serverkomponenten und das scheint die Lösung zu sein. So ruhig lief unser Server noch nie...

Nutzt die Lösung. Mal sehen, ob sich noch etwas besseres findet. Voraussetzung für die Nutzung der Lösung sind die Source-Codes der VCL, d.h., eine Personal (oder Standard) Edition muss weiterhin mit dem Fehler leben.

Trost: Dieser Fehler existiert auch in allen MFC und Turbo Pascal :shock: Anwendungen, wer hätte das gedacht...
...:cat:...

P.S.: In Delphi 7 besteht der Fehler scheinbar noch immer :shock: Sämtliche Änderungen durch die angegebene Quelle fehlen...

jbg 18. Jan 2003 14:15

Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von sakura
Leider darf die Lösung nicht weitergegeben werden, da diese den auisdrücklich :!: Lizenzbesdingungen von Borland unterliegt. D.h., diese muss von jedem manuell eingearbeitet werden. Der Aufwand liegt bei ca. 10 Minuten, sollte aber gemacht werden.

Mit dieser Lizenzbedingung ist gemeint, dass man die Classes.pas nicht weitergeben darf. Man könnte aber ein Patch schreiben, der das Einarbeiten des verbesserten Codes ohne die 10 Minuten schafft.
Für die Programmierer, die den Classes.pas Quellcode nicht haben (Personal Edition) oder die die Datei nicht verändern wollen, habe ich eine Unit geschrieben, die die Funktionen MakeObjectInstance und FreeObjectInstance hooked. Somit wird beim Aufruf von MakeObjectInstance automatisch die Funktion FixedMakeObjectInstance aufgerufen. Um dies zu ermöglichen, muss die Unit als aller erste (ShareMem ausgeschlossen) Unit im Projektquellcode eingebunden werden.


Da die beiden Funktionen bei Delphi 5 noch in der Forms.pas liegen wird ein Aufruf von MakeObjectInstance, der durch TApplication.Create ausgelöst wird, nicht von FixedMakeObjectInstance abgefangen. Weil aber Application bis zum Programmende besteht, und nur 1x erzeugt wird, ist das nicht weiter schlimm.


Zitat:

In Delphi 7 besteht der Fehler scheinbar noch immer :shock: Sämtliche Änderungen durch die angegebene Quelle fehlen...
Meine Unit dürfte auch unter Delphi 7 funktionieren.


Der Classes Patch wird so installiert:
Code:
patch Classes.pas Classes.pas.diff


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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