MemoryMappedFile - Fehlermeldung - Kommunikation zw. 2 Prozessen

01/07/2008 - 11:06 von Martin Priebe | Report spam
Hallo,

ich versuche gerade zwischen 2 Prozessen zu kommunizieren und da das
besonders schnell gehen muss versuche ich es gerade mit MemoryMappedFile.

Leider klappt das nicht so ohne weiteres.

Mein erster Prozess legt eine MMF an und mapped diese erfolgreich.
Nun möchte ich ein Bitmap austauschen. Dazu erstelle ich ein Grahics Object
vom Bitmap und schreibe den Pointer rein.
IntPtr mappedViewHandle = MapViewOfFile(mmfHandle, (uint)FILE_MAP_WRITE, 0,
0, 0);



Marshal.WriteIntPtr(mappedViewHandle, gfxScreenshot.GetHdc());

Das ganze scheint auch so zu klappen.



Mein zweiter Prozess liest nun die MMF und mapped sie.

Das scheint auch zu klappen.

IntPtr mappedFileHandle = OpenFileMapping((int)FileAccess.ReadWrite, false,
"MMF");



IntPtr mappedViewHandle = MapViewOfFile(mappedFileHandle,
(uint)FILE_MAP_READ, 0, 0, 0);

IntPtr bmpHandle = Marshal.ReadIntPtr(mappedViewHandle);



nun versuche ich mit diesem Handle das Bitmap wieder herzustellen

gfxScreenshot = Graphics.FromHdc(bmpHandle );

Nur das klappt nicht.

Ich bekomme die Exception "Nicht genügend Arbeitsspeicher".



Ich weiß leider nicht warum.

Evt. funktioniert schon mein schreiben nicht.

Weiter unten mal meine Funktionen.





danke im vorraus

Martin



Das Schreiben in die MMF:

public IntPtr CreateMMF(string fileName, FileAccess access, int size)

{

if (size < 0)

throw new ArgumentException("The size parameter should be a number greater
than Zero.");

IntPtr memoryFileHandle = CreateFileMapping(0xFFFFFFFF, IntPtr.Zero,
(uint)access, 0, (uint)size, fileName);

if (memoryFileHandle == IntPtr.Zero)

throw new Exception("Creating Shared Memory failed.");

return memoryFileHandle;

}

private void SendToMMF()

{

IntPtr mappedViewHandle = MapViewOfFile(mmfHandle, (uint)FILE_MAP_WRITE, 0,
0, 0);

if (mappedViewHandle == IntPtr.Zero)

throw new Exception("Creating a view of Shared Memory failed.");

Marshal.WriteIntPtr(mappedViewHandle, gfxScreenshot.GetHdc());


UnmapViewOfFile(mappedViewHandle);

CloseHandle((uint)mappedViewHandle);

}



Und das Lesen:



public IntPtr ReadHandle()

{

IntPtr mappedFileHandle = OpenFileMapping((int)FileAccess.ReadWrite, false,
"MMF");

if (mappedFileHandle == IntPtr.Zero)

throw new Exception("Opening the Shared Memory for Read failed.");

IntPtr mappedViewHandle = MapViewOfFile(mappedFileHandle,
(uint)FILE_MAP_READ, 0, 0, 0);

if (mappedViewHandle == IntPtr.Zero)

throw new Exception("Creating a view of Shared Memory failed.");

IntPtr windowHandle = Marshal.ReadIntPtr(mappedViewHandle);


if (windowHandle == IntPtr.Zero)

throw new ArgumentException("Reading from the specified address in Shared
Memory failed.");

UnmapViewOfFile(mappedViewHandle);

CloseHandle((uint)mappedFileHandle);

return windowHandle;

}



private Bitmap CreatePicture(IntPtr picPointer)

{

Bitmap bmpScreenshot;

Graphics gfxScreenshot;

// Create a graphics object from the picPointer

gfxScreenshot = Graphics.FromHdc(picPointer);


// Get the bitmap object

bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height, gfxScreenshot);

return bmpScreenshot;

}
 

Lesen sie die antworten

#1 Thomas Scheidegger
01/07/2008 - 12:14 | Warnen spam
Hallo Martin

... und schreibe den Pointer rein
IntPtr bmpHandle = Marshal.ReadIntPtr(mappedViewHandle);
Ich bekomme die Exception "Nicht genügend Arbeitsspeicher".



ich vermute dann doch schwer,
dass man nicht einfach das Bitmap-HANDLE einem anderen Prozess
übergeben kann. Handles sind eigentlich hàufiger per-process.

Vermutlich musst du die Bitmap-Daten insgesamt übergeben...
([Memory-]Stream-Basis oà uva)




Thomas Scheidegger - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/

Ähnliche fragen