OK - Ich habe also nie eine einfache Frage.
Ich habe eine benutzerdefinierte Bibliothek (die nicht von mir geschrieben wurde) in C ++ geschrieben. Diese Bibliothek führt einige Netzwerkkommandos durch, und ich gebe einfach einige Daten an sie als Bytearray weiter und lade auf der anderen Seite ein Bytearray daraus ab. Die Bibliothek behandelt das gesamte Netzwerk-Zeug für mich das Senden / Empfangen von Daten zu / von Client / Server.
So kann ich zum Beispiel einen Client und einen Server schreiben. Vom Client erzeuge ich ein Byte-Array, die Bibliothek nimmt das Byte-Array und sendet es an einen Server. Der Server, den ich geschrieben habe, benutzt die gleiche Bibliothek, um das Umgekehrte zu tun, dh er behandelt den gesamten Datenverkehr und gibt eventuell ein Byte-Array zurück.
Die Bibliothek definiert das Byte-Array als Teil einer Struktur wie folgt ... (Ich lade die Bibliothek statisch in Delphi, glaube nicht, dass das einen Unterschied machen wird, aber ich benutze FastMM4 - so geht das das Speicher-Sharing-Modell zwischen App und DLL zu beeinflussen? Soweit mir bekannt ist mit FastMM sollte in Ordnung sein, habe auch ShareMem vergeblich versucht)
%Vor%Wie auch immer, von meinem Client versuche ich "Hello" zu senden ... die akzeptierte Weisheit ist, dass die Byte-Array-Daten in diese Struktur kopiert werden, indem man memcpy wie folgt verwendet ...
%Vor%Auf meinem Server antworte ich mit "World". Also antwortet der Server wie folgt ...
%Vor%Von einem C ++ - Client, der mit einem C ++ Server kommuniziert, erhalte ich diese Daten auf dem Server ...
%Vor%Nach diesem Aufsatz denke ich, dass der C ++ Server Code korrekt ist, weil ich richtig kommunizieren kann, wenn ich einen Client in C ++ schreibe ... Aber das Ersetzen des C ++ Clients durch einen in Delphi geschriebenen Client funktioniert nicht. Ich habe memcpy durch CopyMemory ersetzt, von dem ich dachte, dass es dasselbe getan hat, aber irgendwie ist mein Bytearray anders, bis es den C ++ Server erreicht ... Mein Delphi-Klient tut das folgende ...
%Vor%Die Daten vom Delphi-Client erscheinen also korrekt, aber die auf dem Server empfangenen Daten sind falsch ... Irgendwie wird "Hallo" ('72 101 108 108 111 ') zu
%Vor%Ich vermute, dass ich mit CopyMemory etwas falsch mache ...? Oder habe ich die Speicherfreigabe zwischen der exe und der dll falsch? Woher weiß ich, welche Art von Speichermodell die C ++ - Netzwerkbibliothek verwendet? Oder habe ich gerade dieses Byte-Array falsch kopiert? Jede Hilfe sehr geschätzt ...
Der Fehler ist, dass ByteArray
effektiv ein Zeiger auf das erste Element des Arrays ist. Damit übergeben Sie die Adresse des Zeigers an das erste Element des Arrays. Mit anderen Worten, Sie haben eine zusätzliche, indirekte Ebene. Du brauchst
oder
%Vor% Wie für CopyMemory
vs memcpy
ist die erstere eine Win32-API-Funktion und die letztere ist eine C-Standardbibliotheksfunktion. Die zwei Funktionen führen identische Aufgaben aus und sind austauschbar.