Seite 1 von 1
DLL-Modul selbst erstellen
Verfasst: Samstag 28. November 2009, 17:11
von knox
Ich habe angefangen, ein eigenes Modul zum Laden mit dem DLL-Modul zu erstellen. Nach vielen Anfangskrämpfen habe ich jetzt eine ganz passable Version.
Mein Modul soll eine wählbare Zahl von Pins besitzen (der Nutzer kann einstellen, wieviele gleichartige Baugruppen im Modul enthalten sind). Dies funktioniert auch, wenn der Nutzer das Modul nur einmal benötigt oder in allen Modulen dieselben Pinzahlen sind.
Die Aufrufe NumInputs und NumOutputs haben jedoch keine Parameter, die auf die rufende Baugruppe schließen lassen.
Wie kann meine DLL wissen, um welches der gleichartigen Bauteile mit unterschiedlichen Pinzahlen es sich handelt?
Re: DLL-Modul selbst erstellen
Verfasst: Montag 30. November 2009, 08:54
von abacom
"Wie kann meine DLL wissen, um welches der gleichartigen Bauteile mit unterschiedlichen Pinzahlen es sich handelt?"
Aus der Anleitung:
Die Variable PUser^[100] wird von ProfiLab gesetzt, und enthält die Nummer des DLL-Bauteils in Ihrem Projekt: 1 für DLL1, 2 für DLL2, usw.
Re: DLL-Modul selbst erstellen
Verfasst: Montag 30. November 2009, 13:34
von Mike D
@abacom
die NumInputs(), NumOutputs(), GetInputName und GetOutputName haben da aber leider keinen Zugriff drauf. Es währe sehr hilfreich und würde die Einsatzmöglichkeit stark erhöhen wenn das ginge.
Mir ist aber voll bewussst das solche Sachen aus Kompatibilitätsgründen nicht einfach nachgerüstet werden können.
@knox
Man könnte es mit einer gemeinsamen ini-Datei mit Abschnitten für jede Instanz versuchen und z.B. in einer globalen Variablen der DLL mitzählen wie oft NumInputs etc. schon aufgerufen wurde.
Grüße
Mike
Re: DLL-Modul selbst erstellen
Verfasst: Montag 30. November 2009, 17:34
von knox
@abacom: Leider geht genau dieses nicht. Die Funktion NumInputs wird als erste aufgerufen (das ergaben zumindest meine Tests). Genau diese Funktion hat aber den Parameter PUser nicht!!! Jetzt sollte aber mein Modul die korrekte Nummer zurückliefern. Wie soll es das machen?
Es mag sein, dass ich hier etwas übersehe! Aber gesucht habe ich viel
@Mike D: habe ich mir auch überlegt, aber die Aufrufe von NumInputs kommen ja - für das gleiche Bautei - mehrfach! Und ganz habe ich die Systematik noch nicht durchschaut.
Re: DLL-Modul selbst erstellen
Verfasst: Dienstag 1. Dezember 2009, 10:53
von abacom
Es gäbe da auch noch...
Code: Alles auswählen
Code:
Procedure InitValues(POutput,PUser: PDLLParams);
bzw.
Code:
void _stdcall CInitValues(double *POutput, double *PUser)
Siehe auch:
viewtopic.php?f=31&t=705&hilit=DLLInit
Ich hatte Herrn Bangert damals so verstanden, dass er noch die dreisprachige Dokumentation für diese Funktion liefern wollte 
Re: DLL-Modul selbst erstellen
Verfasst: Dienstag 1. Dezember 2009, 12:16
von knox
Ich habe alles gelesen und eigentlich nur herausgelesen, dass es hier keine Lösung geben wird!
Eigentlich schade - ein an vielen Stellen brauchbares bis gutes Produkt so auflaufen zu lassen.
Ich zumindest werde eben andere Wege gehen ....
Ach ja: CInitValues wurde in meinen Versuchen nicht ein einziges Mal aufgerufen!
Re: DLL-Modul selbst erstellen
Verfasst: Dienstag 1. Dezember 2009, 12:19
von abacom
Dann haben Sie offensichtlich etwas falsch verstanden. INITVALUES wird beim Laden der DLL aufgerufen und
bekommt auch auch PUSER^ übergeben, so wie es gewünscht war.
CInitValues wurde in meinen Versuchen nicht ein einziges Mal aufgerufen!
...dann haben Sie entweder nicht PL4 oder Sie müssen noch das aktuelle Update installieren.
Re: DLL-Modul selbst erstellen
Verfasst: Samstag 5. Dezember 2009, 19:20
von knox
Ja, ich hatte etwas falsch verstanden. Nachdem ich den Entry CInitValues in meine *.def-Datei eingetragen hatte ging es auch! Microsoft hat ja NUR 3 verschiedene Möglichkeiten für diesen Vorgang...
Re: DLL-Modul selbst erstellen
Verfasst: Montag 7. Dezember 2009, 10:53
von BKGMX
Hallo,
mich interessiert dieses Thema auch.
Initvalues wird zwar bei mir augerufen z.B.
Code: Alles auswählen
Procedure InitValues(POutput,PUser: PDLLParams);
begin
messagebeep(0);
end;
Aber wie setze ich die Anzahl der Outputs? Die sind doch als Konstante definiert?
Eine Definition als Variable hilft auch nicht:
Code: Alles auswählen
var
Outputs : Byte = 4;
Procedure InitValues(POutput,PUser: PDLLParams);
begin
Outputs := 2; // nur so als Test
end;
In den Eigenschaften der DLL wird dann zwar NumOutputs = 2 angezeigt, aber in der graphischen Darstellung sind es immer noch 4 Ausgänge.
Vielen Dank