SpareTimeX
Grünschnabel
Hi zusammen.
Gleich mein erstes Posting wird wohl eine richtig schwierige Frage.
Ich versuche meinem Programm eine möglichst simple Schnittstelle zu verpassen, damit man es mittels selbstgeschriebener DLLs erweitern kann. Gemeinsam ist allen PlugIns, dass sie ziemlich große Mengen an Integer-Werten kontinuierlich zurückgeben müssen (Messwerterfassung). Ich habe jetzt versucht, es mit dynamischen Arrays zu realisieren. Dazu übergebe ich von meinem Programm aus beim Aufruf der Funktion in der DLL einen Pointer auf das dyn.Array.
Erst in der DLL lege ich die Größe des dyn.Array fest und versuche es dann zu beschreiben. Leider gibts dabei dann eine Zugriffsverletzung in meiner DLL. Pointer auf andere Typen (Integer, Char,...) kann ich problemlos so bedienen. Bei Arrays fester Größe kommt aber nichts an -> es wird nichts hineingeschrieben und bei dynamisch Arrays kommt die Zugriffsverletzung.
Wenn ich meine Funktion ins Hauptprogramm lege, gibts keine Probleme.
vereinfachter Beispiel-Code:
Evtl. hat ja auch jemand eine bessere Idee, wie man extraordinär große Datenmengen effizient übergibt.
Gruß
Stephan
Gleich mein erstes Posting wird wohl eine richtig schwierige Frage.
Ich versuche meinem Programm eine möglichst simple Schnittstelle zu verpassen, damit man es mittels selbstgeschriebener DLLs erweitern kann. Gemeinsam ist allen PlugIns, dass sie ziemlich große Mengen an Integer-Werten kontinuierlich zurückgeben müssen (Messwerterfassung). Ich habe jetzt versucht, es mit dynamischen Arrays zu realisieren. Dazu übergebe ich von meinem Programm aus beim Aufruf der Funktion in der DLL einen Pointer auf das dyn.Array.
Erst in der DLL lege ich die Größe des dyn.Array fest und versuche es dann zu beschreiben. Leider gibts dabei dann eine Zugriffsverletzung in meiner DLL. Pointer auf andere Typen (Integer, Char,...) kann ich problemlos so bedienen. Bei Arrays fester Größe kommt aber nichts an -> es wird nichts hineingeschrieben und bei dynamisch Arrays kommt die Zugriffsverletzung.
Wenn ich meine Funktion ins Hauptprogramm lege, gibts keine Probleme.
vereinfachter Beispiel-Code:
Code:
{ Programm }
type
TInfArrayInt = array of integer;
TInfArrayIntPtr = ^TInfArrayInt;
var
InfArrayInt: TInfArrayInt;
Procedure Aufruf;
var
AIPtr: Pointer;
begin
AIPtr := @InfArrayInt;
ModulFunktion(AIPtr);
end;
{ DLL }
type
TArrayInt = array of integer;
TArrayIntPtr = ^TArrayInt;
var
ArrayPtr: TArrayIntPtr;
function ModulFunktion(EAIPtr: Pointer);
begin
ArrayPtr := AIPtr;
c:=1;
for i:=1 to 2048 do begin
ArrayPtr^[i] := 1;
if i>c*256-56 then begin
inc(c);
setlength(ArrayPtr^, c*256);
end;
end;
end;
Evtl. hat ja auch jemand eine bessere Idee, wie man extraordinär große Datenmengen effizient übergibt.
Gruß
Stephan