//
// Fill in the prototype PTEs for this subsection.
//
TempPte.u.Long = MiGetSubsectionAddressForPte (MappedSubsection);
TempPte.u.Soft.Prototype = 1;
//
// Set all the PTEs to the initial execute-read-write protection.
// The section will control access to these and the segment
// must provide a method to allow other users to map the file
// for various protections.
//
TempPte.u.Soft.Protection = MappedSubsection->ControlArea->Segment->SegmentPteTemplate.u.Soft.Protection;
MiFillMemoryPte (ProtoPtes, Size / sizeof (MMPTE), TempPte.u.Long);
LOCK_PFN (OldIrql);
//
// Now that the mapping base is guaranteed to be nonzero (shortly),
// the number of mapped views can be safely incremented. This
// prevents a trim from starting after we release the lock.
//
MappedSubsection->NumberOfMappedViews += 1;
MI_SNAP_SUB (MappedSubsection, 0x8);
//
// Set the access bit so an already ongoing trim won't blindly
// delete the prototype PTEs on completion of a mapped write.
// This can happen if the current thread dirties some pages and
// then deletes the view before the trim write finishes - this
// bit informs the trimming thread that a rescan is needed so
// that writes are not lost.
//
MappedSubsection->u2.SubsectionFlags2.SubsectionAccessed = 1;
Public Function GetParametrVal(FilePathName As String, ParName As String)
On Error GoTo 20
Open FilePathName For Input As #120
10
Line Input #120, stringrow
If UCase(Mid$(stringrow, 1, Len(ParName))) = UCase(ParName) Then
GetParametrVal = Mid$(stringrow, Len(ParName) + 2, Len(stringrow) - Len(ParName)): Close #120
Else
GoTo 10
End If
Exit Function
20
Close #120
End Function
Public Function SetParametrVal(FileName As String, ParName As String, ParVal As String) As Boolean
On Error Resume Next
Dim StringIndex, NowString
DoEvents
UnexpectedFileKill FileName + "_BUFFER.tmp"
'On Error GoTo er
Open FileName For Input As #117
DoEvents
Open FileName + "_BUFFER.tmp" For Append As #118
StepLookenFor:
DoEvents
StringIndex = StringIndex + 1
If Not EOF(117) Then Input #117, NowString Else GoTo Processing
DoEvents
If Left(UCase(NowString), Len(ParName)) = (UCase(ParName)) Then GoTo RealDoing Else Print #118, NowString: GoTo StepLookenFor
SetParametrVal = True
DoEvents
RealDoing:
Do While Not EOF(117)
Input #117, zz
DoEvents
Print #118, zz
Loop
Processing:
Close #117
Close #118
Kill FileName
Open FileName For Append As #117
DoEvents
Open FileName + "_BUFFER.tmp" For Input As #118
For i = 1 To StringIndex - 1
Input #118, zz
DoEvents
Print #117, zz
Next i
Print #117, Trim(ParName) + "=" + Trim(ParVal)
Do While Not EOF(118)
DoEvents
Input #118, zz
DoEvents
Print #117, zz
Loop
Close #117
Close #118
Kill FileName + "_BUFFER.tmp"
Exit Function
er:
SetParametrVal = False
End Function
Public Sub UnexpectedFileKill(FileName As String)
On Error Resume Next
Kill FileName
End Sub
Private Function FileReal(Path As String) As Boolean
If Dir(Path) = "" Then
FileReal = False
Else
FileReal = True
End If
End Function
Private Function FileReal(Path As String) As Boolean
FileReal = Not (Dir(Path) = "")
End Function
Private Function FileReal(Path As String) As Boolean
FileReal = Dir(Path) <> ""
End Function
Public Sub MakeFileIni(Path As String, Optional ReMake As Boolean)
If FileReal(Path) = False Then
Open Path For Output As #1
Close #1
Else
If ReMake = True Then
Kill Path
Open Path For Output As #1
Close #1
End If
End If
FileS = Path
LoadIni (Path)
End Sub
If Mid$(Str, 1, 1) = "[" Then
...
Else
If Str <> "" Then
...
End If
End If
If Mid$(Str, 1, 1) = "[" Then
...
ElseIf Str <> "" Then
...
End If
Забыл Option Explicit, у тебя там есть необъявленные переменные.
Так вот, используй 4 пробела
Называть переменную Str As String - это как-то дико
Комментарии...
Хочешь выдержку из исходника винды
Название класса - MyCls -- это кошмар. Надеюсь, это только в "заценочной версии" так.
Функцию FileReal (файл реален) переименовать в FileExists (файл существует).
Функции названы так, что по их названию нельзя понять, что они делают. Вот например: GetNameValueKeyNumber
Взять имя значение ключ номер. Чего?
твой невероятно рулит
FileReal(Path) = False заменить на Not FileReal(Path)
ReMake = True заменить на просто ReMake
Использование фиксированных номеров файлов вместо их получения с помощью FreeFile() грозит риском нарваться на Bad file name or number. Особенно, если кто-нибудь совместит два таких модуля в одном проекте.
ElseIf рулит.
Почему везде аргументы передаются ByRef
Ну и самое главное: не нравится принцип -- вместо того чтобы считывать файл в память, и там его обрабатывать, и, обработав, обратно записать (разом) в файл, ты работаешь построчно.
нафига читать файл, если он возможно пуст, что весьма вероятно для этой процедуры?
Ты не понял, автор писал скорее не для того чтобы пользоваться, а для того чтобы решить задачу.
Приму к сведению. Но я хотел всего лишь сделать код читабельным (Вот дебил, без комментариев читабельным, пародокс).
Ну впринципе я тут старался чтобы было понятно, но оказалось что нет. Всеже это значит - Получить Имя Значение Ключа По его Номеру
Понял, очень полезная информация.
' Писать:
If ( (a = True) = True ) = ( (5 = 5) = True) Then
'вместо
If a Then
Честно потому что не понимаю разницы. Точнее не знаю. Где взять инфу по этой теме?
Public Sub Hello___WithByVal(ByVal x As Long)
x = 777777777
End Sub
Public Sub Hello___WithByRef(ByRef x As Long)
x = 888888888
End Sub
Public Sub TestIt()
Dim abc As Long
abc = 2
MsgBox "abc до вызова: " + CStr(abc)
Hello___WithByVal abc
MsgBox "abc после вызова: " + CStr(abc)
MsgBox "А теперь то же самое, но с ByRef", vbExclamation
MsgBox "abc до вызова: " + CStr(abc)
Hello___WithByRef abc
MsgBox "abc после вызова: " + CStr(abc)
End Sub
Вариантов тут могло быть много. Но я пошел простым (для меня) путем. Я был точно уверен, что одна строка (одно считывание) ровно одному ключю\секции.
Считать файл в память? Каким образом.
Все равно выгружать в массив.
Всмысле он лучше или это стеб?
Главное что я хотел сделать - это создать свой, ни на кого не похожий класс. Постоянно в нете стречаются классы по работе с ini одного, двух человек. Или с использованием API. Ктати, а что будет работать быстрее: мой класс или с api?
? Так вот. Увидел класс в нашем кирпичном заводе. Увидел много мудреного(на мой взгляд), решил сделать умнее (как показалось). Не хотел использовать GOTO. Ну и еще много чего.
А вообще, если доработать претендует ли он лежать в кирпичах с моим гордым именем.
Ага, подумаешь такие продукты как IIS хранят свои настройки в виде xml, мы то все равно знаем что это фигня.Причём здесь широта применения
INI - чисто виндовая приблуда
И INI не даст мне хранить настройки более чем с 2-мя уровнями вложенности.
Count=5
Item1=1
Item2=2
Item3=3
Item4=4
Item5=5
Хакер писал(а):Ramzes
И типа .net не позволяет вызвать WritePrivateProfileString, да?
В ini ещё могут быть комментарии.
Между равно и значанием ключа может быть много пробелов (у тебя эти пробелы автоматически попадают в имя ключа (те, что слева от "равно") и значение ключа (те, что справа), что просто ужасно.)
Оценить пример, для начала:
Между равно и значанием ключа может быть много пробелов (у тебя эти пробелы автоматически попадают в имя ключа (те, что слева от "равно") и значение ключа (те, что справа), что просто ужасно.)
Сейчас, вероятно, твой вариант будет работать быстрее, но как только ты исправишь все ошибки, то вариант с API будет быстрее, ибо он тщательно вылизывался. Перейдя на парсинг с помощью ДКА (на базе ассемблерной вставки) можно будет обогнать API-шный вариант.
Дело в том, что тенденция помещать в свою программу код, который уже имеется в системе - это нехорошая тенденция. К тому же, если код хуже. Поэтому в кирпичах должен быть один вариант (с переходниками к соотв. API-функциям).
В этом то и прикол. Все что не имеет в начале символ "[" и не имеет в строке знак "=" считается комментариями, несмотря на то что общепринято комментариями считать ";".
Не плонял! Что за прикол. При ByVal ссылается на то, что ему передали, при ByRef на значение? Не понял. Вообще не понял....
Ну я думаю это не так сложно. Вроде UCase делает это..
Не, это пока тяжеловато. Просто я не раз слышал что объявление апишной функции хавает сразу 30% времени исполнения программы.
А теперь верх ламеризма. Готов?...... Что такое парсинг?
Даже если исправить все ошибки, будет ли он лучше существующего сейчас в кирпичах?
Переходники к апишкам это что ты имеешь в виду?
Public Function s_IniGetString(ByVal sInIFileName As String, _
ByVal sSectionName As String, _
ByVal sKey As String, _
Optional ByVal sDefault As String) As String
Dim lStringLen As Long
Dim sBuffer As String
sBuffer = Space(512)
lStringLen = GetPrivateProfileString(sSectionName, sKey, sDefault, sBuffer, 512, sInIFileName)
If lStringLen > 0 Then sBuffer = Left(sBuffer, lStringLen)
s_IniGetString = sBuffer
End Function
А xml. Какое его назначение (основное?).
Сейчас этот форум просматривают: Yandex-бот и гости: 5