AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Einem Callback eine Antwort geben?
Thema durchsuchen
Ansicht
Themen-Optionen

Einem Callback eine Antwort geben?

Ein Thema von mirage228 · begonnen am 3. Okt 2003 · letzter Beitrag vom 4. Okt 2003
Antwort Antwort
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#1

Einem Callback eine Antwort geben?

  Alt 3. Okt 2003, 21:48
Hallo,

in meinem Programm rufe ich eine Funktion einer DLL auf. Als Parameter dieser Funktion ist auch eine Callback-Prozedur drinne, die Anforderungen an mein Programm stellen kann. Nun wollte ich auf den Ruf dieser DLL-Funktionen antworten und der DLL die benötigten Daten geben.

Ist dies irgendwie möglich ?

Thx.
mirage228
David F.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Einem Callback eine Antwort geben?

  Alt 4. Okt 2003, 01:57
Moin Mirage,

ein kleines Beispiel dazu:

Delphi-Quellcode:
// Anwendung
type
  TcsCallback = procedure(const AsMessage : PChar);

  procedure CBApp(const ACallbackProc : TcsCallback); external 'callbackdll.dll';

implementation

{$R *.DFM}

procedure CalledBack(const AsMessage : PChar);
begin
  ShowMessage(AsMessage);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CBApp(CalledBack);
end;
Delphi-Quellcode:
// DLL
type
  TcsCallBack = procedure(const AsMessage : PChar);

procedure CBApp(const ApCallback : TcsCallback);
begin
  ApCallback('TEST');
end;

exports CBApp;
Die Typendeklaration sollte man am Besten in eine Unit auslagern, die dann von beiden eingebunden wird.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Einem Callback eine Antwort geben?

  Alt 4. Okt 2003, 08:39
Hi Christian,

danke für deinen Rat. Nur leider war ich soweit bereits.

also, wie du ja im beispiel gezeigt hast, gibt die DLL ein Callback. Die Message wird nun angezeigt. Sagen wir ich wollte der DLL etwas zurückschreiben.

Ich dachte mir das so, dass ich in dem TcsCallback die übergebene Variable noch einmal verändere und zurück schreibe und die DLL das dan Weiterverarbeiten kann.

Beispiel:

Also in der DLL schicke ich ein Callback (ein String und ein Integer Parameter). In der Anwendung sind bestimmte Integer als Konstanten, wie z.B. "GIBMIR_DOCUMENT_TEXT" deklariert. In den String wollte ich dann den Text des aktuellen Dokumentes zurückschreiben, sodass die DLL damit was anfangen bzw. weiterverarbeiten kann.

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Einem Callback eine Antwort geben?

  Alt 4. Okt 2003, 10:14
Da DLL und Anwendung im selben Adressraum liegen, sollte das eigentlich gehen:

Delphi-Quellcode:
// Anwendung
type
  TcsCallback = procedure(var AsMessage : PChar);

  procedure CBApp(const ACallbackProc : TcsCallback); external 'callbackdll.dll';

implementation

{$R *.DFM} 

procedure CalledBack(var AsMessage : PChar);
begin
  ShowMessage(AsMessage);
  AsMessage := AsMessage + ' - ' + DateTimetoStr(now);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CBApp(CalledBack);
end;
Delphi-Quellcode:
// DLL
type
  TcsCallBack = procedure(var AsMessage : PChar);

procedure CBApp(const ApCallback : TcsCallback);
var
  AsMessage: PChar;
begin
  AsMessage := 'TEST';
  ApCallback(AsMessage); //jetzt wird der Wert in der Funktion verändert
  ShowMessage(AsMessage); //kann jetzt <> 'TEST' sein
end;

exports CBApp;
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Einem Callback eine Antwort geben?

  Alt 4. Okt 2003, 11:17
Hi Chewie,

funktioniert soweit, nur habe ich noch ein kleines Problem. Undzwar eine Fehlermeldung (am Ende des Codes)

in meiner Anwendungs siehts so aus
Delphi-Quellcode:
unit uTools;

interface

uses Windows, Forms, Dialogs, SysUtils, ShellAPI;

type
  TCallBack = procedure(iMsg: Integer; var sMessage: PChar);
  TDLLCall = procedure(const Callback: TCallBack);
  THandle = integer;

type
  TAlphaCodeTool = class

  private
    fFileName: String;
    fParameter: String;

  public
    property filename: string read fFileName write fFileName;
    property parameter: string read fParameter write fParameter;

    constructor Create(Filename, Param: string);

    procedure CallTool(const Callback: TCallback);
    procedure DLL_CallBack(iMsg: Integer; var sMessage: PChar);

    procedure Execute_Tool;
end;

const
  REQUEST_ACTIVE_DOCUMENT_TEXT = 1;
  REQUEST_ACTIVE_DOCUMENT_FILENAME = 2;
  SET_ACTIVE_DOCUMENTS_TEXT = 3;
  SET_EDITORMOD = 4;
  OPERATION_LOAD_DOCUMENT = 5;
  OPERATION_LOAD_DOCUMENT_W = 6;
  REQUEST_USER_STRING = 10;

implementation

constructor TAlphaCodeTool.Create(FileName, Param: String);
begin
  self.filename := filename;
  self.parameter := param;
end;

procedure TAlphaCodeTool.CallTool(const Callback: TCallback);
var
  Handle: THandle;
  Call: TDLLCall;
begin
  Handle := LoadLibrary(PChar(filename));
  if Handle <> 0 then
  begin
    @Call := GetProcAddress(Handle, 'CallDLL');
    if @Call <> nil then
      Call(CallBack);
    FreeLibrary(Handle);
  end;
end;

procedure TAlphaCodeTool.DLL_CallBack(iMsg: Integer; var sMessage: PChar);
begin
  case iMsg of
    REQUEST_USER_STRING: begin
                           sMessage := PCHAR(InputBox(FileName, 'Bitte Wert eingeben', ''));
                         end;
  end;
end;

procedure TAlphaCodeTool.Execute_Tool;
begin
  if AnsiLowerCase(ExtractFileExt(FileName)) = '.dllthen
    CallTool(DLL_CallBack) else // <-- Fehlermeldung hier: Inkompatible Typen: Reguläre Prozedur und Methodenzeiger.
    ShellExecute(0, 'open', @filename, @parameter, nil, SW_SHOWNORMAL);
end;

end.
was ist falsch?

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Einem Callback eine Antwort geben?

  Alt 4. Okt 2003, 14:42
Moin Mirage,

wie die Fehlermeldung schon sagt:
Du müsstest die Adresse einer Prozedur, und nicht die einer Methode übergeben.

TAlphaCodeTool.DLL_CallBack ist aber die Methode der Klasse TAlphaCodeTool, und keine einfache Prozedur.
Wenn Du die aus der Klasse entfernst und als "normale" Prozedure einbindest müsste es gehen.
BTW: Das Problem hatten wir die letzte Zeit schon ein paar Mal.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Einem Callback eine Antwort geben?

  Alt 4. Okt 2003, 18:28
Hi Christian,

danke für den Hinweis.

Jetzt funktionierts

mfG
mirage228
David F.
  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:00 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