Unicode String im Record kernel32.dll nach Lazarus

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Unicode String im Record kernel32.dll nach Lazarus

Beitrag von laz847 »

Hallo, ich hänge da gerade an einer Stelle und will jetzt wirklich mal wissen wie das genau funktioniert, bisher habe ich es immer irgendwie hinbekommen aber so richtig verstanden hab ich es anscheinend noch nicht. Ich sende mir aus dem Metatrader 4 (Unicode) über die kernel32.dll durch ein Memory Mapped File mit CreateFileMappingW() einen einfachen Record,

Code: Alles auswählen

MQL4 
struct STRUCT_ACCOUNT{
 int    LOGIN;  
 string NAME;
} ACCOUNT;
 
kernel32.dll --> void RtlMoveMemory(int DestPtr , const STRUCT_ACCOUNT&   ACCOUNT, int Length); 
der enthält einen "integer" und einen "string".

Ich kann dann mit Lazarus die MapView öffnen und kann den "integer" Wert ausgeben, greife ich auf den String zu gibts ne SIGSEGV.

Code: Alles auswählen

TAccountStruct = packed record
  LOGIN    : integer;
  NAME     : PWideChar;
 end;
 
PAccount = ^TAccountStruct;   
 
  var pBuf : PAccount;
 
  OpenFileMappingW(FILE_MAP_READ,False,'MAP_ACCOUNT');
  pBuf := MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);
 
  Memo1.Lines.Add('LOGIN : '+IntToStr(pBuf^.LOGIN));    
  Memo1.Lines.Add('NAME : '+pBuf^.NAME);  <<--- löst die SIGSEGV aus
Ich habe jetzt nur das wichtigeste reinkopiert, nich das Ihr denkt da fehlt ja die Hälfte :D.

Als ich Strings aus MQL4 über dlls versendet habe waren das PWideChar in Lazarus. Verändert die kernel32.dll da noch irgendwas, wenn ich mit W öffnen und mit W schreibe und genauso lese sollte es doch keine Probleme geben oder? Kann mir mir das mal jemand kurz erklären was wie behandelt werden muss? In dem Bereich gibts ja auch schnell mal Probleme mit Memory Leaks, ich würde da gern sicher sein.

DANKE!!!

Ok hats ich erledigt haben es gerade gefunden, liegt an MQL4:
Classes, string arrays or complex objects that contain strings and/or dynamic arrays of any types cannot be passed as a parameter to functions imported from DLL
Deswegen ging ein String per dll aber im Record geht es nicht, das ist dann ein komplexes Object in MQL4 :D

Antworten