Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Modulkommunikation (https://www.delphipraxis.net/48082-modulkommunikation.html)

DGL-luke 20. Jun 2005 14:28


Modulkommunikation
 
gegeben sei diese dll:

Delphi-Quellcode:
library communicating;

uses .....

...

var mainhandle: hWND;
    request:integer;

const WM_REQUEST = WM_USER + 1;

function init(handle:hWND):boolean;
begin
hWND := handle;
result:=true;
end;

function requestarrayvalue(arrayindex:integer;elementindex:integer):integer;
begin
request:=-1;
sendmessage(mainhandle,WM_REQUEST,arrayindex,elementindex);
while request = -1 do delay(1);
end;

function setrequest(value:integer):boolean;
begin
request:=value;
end;

exports .....;
end.
kann so etwas funktionieren, wenn das hauptprogramm die message empfängt und dann setrequest aufruft? und lässt das delay das abarbeiten der setrequest-funktion zu? soweit ich weiss, ist es ja nicht so "streng" wie sleep;

gibt es eine modelllösung für die kommunikation von dll zu hauptprogramm?

DGL-luke 21. Jun 2005 20:20

Re: Modulkommunikation
 
*push*

soll ich es als kompliment nehmen, dass ihr nicht antwortet, weil meine fragen immer so anspruchsvoll sind,
oder wollt ihr mir zu verstehen geben, dass ihr mich nicht mögt und ich wieder gehen soll? :cry:

Bernhard Geyer 21. Jun 2005 20:29

Re: Modulkommunikation
 
Zitat:

Zitat von DGL-luke
soll ich es als kompliment nehmen, dass ihr nicht antwortet, weil meine fragen immer so anspruchsvoll sind,
oder wollt ihr mir zu verstehen geben, dass ihr mich nicht mögt und ich wieder gehen soll? :cry:

Ich denke es ist zu warm das man über alle fragen nachdenkt :cheers:

1, Du solltest für sowas eher PostMessages nehmen. Damit wird die Message sofort zugestellt.
2, Delay ist ganz schlecht, da dein Programm komplett angehalten wird (auch die abarbeitung der Message-Queue

Warum übergibst Du nicht einfach eine Callback-Message-Funktionspointer von der Exe in die DLL? Damit wird die Funktion sofort aufgerufen.

P.S. Wieso gibt es bei solch einem Wetter keinen schwitzenden Smiley? :gruebel:

DGL-luke 21. Jun 2005 20:37

Re: Modulkommunikation
 
um halb zehn schwitzt du noch? wie heiss muss es bei euch sein...

@Funktionspointer:

ja, der gedanke kam mir auch schon mal. das heisst, ich werfe der dll eine funktion zu, mit der sie bestimmte daten aus dem hauptprog holen kann? das ist ja direkt raffiniert... :-D

das muss doch andersrum auch gehen, oder?

ach ja, und wie rufe ich eine funktion auf, von der ich nur die adresse kenne? geht das über eine funktionsvariable?

Delphi-Quellcode:
var funktion:function;

function:=4566;

function(someparam);
wie geht sowas?

PS: pushen bringt ja doch was :shock:

jim_raynor 21. Jun 2005 20:42

Re: Modulkommunikation
 
Zitat:

Zitat von DGL-luke
kann so etwas funktionieren, wenn das hauptprogramm die message empfängt und dann setrequest aufruft? und lässt das delay das abarbeiten der setrequest-funktion zu? soweit ich weiss, ist es ja nicht so "streng" wie sleep;

Sehe es als Kompliment an ;) Ich würde dir raten es einfach auszuprobieren. Aber das Windows-SDK gibt doch schon etwas aufschluss dadrauf:

Zitat:

Zitat von SDK
If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, Windows switches to that thread and calls the appropriate window procedure. Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message.

Bedeutet, dass die Message-Funktion im Programm sofort aufgerufen wird, da ich davon ausgehen, dass es im gleichen Thread passiert. Das bedeutet, dass deine Schleife am Ende unnötig ist, da setRequest ja sowieso gleich aufgerufen wird.

P.S: Das ist meine Interpretation. Ungetestet und ohne davon Ahnung zu haben ;)

Bernhard Geyer 21. Jun 2005 20:53

Re: Modulkommunikation
 
Zitat:

Zitat von DGL-luke
um halb zehn schwitzt du noch? wie heiss muss es bei euch sein...

Hab gerade noch kreativ sein müssen ('nen kleinen Flyer). Bin aber schon beim Abkühlen :cheers:

Zitat:

Zitat von DGL-luke
@Funktionspointer:

ja, der gedanke kam mir auch schon mal. das heisst, ich werfe der dll eine funktion zu, mit der sie bestimmte daten aus dem hauptprog holen kann? das ist ja direkt raffiniert... :-D

das muss doch andersrum auch gehen, oder?

Du meinst von der Exe in die DLL. Machst Du doch wahrscheinlich schon die ganze Zeit. Sind doch die exportierten DLL-Funktionen.
Zitat:

Zitat von DGL-luke
ach ja, und wie rufe ich eine funktion auf, von der ich nur die adresse kenne? geht das über eine funktionsvariable?

Delphi-Quellcode:
type
  TMeinFunktionsprototyp=function(Param1, Param2: Integer): WordBool; stdcall;

var
  FktPtrFromExe: TMeinFunktionsprototyp;

procedure SetFuncPointer(FktPtr: TMeinFunktionsprototyp)
begin
  FktPtrFromExe := FktPtr
end;

function CallFktPtr((Param1, Param2: Integer): Boolean;
begin
  if Assigned(FktPtrFromExe) then
    result := FktPtrFromExe(Param1, Param2);
end;
Kein Kompilierungstest durchgeführt.

Zitat:

Zitat von DGL-luke
PS: pushen bringt ja doch was :shock:

Solang man nicht gegen die 24h-Regel verstößt und sich unbeliebt macht. :warn:
Ab und zu wird ja mal was übersehen.

DGL-luke 21. Jun 2005 21:36

Re: Modulkommunikation
 
auuuus....gezeichnet! [mit montgomery burns-stimme]

sobald ich meinen pc wieder funktionsfähig hab, wird das ausführlich getestet.

barf00s 22. Jun 2005 07:52

Re: Modulkommunikation
 
Zitat:

2, Delay ist ganz schlecht, da dein Programm komplett angehalten wird (auch die abarbeitung der Message-Queue
seit wann hält delay das programm an, Sleep() würde das machen, was man mit Delay ja umgeht ;) </senf>

Bernhard Geyer 22. Jun 2005 07:58

Re: Modulkommunikation
 
Zitat:

Zitat von barf00s
Zitat:

2, Delay ist ganz schlecht, da dein Programm komplett angehalten wird (auch die abarbeitung der Message-Queue
seit wann hält delay das programm an, Sleep() würde das machen, was man mit Delay ja umgeht ;) </senf>

Äh, war doch zu warm - oder zu viel Kühlung :stupid:


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