Frage

Aufgabe:

Anwendung geschrieben in Delphi übernimmt eine Struktur (record in Form von Delphi) aus drei Feldern. Ich kann den Zeiger dieser Struktur unter Verwendung von SendMessage (Win32 API) Funktion senden.

So eine Frage ist:

Wie in Bezug auf die Delphi bestimmte Strukturdarstellung in einem Speicher für Delphi aufrecht zu erhalten?

Es hat Typ

PWPModPostData = ^ TWPModPostData;
TWPModPostData = record
   DataType: Integer;
   Data: PChar;
   Next: PWPModPostData;
end;

Wie es in C definieren? Ich meine, ist es versteckt oder Service Felder in Delphi Strukturen?

War es hilfreich?

Lösung

Nein, es gibt keine versteckten Felder, und Delphi Aufzeichnungen und C structs können miteinander 1 abgebildet werden: mit ein paar Einschränkungen 1:

  • Sie keinen Datentyp C nicht verwendet verstehen. Dazu gehören Objekte, dynamische Arrays und Delphi-Strings.

  • C und Delphi manchmal unterschiedliche Ideen, wie Felder auf Byte-ausgerichtet sind. Testen Sie Ihre Aufzeichnungen und stellen Sie sicher, dass sie arbeiten auf der C-Seite. Wenn sie nicht, versuchen Sie es mit packed record anstelle von Datensatz .

  • Wenn Sie einen Zeiger auf einen Datensatz vorbei von C nach Delphi oder umgekehrt, bilden sicher, dass die Seite es empfangen versucht nicht zu den freien oder umverteilen Erinnerung. Es gehört zu dem Speicher Manager, der es erstellt hat.

Andere Tipps

Beachten Sie, dass Sie auf jeden Fall die Adresse einer solchen Struktur in eine andere Anwendung als LPARAM eines SendMessage() es höchstwahrscheinlich rufen senden kann nicht funktionieren. Der Grund dafür ist, dass der gleiche Zeiger wird in der Regel nicht auf den gleichen physikalischen Speicherort zeigen, wenn sie in einer anderen Anwendung mit einem eigenen Adressbereich verwendet wird.

Es funktioniert für einige Windows-Nachrichten wie WM_GETTEXT, und in diesen Fällen sind das O tut die notwendige Abbildung hinter dem Vorhang, so dass die empfangende Anwendung Daten in den Puffer von der rufenden Anwendung zuzugeordnet kopieren und die Adresse auf dem gleiche Chunk des physikalischen Speichers in beiden Anwendungen.

Das gleiche kann mit Hilfe des WM_COPYDATA erreicht werden Nachricht, die die notwendige Rangierung des Speichers tun, wenn dabei den Datenaustausch zwischen zwei Anwendungen.

sollten

Aber die Struktur in Frage hat ein weiteres Problem, da es Hinweise auf Speicher enthält. Die WM_COPYDATA Dokumentation ausdrücklich, dass dies nicht getan werden muss. Während die Adresse des gesamten Speicherblock modifiziert werden wird das System in der empfangenden Anwendung gültig sein kann nicht wissen, welche Teile des Speicherblockzeiger und würden auch abgebildet werden müssen. All enthaltenen Zeiger werden daher gelassen werden wie ich ist und wahrscheinlich unwirksam. Ihre einfach verknüpften Liste gebrochen wird, und die PChar Elemente entweder nicht zugänglich sein.

Edit:

In Bezug auf Ihre Kommentare: über Punkte sind wichtig nur, wenn Sie Nachrichten von anderen Anwendungen zu senden versuchen; wenn Sie dies aus einer DLL tun Dinge funktionieren, weil eine DLL den Adressraum des Prozesses teilt wurde geladen, so einen Zeiger in der Anwendung oder einer geladenen DLL wird immer auf den gleichen Speicherplatz Punkt verwendet. Sorry für die Verwirrung dies verursacht haben könnte, aber es war ich von Ihrer Frage nicht auf der Hand, dass der Datenaustausch innerhalb einer Anwendung geschieht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top