AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi DLL Callback Pointerübergabe erwartet Variable
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Callback Pointerübergabe erwartet Variable

Ein Thema von Cyberaxx · begonnen am 28. Okt 2007 · letzter Beitrag vom 2. Nov 2007
Antwort Antwort
Seite 2 von 4     12 34      
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: DLL Callback Pointerübergabe erwartet Variable

  Alt 28. Okt 2007, 13:41
Genau diese Erleuchtung mit den Aufrufkonventionen wollte ich dir verschaffen. Und jetzt frag dich doch mal selbst: Welche Aufrufkonvention hat TCallbackProc? Und welche hat DllAufruf?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#12

Re: DLL Callback Pointerübergabe erwartet Variable

  Alt 28. Okt 2007, 13:56
Für mich jetzt im Moment beide die selben, ich weiß aber auch das es falsch ist sonst würds ja gehen...

Die Prozedur in der Main hängt doch nun aber nicht mehr an der Klasse selbst oder?
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: DLL Callback Pointerübergabe erwartet Variable

  Alt 28. Okt 2007, 13:59
Ja, du hast im Hauptprogramm jetzt eine echte Prozedur und keine Methode mehr.

In der Dll ist TCallbackProc doch explizit als stdcall deklariert, vermutlich weil du die Dll nicht Delphi-spezifisch machen willst. Wenn du jedoch weder stdcall noch register, pascal, cdecl oder safecall schreibst, wird automatisch register genommen. Mit anderen Worten: DllAufruf im Hauptprogramm hat die Aufrufkonvention register, die Dll will aber stdcall haben. Folglich musst du DllAufruf einfach als stdcall deklarieren.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#14

Re: DLL Callback Pointerübergabe erwartet Variable

  Alt 28. Okt 2007, 14:17
Hey danke das wars nun klappt es.

So viel habe ich mit DLLs noch nicht gearbeitet das ich da die Kleinigkeiten kenne
Eigentlich alles dumme Fehler
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#15

Re: DLL Callback Pointerübergabe erwartet Variable

  Alt 1. Nov 2007, 15:55
Hallo,

ich bin es noch einmal. Da es sich irgendwie noch auf das selbe Thema bezieht, hoffe ich das ich hier noch etwas hinzufügen darf,
da es noch etwas mit der Parameterübergabe zu tun hat. Falls nicht mach ich dann nen neues Thema auf.

Das klappt alles soweit, Wenn ich allerdings versuche die DLLs einem Item vom Typ TCollectionItem hinzuzufügen, kann ich auf nichts mehr zugreifen. Mir scheint als sei in dem Fall die Speicherverwaltung hin oder?

Delphi-Quellcode:
procedure TForm1.Btn_LoadClick(Sender: TObject);
begin
  if Opendialog.Execute then begin
    Lib := LoadLibrary(PChar(OpenDialog.FileName));

    if Lib = 0 then
      ShowMessage('Plugin konnte nicht geladen werden!');

    @PluginData := GetProcAddress(Lib, 'PluginData');
    PluginData(PPlugData);

    Self.JvListBox1.Items.Add(Format('Typ: %d', [PlugData.PluginType]));
    Self.JvListBox1.Items.Add(Format('Name: %s', [PlugData.PluginName]));
    Self.JvListBox1.Items.Add(Format('Author: %s', [PlugData.PluginAuthor]));
    Self.JvListBox1.Items.Add(Format('Version: %s', [PlugData.PluginVersion]));

    Btn_Config.Enabled := PlugData.PluginCanConfig;

    if Lib <> 0 then begin
      @PluginCallBack := GetProcAddress(Lib, 'SetCallBack');
      PluginCallBack(@DLLAufruf);
      end;

    end;
end;
Wenn ich das einfach so aufrufe, gibt es keine Probleme, auch beim laden mehrerer Plugins. Alle verrichten auch ihren Dienst so wie sie es sollen. Dort habe ich aber ja keine Übersicht der Plugins.

Eigentlich das gleiche wie Oben nur das ich jetzt noch ein CollectionItem dabei nutze.

Delphi-Quellcode:
type
  TPlugData = packed record
    PluginType: Integer;
    PluginCanConfig: Boolean;
    PluginName: PChar;
    PluginAuthor: PChar;
    PluginVersion: PChar;
  end;
  TPPlugData = ^TPlugData;

[...]

procedure TForm1.Btn_ManagerClick(Sender: TObject);
  var
    I: Integer;
    MC_Plugin: TMC_Plugin;
begin
  if Opendialog.Execute then begin
    Lib := LoadLibrary(PChar(OpenDialog.FileName));

    if Lib = 0 then
      ShowMessage('Plugin konnte nicht geladen werden!');

    @PluginData := GetProcAddress(Lib, 'PluginData');
    PluginData(PPlugData); // <-- TPPlugData - Lasse ich den EIntrag weg, kommt keine AV

    if Lib <> 0 then begin
      @PluginCallBack := GetProcAddress(Lib, 'SetCallBack');
      PluginCallBack(@DLLAufruf);

      MC_Plugin := FMC_Plugins.Add;
      MC_Plugin.Name := PlugData.PluginName;
      MC_Plugin.Author := PlugData.PluginAuthor;
      MC_Plugin.Version := PlugData.PluginVersion;
      MC_Plugin.Description := '';

      Self.JvStatusBar1.Panels[0].Text := InttoStr(FMC_Plugins.Count); // AV - Kann plötzlich nicht mehr auf Komponenten zugreifen
      end;

    end;
end;
Die Collection schaut so aus...
Delphi-Quellcode:
type
  TMC_Plugin = class(TCollectionItem)
  private
    FHandle: Cardinal;
    FFilename: String;
    FName: String;
    FAuthor: String;
    FDescription: String;
    FVersion: String;
    FPluginType: Integer;
    FCanConfig: Boolean;
    FStatus: Integer;
  public
    property Handle: Cardinal read FHandle write FHandle;
    property Filename: String read FFilename write FFilename;
    property Name: string read FName write FName;
    property Author: String read FAuthor write FAuthor;
    property Description: String read FDescription write FDescription;
    property Version: String read FVersion write FVersion;
    property PluginType: Integer read FPluginType write FPluginType;
    property CanConfig: Boolean read FCanConfig write FCanConfig;
    property Status: Integer read FStatus write FStatus;
  end;

type
  TMC_Plugins = class(TCollection)
  private
    function GetPlugins(Index: Integer): TMC_Plugin;
  public
    constructor Create;
    destructor Destroy; override;
    function Add: TMC_Plugin;
    function Del(Index: Integer): Boolean;
    property Plugins[Index: Integer]: TMC_Plugin read GetPlugins;
  end;
Dem Item kann ich die Recordwerte noch hinzufügen aber danach bricht alles zusammen.
Zitat:
---------------------------
Debugger Fault Notification
---------------------------
Project D:\Develop\Delphi\Projects\MediaCenter\Testanwendu ng.exe faulted with message: 'access violation at 0x0013f771: read of address 0xd8002829'. Process Stopped. Use Step or Run to continue.
---------------------------
OK
---------------------------
Ist es weil der Record keine feste Größe hat?
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#16

Re: DLL Callback Pointerübergabe erwartet Variable

  Alt 1. Nov 2007, 16:15
Wieso sollte denn der Record keine feste Grösse haben? Delphi erlaubt nur feste Strukturgrössen (wie auch C/C++).
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#17

Re: DLL Callback Pointerübergabe erwartet Variable

  Alt 1. Nov 2007, 16:19
Das weiß ich ja eben nicht, ich weiß nur das sobald ich die Funktion raus nehme die mir die Daten aus der DLL holt raus lasse bekomme ich keine AV. Nur in Verbindung mit der Collection taucht er auf nachdem ich ein Item hinzugefügt habe.
Dem Item kann ich auch noch die Daten des Records zuweisen, sobald ich aber auf irgendeine andere Komponente danach zugreiffen will kommt eine Zugriffsverletzung. Habe nichtmal ansatzweise eine Vermutung woran es liegen könnte...
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#18

Re: DLL Callback Pointerübergabe erwartet Variable

  Alt 1. Nov 2007, 16:22
Collection? Du arbeitest nicht zufällig mit Klassen und reischst diese von der DLL ins Hauptprogramm und umgekehrt?! hast du den Abschnitt ganz oben in der DLL gelesen der dort steht wenn man ein neues Projekt anlegt?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#19

Re: DLL Callback Pointerübergabe erwartet Variable

  Alt 1. Nov 2007, 16:25
Ja den habe ich gelesen, hast Du denn auch meine Posts gelesen

Die Collection dient nur in meiner Main App zu Verwaltung...
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: DLL Callback Pointerübergabe erwartet Variable

  Alt 1. Nov 2007, 16:28
Wie sieht denn TMC_Plugins.Add aus? Wird dort wirklich ein TMC_Plugin zurückgegeben oder nur ein TCollectionItem gecastet?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 12:15 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