Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Callback Funktion programmieren (https://www.delphipraxis.net/215697-callback-funktion-programmieren.html)

paule32.jk 22. Aug 2024 13:42

Callback Funktion programmieren
 
Hallo,
ich habe zwei Pascal-Quellen, und ich möchte eine Callback-Funktion schreiben, aber ich scheitere daran:

Delphi-Quellcode:
unit misc;

interface
uses Windows, SysUtils;

type
    TMainCallback = procedure of object;

    function InitLibrary(Callback: TMainCallback): Boolean;

implementation
uses fpcmain;

function ErrorMessage(s: AnsiString): Boolean; cdecl; external dllname;

function InitLibrary(Callback: TMainCallback): Boolean;
begin
  DLLHandle := LoadLibrary('fpc-qt.dll');
  if DLLHandle = 0 then
  begin
    ErrorMessage('Error: DLL could not be loaded.');
    Halt(1);
  end;
  try
    Callback;
  finally
      FreeLibrary(DLLHandle);
      ReadLn;
      ExitProcess(0);
  end;
end;

end.
Delphi-Quellcode:
{$APPTYPE CONSOLE}
program fpcqt;
uses
  Windows,
  QCharClass,
  fpcmain in 'fpcmain.pas',
  misc in 'misc.pas';

var
    Callback: TMainCallback;

procedure EntryPoint;
var
    myQChar: QChar;
begin
    myQChar := QChar.Create;

    if myQChar.isDigit then
    WriteLn('ok') else
    WriteLn('not ok');
    Readln;
    myQChar.Free;
end;

begin
    Callback := EntryPoint;
    InitLibrary(Callback);
end.

milos 22. Aug 2024 13:51

AW: Callback Funktion programmieren
 
Du definerst TMainCallback als procedure of object, heisst die Prozedur muss in einer Klasse stehen. EntryPoint hingegen ist eine "globale Prozedur" und kann deswegen nicht zugewiesen werden. Du müsstest TMainCallback einfach als procedure definieren.

Delphi-Quellcode:
type
    TMainCallback = procedure;

paule32.jk 22. Aug 2024 15:36

AW: Callback Funktion programmieren
 
mercy - it works !

Mavarik 22. Aug 2024 18:20

AW: Callback Funktion programmieren
 
Zitat:

Zitat von paule32.jk (Beitrag 1540096)
mercy - it works !

emm...

Delphi-Quellcode:
if InitLibrary then
  EntryPoint;
Wofür der Callback...

Oder sollte der auf die DLL gehen?

Mavarik

paule32.jk 23. Aug 2024 21:04

AW: Callback Funktion programmieren
 
ich habe eine InitLibrary Funktion, in der der Callback in ein try except Block eingebettet ist:
Delphi-Quellcode:
{$ifdef FPC}
    {$mode delphi}{$H+}
{$else}
    {$APPTYPE CONSOLE}
{$endif}
program fpcqt;
uses
  {$ifdef win64}
  Windows,
  {$endif }
  appsettings in 'pas\appsettings.pas',
  misc in 'pas\misc.pas',
  fpcmain in 'pas\fpcmain.pas',
  QCharClass in 'pas\QCharClass.pas';

procedure EntryPoint(argc: Integer; argv: Array of String);
var
    myQChar: QChar;
begin
    myQChar := QChar.Create;

    if myQChar.isDigit then
    WriteLn('ok') else
    WriteLn('not ok');
    Readln;
    myQChar.Free;
end;

begin
    InitLibrary( EntryPoint );
end.
Delphi-Quellcode:
{$ifdef FPC}
    {$mode delphi}{$H+}
{$endif}
unit misc;

interface
uses
    {$ifdef win64}
    Windows,
    {$endif}
    SysUtils;

const DLLname = 'fpc-qt.dll';
type
    TMainCallback = procedure(argc: Integer; argv: Array of String);

    function InitLibrary(Callback: TMainCallback): Boolean;
    function ErrorMessage(s: AnsiString): Boolean; cdecl; external dllname;

implementation
uses fpcmain;

function InitLibrary(Callback: TMainCallback): Boolean;
begin
  DLLHandle := LoadLibrary('fpc-qt.dll');
  if DLLHandle = 0 then
  begin
    ErrorMessage('Error: DLL could not be loaded.');
    Halt(1);
  end;
  try
    Callback(ParamCount, ParamStr(1));
  finally
      FreeLibrary(DLLHandle);
      ReadLn;
      Halt(0);
  end;
end;

end.


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