Memory Mapped File



  • Hallo,
    ich möchte mittels MMF ein Delphi Programm mit einer C++-DLL Daten austauschen lassen. In C++ bin ich noch ein ziemlicher anfänger... Meine Favouritensprache ist Delphi 🙂
    Der Empfänger Code der Delphi Andwendung ist bereits fertig. Habe für Delphi auch den Client, den ich nun in C++ übersetzten müsste.

    struct TMyData
    {
        char* Zeichenkette;
        int Zahl;
        bool BoolVar;
    };
    typedef struct TMyData* PMyData;
    
    DWORD WriteToMMF(PMyData MyData, char* Filename, HWND hWindow)
    {	
      DWORD dwResult;
      HANDLE hFileMapping;
      PMyData Mem;
    
      Mem = NULL;
      dwResult = 0;
      hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(TMyData), L"Test");
      if (hFileMapping == 0)
      {
    	  MessageBox(NULL, L"Fehler", NULL, MB_OK);
    	  exit(1);
      }
    
      Mem = (TMyData*)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
      CopyMemory(Mem, MyData, sizeof(TMyData));
      UnmapViewOfFile(Mem);
      SendMessage(hWindow, 1024, 0, 0);
      CloseHandle(hFileMapping);
    
      return dwResult;
    }
    
    int main(int argc, char **argv, char **envp)
    {	
    	char* cText;
    	PMyData MyData;	
    	DWORD dwResult;
    	HWND hReceiver;
    
    	hReceiver = FindWindow(NULL, L"Receiver");
    	if (hReceiver != 0)
    	{		
    		//Adress = GetMemory(sizeof(TMyData))? Aber wie in C++?
    		cText = "Hello world";
    		MyData->Zeichenkette = cText;
    		MyData->Zahl = -3;
    		MyData->BoolVar = true;
    		dwResult = WriteToMMF(MyData, "MyFileMapping", hReceiver);       
    	}	
    
    	system("pause");
    	return 0;
    }
    

    Der Delphi Code:

    type
      TMyData = record
        Zeichenkette: string[255];
        Zahl: Integer;
        BoolVar: Boolean;
      end;
      PMyData = ^TMyData;
    
    function WriteToMMF(MyData: PMyData; Filename: string; hWnd: THandle): DWORD;
    var
      dwResult: DWORD;
      hFileMapping: THandle;
      Mem: PMyData;
    begin
      Mem:= nil;
      dwResult:= 0;
      hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil,
        PAGE_READWRITE, 0, sizeof(TMyData), PChar(Filename));
      if hFileMapping <> 0 then
      begin
        Mem := MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
        if Assigned(Mem) then
        begin
          CopyMemory(Mem, MyData, sizeof(TMyData));
          UnmapViewOfFile(Mem);
          SendMessage(hWnd, WM_MMFNOTIFY, 0, 0);
          CloseHandle(hFileMapping);
        end;
      end
      else
        dwResult := GetLastError;
      result := dwResult;
    end;
    
    procedure TF_Sender.Button1Click(Sender: TObject);
    var
      s: string;
      MyData: PMyData;
      dwResult: DWORD;
      hReceiver: THandle;
    begin
      showmessage(inttostr(WM_MMFNOTIFY));
      SetLastError(0);
      hReceiver := FindWindow(nil, 'Receiver');
      if hReceiver <> 0 then
      begin
        MyData := GetMemory(sizeof(TMyData));
        try
          if Assigned(MyData) then
          begin
            s := 'Hello world';
            MyData.Zeichenkette := PChar(s);
            MyData.Zahl := -3;
            MyData.BoolVar := True;
            dwResult := WriteToMMF(MyData, 'MyFileMapping', hReceiver);
            if dwResult <> ERROR_SUCCESS then
              ShowMessage(SysErrorMessage(dwResult));
          end;
        finally
          FreeMemory(MyData);
        end;
      end
      else
        ShowMessage(SysErrorMessage(GetLastError));
    end;
    

    Könnt ihr mir helfen? Was ist an dem Code noch nicht richtig?
    Wie mache ich

    MyData := GetMemory(sizeof(TMyData));
    

    in C++?

    Schon mal vielen Dank!
    Grüße
    Littleben



  • MyData := GetMemory(sizeof(TMyData));
    

    Ist doch eine Zuweisung? In C/C++ ist der Zuweisungsoperator ein einfaches Gleichheitszeichen.



  • Nur gibt es GetMemory() in C++ nicht ^^



  • Littleben schrieb:

    Wie mache ich

    MyData := GetMemory(sizeof(TMyData));
    

    in C++?

    TMyData *MyData = new TMyData();
    


  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Swordfish schrieb:

    Littleben schrieb:

    Wie mache ich

    MyData := GetMemory(sizeof(TMyData));
    

    in C++?

    TMyData *MyData = new TMyData();
    

    Wieso nicht gleich als Stack-Objekt? 😕



  • Damit du eine saublöde Frage stellen kannst der OP die gewünschte Entsprechung in C++ bekommt.


Anmelden zum Antworten