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 ichMyData := 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 kannstder OP die gewünschte Entsprechung in C++ bekommt.