FreeObjectInstance unter Win64

Antworten
Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

FreeObjectInstance unter Win64

Beitrag von Socke »

Hallo zusammen,

ich habe gerade die Cromis.DirectoryWatch Komponenten nach Unicode und Win64 portiert.
Das Demo-Programm läuft soweit auch zuverlässig, bis ich es beende und die Funktion FreeObjectInstance() aufgerufen wird.
Unter Win64 wird ein Run-time Error 211 ausgelöst - für Win32 gibt es in der Unit Classes eine Implementierung. Die Win64-Version löst aber nur den Run-time Error aus.

Weiß hier jemand Abhilfe?

Ähnlich war es bei der Funktion AllocateHWnd; hier gibt es aber über LCLIntf eine Implementierung des Widgetsets.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: FreeObjectInstance unter Win64

Beitrag von Socke »

Für alle, die vor dem selben Problem stehen:

Es geht im ganzen um folgende Methode:

Code: Alles auswählen

procedure TDirectoryWatch.DeallocateHWnd(Wnd: HWND);
var
  Instance: Pointer;
begin
  Instance := {%H-}Pointer(GetWindowLongPtr(Wnd, GWL_WNDPROC));
 
  if Instance <> Pointer(@DefWindowProc) then
  begin
    { make sure we restore the default
      windows procedure before freeing memory }

    SetWindowLongPtr(Wnd, GWL_WNDPROC, {%H-}LONG_PTR(@DefWindowProc));
    FreeObjectInstance(Instance)// Run-time error 211 auf x86_64
  end;
 
  DestroyWindow(Wnd);
end;

Meine Lösung ist jetzt anstatt dieser Methode einfach LCLIntf.DeallocateHWnd aufzurufen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: FreeObjectInstance unter Win64

Beitrag von Winni »

Hi!

Die fpc docs ergeben das:

Code: Alles auswählen

 211 Call to abstract method
    Your program tried to execute an abstract virtual method. Abstract methods should be overridden, and the overriding method should be called.


Winni

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: FreeObjectInstance unter Win64

Beitrag von Socke »

Hallo Winni,
das ist be folgender Implementierung irgendwie gar nicht verwunderlicht:

Code: Alles auswählen

    procedure FreeObjectInstance(ObjectInstance: Pointer);
      begin
        runerror(211);
      end;

https://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/rtl/win64/classes.pp?revision=41168&view=markup#l62
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten