![]() |
Mehrere Werte aus DLL zurückggeben
Hallo,
ich habe eine DLL geschrieben, die verschiedenenste Kommunikation zu einem Gerät kapselt. Nun habe ich einen BUS (RS485) an dem mehrere Geräte hängen können. Ich habe jetzt eine Funktion, die alle Adressen abscannt und auf eine Anwort wartet. Diese merke ich mir dann und will diese nun zurückgeben, an den DLL-Aufrufer. Nur wie bewerkstellige ich die Übergabe, intern in der DLL habe ich ein Array, eines Records, der sieht dann ungefähr so aus: TDeviceRecord = record Adresse:Word; // Die RS485 Adress auf die er geantwortet hat Seriennummer:String; // Die Seriennummer im Gerät end; Viele Dank! Gruß DelphiManiac |
Re: Mehrere Werte aus DLL zurückggeben
Schonmal über VAR-Parameter versucht?
|
Re: Mehrere Werte aus DLL zurückggeben
Hallo,
da es mehrere Adressen sein können, würde ich 2 Funktionen/Prozeduren nehmen. Die 1. fragt die Anzahl der Adressen ab, function GetAddressNumbers: Word; die 2. rufst du so oft auf, wie Anzahl vorher zurückgegeben wurde function GetAddressData(AdressCount: Word): ShortString; Beachte das ShortString statt String, um borlandmm nicht benutzen zu müssen. Heiko |
Re: Mehrere Werte aus DLL zurückggeben
übergebe in der Funktion einen Zeiger auf das Array und einen zusätzlichen Parameter für die Länge oder Anzahl. Dann kann der Aufrufer der Funktion ein dynamisches Array draus machen und die übergebene Anzahl an records auslesen. Schau aber auch noch mal auf die Speicherverwaltung!! Nicht dass da Leichen übrigbleiben oder sonst was in die Hose geht.
Ich habs auch schon mal so gelöst, dass ich im Aufruferprogramm eine Liste übergeben hab, die die DLL-Funktion mit Werten füllt. So habe ich die Initialisierung und Freigabe im Hauptprogramm. Gruß oki |
Re: Mehrere Werte aus DLL zurückggeben
Mir geht es eigentlich darum.
Angenommen ich habe folgende Geräte angeschlossen: 1,2,3,5,10,22 Dann muss ich die Geräteadressen zurückgeben. Kann ich das so machen?
Delphi-Quellcode:
Und der Pointer zeigt auf ein Record?
function ScanAllDevices(DatenPointer:Pointer):Integer;stdcall;
Oder ist das eine schlechte Möglichkeit? Danke! Gruß |
Re: Mehrere Werte aus DLL zurückggeben
Wenn du als Rückgabewert die Länge des Records übergibst, dann sollte es klappen.
Gruß oki |
Re: Mehrere Werte aus DLL zurückggeben
@Oki,
genau so habe ich es jetzt gemacht, die Anzahl der Array Elementeübergebe ich und den Zeiger auf Record-Array, so kann der DLL-Aufrufer dann das Array durchlaufen und sich die Werte abholen. Danke! Gruß DelphiManiac |
Re: Mehrere Werte aus DLL zurückggeben
Anstatt eines untypisierten Pointer könntest du natürlich auch so etwas wie PDeviceRecord nehmen. Das vereinfacht das Handling ein wenig.
|
Re: Mehrere Werte aus DLL zurückggeben
so wie sirius es empfiehlt mach ich es auch immer. Läßt sich im Code einfach besser lesen und sicherer handeln. Pass aber blos auf, dass du den Speicher für deinen Zeiger wieder ordentlich frei gibst, sonnst ist dein Rechner bald OutofMemory!
Gruß oki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz