Toon posts:

[Delphi] Onverwachte data vanuit een functie of procedure

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een applicatie geschreven die via een specifiek secure protocol over UDP pakketjes ontvangt en verstuurd (Indy). Echter, omdat ik de send-, receive decode en encode functies graag nog meerdere malen wil gebruiken in andere applicaties leek het me gunstig deze onder te brengen in een DLL.

Echter, momenteel laat ik de applicatie, wanneer er een UDP pakket wordt ontvangen (met het OnUDPRead event) direct de ontvangen data in een TMemo schrijven. Hoe kan ik dit oplossen vanuit generieke functies?? Ik kan natuurlijk niet vanuit een functie of procedure in een DLL een Lines.Add(string) commando uitvoeren. De DLL is dan niet meer generiek.

Uiteraard zou ik een steeds een regel tekst via de return waarde van een functie terug laten sturen, maar hoe laat ik de applicatie dan weten dat de functie uitgevoerd moet worden om tekst binnen te halen??

Dit is op te lossen door met behulp van een timer iedere zoveel tijd de functie uit te voeren en indien er nieuwe data is deze te verwerken, maar erg elegant vind ik zo een methode niet.

Heeft er iemand betere ideeën?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Callback?

Professionele website nodig?


Verwijderd

Topicstarter
Hoe werkt callback?? Ik ben geen ontzettend ervaren Delphi programmeur (half jaartje bezig nu).

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

In de entry-functie van je DLL kun je ook een parameter meegeven met een functiepointer of een closure. De exacte syntax mogen Delphi-goeroes je vertellen, maar de essentie is dat je een functie meegeeft in het je hostprogramma, die de DLL whenever hij het nodig heeft aanroept.

Professionele website nodig?


Verwijderd

Topicstarter
Zeg maar, de DLL start een functie in het hostprogramma?? Mmm, ik heb daar zelf wel aan gedacht, maar ik twijfelde of dat 'mocht'. Dan worden er namelijk wel bepaalde eisen aan het hostprogramma gesteld (dat het een procedure heeft met naam: xxxWhatEverxxx). Mag dat??

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Verwijderd schreef op 11 September 2003 @ 13:17:
Zeg maar, de DLL start een functie in het hostprogramma??
Zoiets ongeveer.
Mmm, ik heb daar zelf wel aan gedacht, maar ik twijfelde of dat 'mocht'. Dan worden er namelijk wel bepaalde eisen aan het hostprogramma gesteld (dat het een procedure heeft met naam: xxxWhatEverxxx). Mag dat??
Nee, je DLL hoeft helemaal niet te weten hoe die functie noemt die hij moet uitvoeren.
Je hostprogramma geeft die functie mee aan de DLL. De DLL bewaart een functie-pointer naar die functie (hij bewaart dus het adres van die functie).
Wanneer dat nodig is, voert de DLL dan de functie uit op dat adres.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik ben trouwens even aan het lezen over Callback, dat lijkt me eigenlijk nog simpeler en eleganter. Ik denk dat ik daar maar eens naar ga kijken...

  • cimbom
  • Registratie: Juni 2001
  • Laatst online: 26-04-2024

cimbom

Just Kidding

Je zet een parameter bij je functie die tyope TStrings is.
bv.
ReadData(var blabla : TStrings);
begin

blabla.Add('asdas');
end;


Dan kun je gewoon zo aanroepen : ReadData(Memo1.Lines);

dan worden de gegevens automatisch in memo1 gezet.

Verwijderd

Topicstarter
Nee, je DLL hoeft helemaal niet te weten hoe die functie noemt die hij moet uitvoeren.
Je hostprogramma geeft die functie mee aan de DLL. De DLL bewaart een functie-pointer naar die functie (hij bewaart dus het adres van die functie).
Wanneer dat nodig is, voert de DLL dan de functie uit op dat adres.
Juist ja, ik voel hem. Klinkt ook aardig. In weze niet heel erg anders dan een callback, behalve dan dat de functie/procedure slechts één keer aan de DLL bekend gemaakt hoeft te worden. Toch?? Maar wel lastiger om de DLL 'zomaar' te pakken en te gebruiken.

Verwijderd

Topicstarter
cimbom: ja, dat is wel leuk, maar wanneer roep ik dan de ReadData(Memo1.Lines) aan? Het OnUDPRead event, in de DLL vuurt wanneer er een pakket binnen komt. Maar het hostprogramma weet niet wanneer dat is. Dat was dan ook mijn probleem.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

MarkVM: de procedure die whoami en ik beschrijven IS een callback :z

En nee, in de headers van je DLL plaats je de functiedef of eleganter de closure-def, dus is het heel simpel juist om aan te roepen. Half de Win32 API werkt op deze manier.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Voorbeeld in C++ van het concept:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// In main programma
void PrintLine(char*);

int main()
{
...
InvokeDllFunctie(PrintLine);
...
}

// In DLL zit dan dus
void InvokeDllFunctie(FunctiePointer PrintLine)
{
...
PrintLine("Wat tekst");
...
}

Professionele website nodig?


Verwijderd

Topicstarter
Ehhhrm, euh... Ik zit momenteel ook even iets te lezen over callbacks, maar daar werkt het heel simpel. Een procedure declaratie op deze manier gemaakt:

Delphi:
1
Procedure ProcName(Name : String; Number : integer; Callback : TFileCallbackProcedure);

Dat is toch niet hetzelfde als wat jullie beschreven als callback (vandaar dat ik dacht dat we het nu over twee methodes hadden).

Verwijderd

Topicstarter
Ja, ok, dan hebben we het dus toch over hetzelfde, geloof ik.

Verwijderd

Topicstarter
Ik ga hier in ieder geval even mee spelen!! Bedankt allemaal!!
Pagina: 1