Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Plugin-DLL für ein USBLCD soll Daten an Hauptprogramm senden (https://www.delphipraxis.net/71586-plugin-dll-fuer-ein-usblcd-soll-daten-hauptprogramm-senden.html)

rage2001 17. Jun 2006 19:26


Plugin-DLL für ein USBLCD soll Daten an Hauptprogramm senden
 
Ich hab eine LCD-Display-Steuerung entwickelt, mit dem man ein Display mit 128 * 64 Pixeln per USB an einem PC anschließen kann und dafür auch eine Software geschrieben. (Wer die ct liest kennt das Projekt ja) Erweiterungen sollten per Plugin-DLLs die Software erweitern, das fuktioniert auch ganz prima. Doch sollen die DLLs selbstständig Daten an das Hauptprogramm schicken. Wie kann man das realisieren und vieleicht noch dabei ein Control mit in die DLL übergeben. Ich habe das probiert in dem ich folgende Zeilen verwendet habe:


Delphi-Quellcode:
var Controller: TrageVC;

Procedure InitDLL(cntrl:Pointer);stdcall;
begin
  Controller:= Pointer^;
end;
Und im Hauptprogramm:

Delphi-Quellcode:
InitDll(Pointer(Controller);
Auf diese Art und Weise habe ich gehofft, daß ich von der DLL heraus das Control benutzen könnte. Aber leider gibt es ausser einer ASV nichts brauchbares.
Sicherlich könnte man das mit einer Callback-Routine erledigen, aber alles was hier im Forum darüber gelesen hat mich auch nicht unbeding weiter gebracht.

CalganX 17. Jun 2006 19:29

Re: DLL soll Daten selbstständig an das Hauptprogramm schick
 
Hi,
wegen den Schutzverletzungen: hast du sowohl im Hauptprogramm als auch in der DLL die Unit ShareMem eingebunden? Du brauchst den Speichermanager von Delphi, damit du Pointer-Typen problemlos verwenden kannst.

Chris

arbu man 17. Jun 2006 19:32

Re: DLL soll Daten selbstständig an das Hauptprogramm schick
 
Da kann ich helfen :)


Erst der Code für die DLL:
Delphi-Quellcode:
var
  listen:  procedure(command: integer; msg: PChar);

begin
  @listen:=derpointer;
  listen(c,args);
end;
Jetzt die Exe:
Delphi-Quellcode:

procedure mylisten(command: integer; msg: PChar);
begin
  // mach was
end;

begin
  derpointer:= @mylisten;
end;
Edit: Mei mir geht es ohne Sharemem

andimx 17. Jun 2006 19:48

Re: Plugin-DLL für ein USBLCD soll Daten an Hauptprogramm se
 
Callback ist das einzige was da wirklich gut wäre.

Mit einer Callback schleife kannst du Compiler unabhängig einbindungen realisieren.

Hier mal ein Beispiel. Deklaration der Callback Schleife:

Delphi-Quellcode:
var MyCallback: procedure(const Param1: Integer; const Param2: WideString); stdcall;
Dann die funtion in der DLL:

Delphi-Quellcode:
function AssignCallback(Callback: Pointer): Boolean; stdcall; export;
begin
  Result := Assigned(Callback);
  if (Result) then MyCallback := Callback;
end;
Dann willst du ja irgendwann mal aus deiner DLL daten ans Hauptprogramm schicken:

Delphi-Quellcode:
function ProcRun: Boolean;
var x: Integer; p: WideString;
begin
   x := 100;
   p := 'Test';
   if Assigned(MyCallback) then MyCallback(x, p);
end;
Dynamischer Load und Einbindung ins Hauptprogramm:
Delphi-Quellcode:
var  xAssignCallback:function (callback: Pointeger): Boolean; stdcall;
.
.
  @xAssignCallback := GetProcAddress(hDll, 'AssignCallback');
.
.

Hauptprogramm:

procedure OnMyCallback(const Param1: Integer; const Param2: WideString); stdcall;
begin
end;

Procedure FormLoad(Sender: Tobject);
begin
  xAssignCallback(OnMyCallback);
end;
fertig.

gruß
Andi

rage2001 17. Jun 2006 19:56

Re: Plugin-DLL für ein USBLCD soll Daten an Hauptprogramm se
 
Hey, Danke an Euch alle schonemal. Da habe ich ja gleich ein paar Lösungsansätze, zumal mir die von andimx glaube ich am allerbesten gefällt. Ich werde das mal ausprobieren und dann melde ich mal Erfolg oder Mißerfolg.
Vielen Dank


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