![]() |
Strings: von C++ senden - in Delphi empfangen : WIE?
C++:
char *version; int cpu0core0t; ... version = "1.00"; cpu0core0t = 10; //dummy wert etc. wird ins Shared Memory geschrieben: auslesen mit einem C++-Programm geht problemlos. Mit einem Delphi-Programm kann ich nur Integer-Werte auslesen, bei den Strings kommt nur Müll heraus.
Delphi-Quellcode:
type
TSharedData = record cpu0core0t : Integer; //coretemp von cpu0,core0 version: array [0..3] of char; ... ... with SharedData^ do Begin Memo1.lines.add(Inttostr(cpu0core0t)); //geht Memo1.lines.add(version); //geht nicht |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Keine Ahnung ob das dein Problem löst, aber:
"1.00" ist 5 Zeichen lang, nicht vier. "Strings" in C/C++ werden durch \0 (char(0)) abgeschlossen. |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Versuchs mal mit einem PChar.
|
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Memo1.lines.add(PChar(version));
Ergebnis: üÿÿ‹ð‰w‰~ÇF¤B |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Du castest ja auch auf einen PChar, willst aber einen String ...
probiers also mal mit Memo1.lines.add(String(version)); |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Memo1.lines.add(String(version)); geht auch nicht
|
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Wie wäre es denn hier einfach mal den relevanten Teil des C++-Programms zu posten, welches in der Lage ist es zu lesen. Ich habe hier nämlich dieses unbestimmte Gefühl, daß du uns hier bei weitem nicht alle Fakten gegeben hast und dennoch eine zufriedenstellende Antwort erwartest.
|
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Delphi-Quellcode:
#include "stdafx.h"
#include <windows.h> #include <string> using namespace std; struct TData { char *version; int nr; ... } int main(int argc, char* argv[]) { const char* SHAREDMEMORYSEGMENTID = "CtMySiMcHa"; .... //write HANDLE host_handle; TData *host_data; host_handle = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,sizeof(TData),SHAREDMEMORYSEGMENTID); host_data = (TData*)MapViewOfFile(host_handle,FILE_MAP_WRITE,0,0,0); host_data->version = "erste"; host_data->nr = 1; //read HANDLE client_handle; TData *client_data; client_handle = OpenFileMapping(FILE_MAP_READ,false,SHAREDMEMORYSEGMENTID); client_data = (TData*)MapViewOfFile(client_handle,FILE_MAP_READ,0,0,0); printf("Inhalt des SM - version: %s\n",client_data->version); printf("Inhalt des SM - nr: %i\n",client_data->nr); ... UnmapViewOfFile(host_data); CloseHandle(host_handle); UnmapViewOfFile(client_data); CloseHandle(client_handle); flushall(); getchar(); return 0; } |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Zitat:
|
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
@Olli:
Was empfiehlst Du? |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Zitat:
Dazu müsstest Du erstmal schreiben, was Du eigentlich machst ! Versuchst Du den C Quelltext nach Delphi zu portieren? dann musst Du Dir einen ShortString in TDATA anlegen, kein Array of Char .. vielleicht solltest Du noch etwas von Deinem Delphi Quelltext posten :-) oder liest Du ein MMF Aus, was ein C++ Programm schreibt, dann dann müsstest Du TSharedData eigentlich so definieren
Delphi-Quellcode:
TSharedData = packet record
version : PChar; nr : Integer; ... end; und dann geht auch Dein Memo1.lines.add(String(version)); wieder (damit wandelst Du den Pointer dann in einen Delphi String um) |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Zitat:
Code:
sizeof(TData) wird dir 12 zurückgeben! Und nun schreiben wir da rein:
struct TData {
char *version; int nr; int blubb; }
Code:
Fällt dir was auf? Ich empfehle, daß du uns das fehlende Puzzle-Stück postest und dann können wir auch helfen ;)
TData *pointer_auf_daten = ...;
pointer_auf_daten->nr = 1; pointer_auf_daten->blubb = 0; pointer_auf_daten->version = "Dieser String ist länger als 12 Zeichen"; |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
sizeof(TData) =8 !!!
|
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Zitat:
|
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Ich verstehe Dich nicht:
sizeof(TData) =8 in C++ und in Delphi! |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Zitat:
Code:
Ich würde sagen nach Adam Riese und Eva Klein hast du ein mathematisches Problem alle Daten eines Strings in nur 8 Byte unterzubringen, zumal ja in der Struktur - wie schon erwähnt - eben nicht der String selber sondern nur der Zeiger auf die Zeigenkette gespeichert wird.
CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,[color=red]sizeof(TData)[/color],SHAREDMEMORYSEGMENTID);
Nochmal also: Wo also wird der String gespeichert? |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Das Problem liegt m.E. nicht auf der C++- sondern der DELPHI-Seite.
Die Integer-Werte können korrekt ausgelesen werden - auch wenn Hunderte im Shared Memory sind, das Problem sind nur die Strings! Ich brauche nirgendwo bei C++ einen Speicher für den Zeiger auf die Zeichenkette - wenn die Daten im SHARED MEMORY sind, hat das C++ - Programm seinen Teil erfüllt. |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Mal so eine Frage am Rande. Was genau versuchst du da eigentlich? Handelt es sich dabei um zwei getrennte Anwendungen oder um eine Anwendungen und eine DLL? Denn irgendwie konnte ich nicht rausfinden was du da eigentlich genau vor hast.
Wenn es nur eine DLL ist dann kannst du problemlos mit pchar das Ganze erledigen. Wenn es zwei getrennte Anwendungen sind dann solltest du dir vor Augen halten, dass der Speicher normal nur für die Anwendung in einem virtuellen Speicherbereich gemappt werden. Und Pointer eignen sich dafür als Übertragungsmedium nicht. Du müsstest als entsprechend die Daten des Strings in dem SharedMemory Bereich ablegen. So wie das bei Zahlen von Hause aus der Fall ist. Und beim Auslesen müsstest du daraus wieder einen Text machen. Muss aber gestehen ist nur eine Vermutung, denn mit Shared Memory habe ich bisher noch so gut wie nichts gemacht. PS: Strings in Delphi haben noch 8 Bytes Nutzinformationen die sich VOR dem eigentlichen Pointer befinden. |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Zitat:
Zitat:
@Lossy eX: Waren es nicht sogar 12 Bytes? Ich entsinne mich auch eines Referenzzählers neben Länge und Zeiger. Aber ich habe kein Delphi zum Überprüfen hier. |
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Olli: Also davor sieht es so aus. [Referänzzähler][Länge][Stringdaten] und evtl abschließendes [#0]. Dabei bin ich mir aber nicht sicher. Und der Pointer eines Strings zeigt auf den Anfang der Daten. Aber du brauchst natürlich auch noch eine Variable die den Pointer aufnimmt. ;)
|
Re: Strings: von C++ senden - in Delphi empfangen : WIE?
Weil ich keine Lösung gefunden habe, Strings auf "einfache" Art von einem C++-Programm über SHARED MEMORY zu DELPHI zu senden, packe ich jetzt die Strings in ein Array:
C++: char bdata[128]; DELPHI: bdata: array [0..127] of Char; Da passen z.B. 8 Strings von 16 Zeichen oder 16 Strings von 8 Zeichen hinein. Damit funktioniert es super - und mein Problem ist gelöst. Vielen Dank allen, die sich den "Kopf zerbrochen" haben! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz