函数参考


_WinAPI_CreateFileMapping

创建或打开指定文件的有名或无名文件映射对象.

#Include <WinAPIEx.au3>
_WinAPI_CreateFileMapping ( $hFile [, $iSize [, $sName [, $iProtect [, $tSecurity]]]] )

参数

$hFile 创建文件映射对象的文件句柄.如果此参数为 -1,
 则 $iSize 必须指定文件映射对象的大小.
 此时本函数创建的文件映射对象由系统页面文件支持,
 而不是由文件系统的文件支持.
$iSize [可选参数] 文件映射对象的最大尺寸. 如果此参数为 0,
 文件映射对象的最大尺寸等于 $hFile 文件的当前大小
$sName [可选参数] 文件映射对象的名称.
$iProtect [可选参数] 指定文件映射对象的页面保护,可以是以下值之一:
 $PAGE_EXECUTE_READ --- 允许映射为只读,复制写入或执行访问
 $PAGE_EXECUTE_READWRITE --- 允许映射为只读,复制写入,读/写或执行访问
 $PAGE_EXECUTE_WRITECOPY --- 相当于 PAGE_EXECUTE_READ
 $PAGE_READONLY --- 允许映射为只读,复制写入访问
 $PAGE_READWRITE --- 允许映射为只读,复制写入,或读/写访问
 $PAGE_WRITECOPY --- 相当于 PAGE_READONLY
 结合上面的页面保护值,为文件映射对象指定下列一或多个属性:
 $SEC_COMMIT --- 如果文件映射对象由操作系统分页文件支持(即 $hfile 参数为 -1),当文件视图映射到进程地址空间,指定整个范围内的页面,而不是保留
 $SEC_IMAGE --- 指定 $hFile 参数值是一个可执行映像文件
 $SEC_LARGE_PAGES --- 对操作系统页面文件支持的文件映射对象启用大页面
 $SEC_NOCACHE --- 不缓存所有页面
 $SEC_RESERVE --- 如果文件映射对象由操作系统的分页支持,指定文件视图空间映射到进程地址,页面范围保留为以后整个过程使用
 $SEC_WRITECOMBINE --- 所有页写组合
$tSecurity [可选参数] $tagSECURITY_ATTRIBUTES 结构,决定子进程是否可以继承返回的句柄.
 如果此参数为 0, 句柄不能被继承,文件映射对象得到一个默认的安全描述符.

返回值

成功: 返回新创建的文件映射对象句柄.如果函数调用之前该对象已存在,
函数返回现有对象的句柄(当前的大小,而不是指定的大小),
并设置 @extended 为 1.
失败: 返回 0,设置 the @error 为非 0 值.

注意/说明

创建文件映射对象后的文件大小不得超过文件映射对象的大小;
 如果不是如此,则不是所有的文件内容为共享.
 使用单一的共享文件映射对象;或创建同一文件支持的单独映射文件,
 可使多个进程共享一个相同的文件视图.
通过继承句柄,复制句柄,或使用名称打开文件映射对象
 可使一个文件映射对象共享多个进程创建的句柄.
 文件映射对象实际上并没有映射视图到进程地址空间.
 映射文件视图到进程的地址空间由 _WinAPI_MapViewOfFile() 函数完成.
 映射文件映射对象视图维持内部引用的对象,在所有对它的引用被释放前,文件映射对象不会关闭.
 因此,要完全关闭文件映射对象,应用程序必须调用 _WinAPI_UnmapViewOfFile() 函数关闭映射视图;
 并调用 _WinAPI_CloseHandle() 关闭文件映射对象的句柄. 这些函数可以被任何顺序调用.

相关

详情参考

在MSDN中搜索


示例/演示


#NoTrayIcon

#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)
Opt('WinWaitDelay', 0)

Global Const $Title = '_WinAPI_MapViewOfFile' & ChrW(160)

If Not $CmdLine[0] Then
    If WinExists($Title) Then
        Exit
    EndIf
    For $i = 1 To 2
        If Not @compiled Then
            Run(@AutoItExe & ' "' & @ScriptFullPath & '" /' & $i)
        Else
            Run(@AutoItExe & ' /' & $i)
        EndIf
        Sleep(500)
    Next
    Exit
EndIf

Opt('TrayIconHide', 0)

Switch $CmdLine[1]
    Case '/1'
        _Sender()
    Case '/2'
        _Receiver()
    Case Else
        Exit
EndSwitch

Func _Receiver()

    Local $hMapping, $pAddress, $tData, $Text

    $hMapping = _WinAPI_OpenFileMapping('MyFileMapping')
    If @error Then
        Return
    EndIf

    $pAddress = _WinAPI_MapViewOfFile($hMapping)
    $tData = DllStructCreate('wchar[1024]', $pAddress)
    While WinWait($Title, '', 1)
        Sleep(200)
        $Text = DllStructGetData($tData, 1)
        DllStructSetData($tData, 1, '')
        If $Text Then
            MsgBox(64, $Title, $Text)
        EndIf
    WEnd
    _WinAPI_UnmapViewOfFile($pAddress)
    _WinAPI_CloseHandle($hMapping)
EndFunc   ;==>_Receiver

Func _Sender()

    Local $hMapping, $pAddress, $tData, $Text

    $hMapping = _WinAPI_CreateFileMapping(-1, 2048, 'MyFileMapping')
    If (@error) Or (@extended) Then
        MsgBox(16, 'Error', 'Unable to create file mapping.')
        Return
    EndIf

    $pAddress = _WinAPI_MapViewOfFile($hMapping)
    $tData = DllStructCreate('wchar[1024]', $pAddress)
    While WinWaitClose($Title)
        $Text = StringStripWS(InputBox($Title, 'Type some text message.', '', '', -1, 171), 3)
        If Not $Text Then
            ExitLoop
        EndIf
        DllStructSetData($tData, 1, $Text)
        If Not WinWait($Title, '', 1) Then
            ExitLoop
        EndIf
    WEnd
    _WinAPI_UnmapViewOfFile($pAddress)
    _WinAPI_CloseHandle($hMapping)
EndFunc   ;==>_Sender