AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Delphi6 + MakeObjectInstance FreeObjectInstance
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi6 + MakeObjectInstance FreeObjectInstance

Ein Thema von Motzi · begonnen am 15. Jan 2003 · letzter Beitrag vom 18. Jan 2003
Antwort Antwort
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#1

Delphi6 + MakeObjectInstance FreeObjectInstance

  Alt 15. Jan 2003, 13:25
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]
Manuel Pöter
  Mit Zitat antworten Zitat
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#2
  Alt 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 .
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3
  Alt 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);
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#4
  Alt 15. Jan 2003, 16:22
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!

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...
Manuel Pöter
  Mit Zitat antworten Zitat
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#5
  Alt 16. Jan 2003, 08:50
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 ...

@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 .
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#6
  Alt 16. Jan 2003, 09:29
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!
Manuel Pöter
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 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 Anwendungen, wer hätte das gedacht...
......

P.S.: In Delphi 7 besteht der Fehler scheinbar noch immer Sämtliche Änderungen durch die angegebene Quelle fehlen...
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8
  Alt 18. Jan 2003, 14:15
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 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
Angehängte Dateien
Dateityp: zip MakeObjInstanceFix.zip (1,8 KB, 37x aufgerufen)
Dateityp: zip ClassesPatch.zip (36,6 KB, 40x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 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