- Сообщения
- 3,557
- Репутация
- 628
В бета версии языка есть функции Map Management. Удобство их в том, что получить значение можно по имени ключа.
Не знаю как работают эти функции, но попробовал примерно реализовать это при помощи _WinAPI_CreateFileMapping
Не знаю как работают эти функции, но попробовал примерно реализовать это при помощи _WinAPI_CreateFileMapping
Код:
#include <WinApi.au3>
#include <WinAPIFiles.au3>
#include <GUIConstantsEx.au3>
Local $hMapping, $pAddress, $tData;используется для подключения к Map и считывания информации
;-Вариант создания карты, если входящие данные - массив(необязательно)
Local $ArrayDoc[3][2]
$ArrayDoc[0][0] = 'Первая запись'
$ArrayDoc[0][1] = 'Содержание первой записи'
$ArrayDoc[1][0] = 'Вторая запись'
$ArrayDoc[1][1] = 'Содержание второй записи'
$ArrayDoc[2][0] = 'Третья запись'
$ArrayDoc[2][1] = 'Содержание третьей записи'
For $i = 0 To UBound($ArrayDoc) - 1
_CreateFileMap($ArrayDoc[$i][1], 'wchar', 'Doc', StringLen($ArrayDoc[$i][1]), '|', $ArrayDoc[$i][0])
Next
Local $ArrayDoc = 0
;----------------------------------------------------
$Form1 = GUICreate("Form1", 430, 150, 465, 179)
$Input1 = GUICtrlCreateInput("", 16, 24, 305, 21);вводится имя Map для чтения, создания или изменения
$Input2 = GUICtrlCreateInput("", 16, 117, 305, 21);получаем содержание при чтении или вводим содержание для записи
$Button1 = GUICtrlCreateButton("Читать", 344, 24, 75, 25);читать информацию из Map
$Button2 = GUICtrlCreateButton("Создать", 344, 54, 75, 25);создать Map
$Button3 = GUICtrlCreateButton("Изменить", 344, 84, 75, 25);чтобы изменить, нужно получить содержание Map
$Button4 = GUICtrlCreateButton("Удалить", 344, 114, 75, 25);чтобы удалить, нужно "Читать" Map
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
_DisconnectFileMap($hMapping, $pAddress, $tData)
_OpenFileMap($hMapping, $pAddress, $tData, GUICtrlRead($Input1))
If Not @error Then
GUICtrlSetData($Input2, $tData.Doc)
Else
MsgBox(16, 'Error', 'Not Found', 0, $Form1)
EndIf
Case $Button2
$newname = StringStripWS(GUICtrlRead($Input1), 3)
$newdata = StringStripWS(GUICtrlRead($Input2), 2)
If Not $newdata = '' And Not $newdata = '' Then
_CreateFileMap($newdata, 'wchar', 'Doc', StringLen($newdata), '|', $newname)
If @error Then
MsgBox(16, 'Error', 'Write Error', 0, $Form1)
Else
GUICtrlSetData($Input1, '')
GUICtrlSetData($Input2, '')
MsgBox(0, '!!!', 'Written', 0, $Form1)
EndIf
Else
MsgBox(16, 'Error', 'Not Data', 0, $Form1)
EndIf
Case $Button3
_DeleteFileMap($tData)
If @error Then
MsgBox(16, 'Error', 'Not Found', 0, $Form1)
Else
_DisconnectFileMap($hMapping, $pAddress, $tData)
If @error Then
MsgBox(16, 'Error', 'Not Found', 0, $Form1)
Else
$newname = StringStripWS(GUICtrlRead($Input1), 3)
$newdata = StringStripWS(GUICtrlRead($Input2), 2)
If Not $newdata = '' And Not $newdata = '' Then
_CreateFileMap($newdata, 'wchar', 'Doc', StringLen($newdata), '|', $newname)
If @error Then
MsgBox(16, 'Error', 'Write Error', 0, $Form1)
Else
GUICtrlSetData($Input1, '')
GUICtrlSetData($Input2, '')
MsgBox(0, '!!!', 'Written', 0, $Form1)
EndIf
EndIf
EndIf
EndIf
Case $Button4
_DeleteFileMap($tData)
If @error Then
MsgBox(16, 'Error', 'Not Found', 0, $Form1)
Else
_DisconnectFileMap($hMapping, $pAddress, $tData)
If @error Then
MsgBox(16, 'Error', 'Not Found', 0, $Form1)
Else
GUICtrlSetData($Input1, '')
GUICtrlSetData($Input2, '')
MsgBox(0, '!!!', 'Removed', 0, $Form1)
EndIf
EndIf
EndSwitch
WEnd
Func _OpenFileMap(ByRef $MapFile, ByRef $PosFile, ByRef $StructFile, $FileMapName = 'DataExchangeFile')
Local $TempData, $TempInfData
$MapFile = _WinAPI_OpenFileMapping($FileMapName)
If $MapFile = 0 Then Return SetError(1)
$PosFile = _WinAPI_MapViewOfFile($MapFile)
If $PosFile = 0 Then Return SetError(2)
Local $t_Data = DllStructCreate('int sol[10]', $PosFile)
If @error Then Return SetError(3)
$TempData = $t_Data.sol
$t_Data = 0
Local $tInfData = DllStructCreate('int sol[10];wchar info[' & $TempData & ']', $PosFile)
If @error Then Return SetError(4)
$TempInfData = $tInfData.info
$tInfData = 0
$StructFile = DllStructCreate('int sol[10];wchar info[' & $TempData & '];' & $TempInfData, $PosFile)
If @error Then SetError(5)
EndFunc ;==>_OpenFileMap
Func _CreateFileMap($IncomingData = '', $DataType = 'wchar', $ElementName = 'var', $ElementSize = 1024, $Separator = '|', $FileMapName = 'DataExchangeFile')
Local $DataSize, $CreatedStruct, $InfoSizeStruct, $BaseStruct, $tagSTRUCT, $MapFile, $PosFile, $StructFile
Local $SplitInData = StringSplit('||' & $IncomingData, $Separator)
Local $SplitDataType = StringSplit('ptr|ptr|' & $DataType, $Separator);
Local $SplitNameData = StringSplit('hMapping|pAddress|' & $ElementName, $Separator)
Local $SplitSizeData = StringSplit('12|12|' & $ElementSize, $Separator)
If $SplitInData[0] <> $SplitNameData[0] Or $SplitInData[0] <> $SplitDataType[0] Or $SplitInData[0] <> $SplitSizeData[0] Then Return SetError(1)
For $i = 1 To $SplitInData[0]
If $SplitDataType[$i] = '' Or $SplitNameData[$i] = '' Then ContinueLoop
$DataNextElement = StringLen($SplitInData[$i])
$DataSize += $DataNextElement
If $SplitInData[$i] = '' And $SplitSizeData[$i] = '' Then
$CreatedStruct &= $SplitDataType[$i] & ' ' & $SplitNameData[$i] & ';'
ElseIf Not $SplitSizeData[$i] = '' Then
$CreatedStruct &= $SplitDataType[$i] & ' ' & $SplitNameData[$i] & '[' & $SplitSizeData[$i] & ']' & ';'
ElseIf Not $SplitInData[$i] = '' And $SplitSizeData[$i] = '' Then
$CreatedStruct &= $SplitDataType[$i] & ' ' & $SplitNameData[$i] & '[' & $DataNextElement & ']' & ';'
EndIf
Next
$CreatedStruct = StringTrimRight($CreatedStruct, 1)
$InfoSizeStruct = StringLen($CreatedStruct)
$BaseStruct = 'int sol[10];wchar info[' & $InfoSizeStruct & '];'
$tagSTRUCT = $BaseStruct & $CreatedStruct
$MapFile = _WinAPI_CreateFileMapping(-1, ($DataSize + $InfoSizeStruct) * 2 + 44, $FileMapName)
If $MapFile = 0 Then Return SetError(2)
$PosFile = _WinAPI_MapViewOfFile($MapFile)
If $PosFile = 0 Then Return SetError(3)
$StructFile = DllStructCreate($tagSTRUCT, $PosFile)
If @error Then Return SetError(4)
$StructFile.sol = $InfoSizeStruct
$StructFile.info = $CreatedStruct
For $i = 3 To $SplitInData[0]
DllStructSetData($StructFile, $SplitNameData[$i], $SplitInData[$i])
Next
DllStructSetData($StructFile, $SplitNameData[1], $MapFile)
DllStructSetData($StructFile, $SplitNameData[2], $PosFile)
EndFunc ;==>_CreateFileMap
Func _DisconnectFileMap(ByRef $MapFile, ByRef $PosFile, ByRef $StructFile);отключение файла
If Not _WinAPI_UnmapViewOfFile($PosFile) Then Return SetError(1)
If Not _WinAPI_CloseHandle($MapFile) Then Return SetError(2)
$StructFile = 0
EndFunc ;==>_DisconnectFileMap
Func _DeleteFileMap($StructFile);удаление файла
If Not _WinAPI_UnmapViewOfFile(DllStructGetData($StructFile, 'pAddress')) Then Return SetError(1)
If Not _WinAPI_CloseHandle(DllStructGetData($StructFile, 'hMapping')) Then Return SetError(2)
EndFunc ;==>_DeleteFileMap