Announcement

Collapse
No announcement yet.

Übergebene Strings in DLL verändern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Übergebene Strings in DLL verändern

    Hallo miteinander,

    habe da ein Problem mit dem ich nicht so recht weiterkomme. Folgende Ausgangssituation :

    Eine DLL besitzt ein Prozedur welche Daten einem als 'var' übergebenen Record zuweist. Der Record
    ist als packed deklartiert und besitzt neben den Datentypen 'Byte' und 'Long' auch den Datentyp 'String'. Alles ist gut, bis zu dem Zeitpunkt an welchem ich versuche den String-Elementen etwas zuzuweisen.
    Dann erscheint folgende Fehlermeldung :

    Im Projekt xxx.exe ist eine Exception der Klasse EInvalidPointer mit der Meldung "Ungültige Zeigeroperation" aufgetreten !

    Dabei ist sowohl in der Projektdatei der DLL als auch in der Unit welche die veröffentlichten Funktionen der DLL enthält die uses-Klausel 'ShareMem' die erste Anweisung.

    using ShareMem, ... ;

    type TModuleSettings = packed record
    Typ : Byte;
    Description : string;
    PhysUnit : string;
    FmtString : string;
    Gain : Double;
    Offset : Double;
    end;

    // Hier die betreffende DLL_Funktion

    procedure GetModuleSettings (DeviceNum, ModuleNum : Byte; var ModuleSettings : TModuleSettings; var Error : DWORD) ; stdcall;

    begin
    //
    ModuleSettings.Typ := Device[DeviceNum].Module[ModuleNum].Typ;
    ModuleSettings.PhysUnit := Device[DeviceNum].Module[ModuleNum].PhysUnit; // << hier tritt der Fehler auf
    ModuleSettings.FmtString := Device[DeviceNum].Module[ModuleNum].FmtString;
    ModuleSettings.Gain := Device[DeviceNum].Module[ModuleNum].Gain;
    ModuleSettings.Offset := Device[DeviceNum].Module[ModuleNum].Offset;
    end;

    Kommentiere ich die erste Zuweisung eines Strings aus so erfolgt der Fehler in der nächsten Zeile. Das Weglassen der Option 'packed' bringt auch keine Besserung, nur eine etwas anders geartete Fehlermeldung.

    Ein weiterer Versuch war, die Stringelemente einzeln (als var) zu übergeben. Auch hier die gleiche Fehlermeldung.

    Wer kann helfen ?????

  • #2
    Hallo Karsten,
    die Fehlermeldung "Ungültige Zeigeroperation" weist auf das Lösungsverfahren hin: Beim Datenaustausch mit externen Funktionen sollten unbedingt <u>nullterminierte Strings</u> verwendet werden. Also auch wenn das mehr Schreibarbeit bedeutet, solltest Du so arbeiten:
    type TModuleSettings = packed record
    Typ : Byte;
    <b>Description : PChar;
    PhysUnit : PChar;
    FmtString : PChar;</b>
    Gain : Double;
    Offset : Double;
    end;
    Bei der Zuordnung der Feldinhalte kannst Du in der Regel einfach schreiben:
    ModuleSettings.PhysUnit := <b>PChar</b>(Ausgangsstring); bzw.
    Eingangsstring := <b>StrPas</b>(ModuleSettings.PhysUnit);
    Das sollte Dir weiterhelfen.
    Jürge

    Comment

    Working...
    X