Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Strings: von C++ senden - in Delphi empfangen : WIE? (https://www.delphipraxis.net/99210-strings-von-c-senden-delphi-empfangen-wie.html)

hathor 8. Sep 2007 16:34


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

Torpedo 8. Sep 2007 16:39

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.

phXql 8. Sep 2007 16:41

Re: Strings: von C++ senden - in Delphi empfangen : WIE?
 
Versuchs mal mit einem PChar.

hathor 8. Sep 2007 16:44

Re: Strings: von C++ senden - in Delphi empfangen : WIE?
 
Memo1.lines.add(PChar(version));

Ergebnis:

üÿÿ‹ð‰w‰~ ÇF¤B

stoxx 8. Sep 2007 17:51

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));

hathor 8. Sep 2007 18:51

Re: Strings: von C++ senden - in Delphi empfangen : WIE?
 
Memo1.lines.add(String(version)); geht auch nicht

Olli 8. Sep 2007 18:55

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.

hathor 8. Sep 2007 19:06

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;
}

Olli 8. Sep 2007 19:17

Re: Strings: von C++ senden - in Delphi empfangen : WIE?
 
Zitat:

Zitat von hathor
Code:
struct TData { 
   char *version;
   int nr;
...
}

Wenn das einfach sooo geschrieben wird, würde ja nur der Pointer auf die Zeichenkette in der MMF abgespeichert, genau den wichtigen Teil hast du also weggelassen, dennn logischerweise ist der Pointer nur innerhalb des aktuellen Prozesses gültig. Entsprechend muß die Zeichenkette irgendwoanders innerhalb der MMF abgespeichert sein, oder man kann auf sie eben nicht zugreifen.

hathor 8. Sep 2007 19:21

Re: Strings: von C++ senden - in Delphi empfangen : WIE?
 
@Olli:

Was empfiehlst Du?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz