public class WinCEConst
{
public const UInt32 STANDARD_RIGHTS_REQUIRED = 0x000F0000;
public const UInt32 SECTION_QUERY = 0x0001;
public const UInt32 SECTION_MAP_WRITE = 0x0002;
public const UInt32 SECTION_MAP_READ = 0x0004;
public const UInt32 SECTION_MAP_EXECUTE = 0x0008;
public const UInt32 SECTION_EXTEND_SIZE = 0x0010;
public const UInt32 SECTION_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED SECTION_QUERY
SECTION_MAP_WRITE
SECTION_MAP_READ
SECTION_MAP_EXECUTE
SECTION_EXTEND_SIZE);
public const UInt32 FILE_MAP_ALL_ACCESS = SECTION_ALL_ACCESS;
public static IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
public const int PAGE_READWRITE = 0x04;
public const int PAGE_READONLY = 0x02;
public const int FILE_MAP_READ = 0x0004;
public const int FILE_MAP_WRITE = 0x0002;
}
public class WinCE
{
// * WinCE下面是coredll.dll
// * Windows下面是keneral32.dll
[DllImport("Coredll.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr CreateFileMapping(
IntPtr hFile,
object lpFileMappingAttributes,
uint flProtect,
uint dwMaximumSizeHigh,
uint dwMaximumSizeLow,
string lpName);
public static IntPtr OpenFileMapping(uint dwDesiredAccess, bool bInheritHandle, string lpName)
{
IntPtr t_pHandle = CreateFileMapping(new IntPtr(-1), null,
WinCEConst.PAGE_READWRITE, 0, 0, lpName);
return t_pHandle;
}
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool CloseHandle(IntPtr hObject);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern IntPtr MapViewOfFile(
IntPtr hFileMappingObject,
uint dwDesiredAccess,
uint dwFileOffsetHigh,
uint dwFileOffsetLow,
uint dwNumberOfBytesToMap);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);
}
Memory-mapped file顧名思義,其實就只是在記憶體中建立一個區域,然後讓所有不同process的程式,能夠透過memory-mapped file來溝通資料.
不同行程之間如果要溝通資料,可以透過非常多的方法,像是利用SendMessage方式,透過OS的Message Queue傳遞資料;或是將資料寫入磁碟檔案;或是透過Client/Server在單機建立網路傳遞資料.但是這些都比不上透過Memory-mapped file方便,而且資料傳遞的速度,也是Memory-maping file最快.
那在WinCE中,我們要如何利用.NET來建立memory-mapped file呢?
首先第一步,我們要利用DllImport,將建立Memory-mapped file所需用到的API,宣告出來.
並且將一些API會使用到的常數,作宣告.
這樣一來,要利用.NET建立memory-mapping file的準備工作就已經就緒了
下一篇會在介紹用法.
沒有留言:
張貼留言
嘎嘎嘎