Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19

Логика регистрации файла

14.05.2014, 08:23. Показов 4929. Ответов 50

Студворк — интернет-сервис помощи студентам
Сейчас делаю консольную программу
которую я протестировал на все возможные ошибки
работает примерно так.. Proga.exe /команда

Модуль этой программы
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
Option Explicit
DefLng F, I, L, N: DefStr J, S
'
'    © FelixMacintosh 2014
'
Const hlpMesage = "" & _
"Команды могут быть с большой или маленькой буквы" & vbCrLf & _
"Также можно вводить несколько команд" & vbCrLf & _
"Список команд:" & vbCrLf & _
"/s [путь к файлу] ; [путь для нового файла] ; [байтовый адрес]" & vbTab & "= Отделить файл" & vbCrLf & _
"/j [главный файл] ; [пришиваемый файл] " & vbTab & "= Объединить два файла" & vbCrLf & _
"/z [путь к zip архиву] ; [путь на диске] " & vbTab & "= Добавить в архив" & vbCrLf & _
"/uz [путь к zip архиву] ; [путь в архиве] ; [папка на диске] " & vbTab & "= Извлеч из архива" & vbCrLf & _
vbTab & "* Примечание папку на диске можно не указывать" & vbCrLf & _
vbTab & "в этом случае это будет текущая папка" & vbCrLf & _
"/r [путь к файлу]" & vbTab & "= Регистрация" & vbCrLf & _
"/u [путь к файлу]" & vbTab & "= Отмена регистрации" & vbCrLf & _
"/cmd [новая комманда отсюда]" & vbTab & "= Любая консольная команда" & vbCrLf & _
"/h или /help " & vbTab & "= Вызов этого сообщения" & vbCrLf & _
"Производство:" & vbCrLf & _
"© FelixMacintosh 2014" & vbTab & "http://vk.com/FelixMacintosh"
'
Private Const Infinite = -1&
Private Const Synchronize = &H100000
Private Const TH32CS_SNAPTHREAD = &H4
'
Private WshShell As Object 'As WshShell '
Private Fso As Object 'As FileSystemObject '
Private mArchive As Object
'
Private Type THREADENTRY32
    dwSize As Long
    cntUsage As Long
    th32ThreadID As Long
    th32OwnerProcessID As Long
    tpBasePri As Long
    tpDeltaPri As Long
    dwFlags As Long
End Type
 '
Private Declare Function Thread32First Lib "kernel32" (ByVal hSnapshot As Long, ByRef lpte As THREADENTRY32) As Long
Private Declare Function Thread32Next Lib "kernel32" (ByVal hSnapshot As Long, ByRef lpte As THREADENTRY32) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function OpenThread Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwThreadId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
 
Private Function WaitShell(MyCommand$) As Long
    '
    'Вызов Shell и новой команды, с ожиданием её завершения
    '
    Dim hProc&
    WaitShell = Shell(MyCommand)
    hProc = OpenProcess(Synchronize, False, WaitShell)
    WaitForSingleObject hProc, Infinite
    CloseHandle hProc
End Function
 
Private Sub SS(ByVal Section$, ByVal Key$, Optional ByVal Setting$ = "0")
    SaveSetting App.EXEName, Section, Key, Setting
End Sub
 
Private Function GS(ByVal Section$, ByVal Key$, Optional ByVal Setting$ = "0")
    GS = GetSetting(App.EXEName, Section, Key, "")
End Function
 
Private Sub TrimArray(Arr() As String)
    Dim i&
    For i = 0 To UBound(Arr): Arr(i) = Trim(Arr(i)): Next
End Sub
 
Private Sub Main()
    Const r = "/", p = " ", w = ";"
    Dim f, j(), s, j1(), j2(), Start&
    Set WshShell = CreateObject("Shell.Application")
    Set Fso = CreateObject("Scripting.FileSystemObject")
    s = Command$
    j = Split(s, r)
 
    On Error Resume Next: DeleteSetting App.EXEName
    On Error GoTo EndProgramm
 
    For f = 1 To UBound(j)
        j1 = Split(Trim(j(f)), p, 2): TrimArray j1
        '---------
        Select Case LCase(j1(0))
        Case "cmd"
            SS j1(0), WaitShell(j1(1))
        Case "s"
            j2 = Split(j1(1), w): TrimArray j2
            SS j1(0), "Len", WriteBytes(j2(1), ReadBytes(j2(0), CLng(j2(2))), , True)
        Case "j"
            j2 = Split(j1(1), w): TrimArray j2
            Start = Fso.GetFile(j2(0)).Size + 1
            SS j1(0), "Start", Start
            SS j1(0), "Len", WriteBytes(j2(0), ReadBytes(j2(1)), Start) - 1
        Case "uz"
            j2 = Split(j1(1), w): TrimArray j2
            If Fso.FileExists(j2(0)) And LCase(Fso.GetExtensionName(j2(0))) = "zip" Then
                If UBound(j2) = 1 Then
                    ReDim Preserve j2(2): j2(2) = CurDir$
                End If
                Archive = Fso.GetAbsolutePathName(j2(0))
                SS j1(0), UnZipFile(j2(1), j2(2))
            End If
            
        Case "z"
            j2 = Split(j1(1), w): TrimArray j2
            If Fso.FileExists(j2(0)) And LCase(Fso.GetExtensionName(j2(0))) = "zip" Then
                'Используем архив
                Archive = Fso.GetAbsolutePathName(j2(0))
                SS j1(0), CopyPathToArchive(Fso.GetAbsolutePathName(j2(1)))
            ElseIf LCase(Fso.GetExtensionName(j2(0))) = "zip" Then
                'Создаём архив
                CreateArchive Fso.GetAbsolutePathName(j2(0))
                SS j1(0), CopyPathToArchive(Fso.GetAbsolutePathName(j2(1)))
            End If
        Case "r"
            SS j1(0), RegSvr32(j1(1))
        Case "u"
            SS j1(0), RegSvr32(j1(1), True)
        Case "h", "help"
            SS j1(0), MsgBox(hlpMesage)
        Case Else
            'Не выполнена ни одна комманда
        End Select
    Next
EndProgramm:
    '-------------------------Конец программы
    Set WshShell = Nothing
    Set Fso = Nothing
End Sub
 
Private Function CopyHere(Parent, vItem) As Boolean
    '
    'Функция копирования
    'Аргументы: Папка (Zip-папка) // Копируемый объект
 
    Dim f&, Key$, hnd&
    Dim Trd(2) As Collection
    Dim tid As Long, hTrd As Long
    On Error Resume Next
 
    'Получаем список потоков !
    GetThreadsList Trd(0) 'Запомнить старые потоки
    Call Parent.CopyHere((vItem)) 'Копирование >>>>>>>>>>>>
    GetThreadsList Trd(1) 'Запомнить новые потоки
    
    If vItem.Count > 0 Then If Err.Number = 0 Then GoTo 1 'В этом случае ждать не нужно
    
    Err.Clear 'Сброс всех ошибок
 
    Set Trd(2) = New Collection
    For f = Trd(1).Count To 1 Step -1
        Key = "C" & Trd(1).Item(f)
        hnd = Trd(0)(Key)
        If hnd = 0 Then Trd(2).Add CLng(Mid$(Key, 2))
    Next
 
    For f = 1 To Trd(2).Count 'Ожидание открытых потоков
        tid = Trd(2).Item(f)
        hTrd = OpenThread(Synchronize, False, tid)
        WaitForSingleObject hTrd, Infinite
        CloseHandle hTrd
    Next
    CopyHere = True
    Exit Function
1
End Function
 
 
Private Sub GetThreadsList(List As Collection)
    '
    '   Возвращает List с коллекцией потоков
    '
    Dim hSnap As Long, TE As THREADENTRY32, PID As Long
    Set List = New Collection
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0)
    If hSnap = -1 Then Exit Sub
    TE.dwSize = Len(TE)
    PID = GetCurrentProcessId()
    If Thread32First(hSnap, TE) Then
        Do
            If TE.th32OwnerProcessID = PID Then List.Add TE.th32ThreadID, "C" & CStr(TE.th32ThreadID)
        Loop While Thread32Next(hSnap, TE)
    End If
    CloseHandle hSnap
End Sub
 
 
Public Function UnZipFile(ByVal ParseName$, ByVal DestPath$) As Boolean
    '
    'Извлечение из архива
    'Аргументы:
    'DestPath - Путь к папке для распаковки архива
    'ParseName - Путь в архиве
    'Примечание: Имена файлов в архиве, должны быть полными !
    '
    Dim DestDir As Object, Parse As Object
    If (mArchive Is Nothing) Then Exit Function 'Проверяем указан ли архив ?
    On Error GoTo 1
    
    If Not Fso.FolderExists(DestPath) Then 'Проверяем есть ли папка
        Fso.CreateFolder (DestPath) 'Создаём папку для перемещаемых туда объектов
    End If
    
    Set DestDir = WshShell.NameSpace((DestPath))
    Set Parse = mArchive.ParseName((ParseName))
    UnZipFile = CopyHere(DestDir, Parse)
    Exit Function
1
End Function
 
Public Function NameArchiveFiles$(Optional ByVal ind&, Optional ByVal NameOnly As Boolean)
    '
    'Возврат имени файла в архиве
    'Аргументы:
    'ZipName - имя архива
    'Ind - номер файла в архиве (начало с 0), по умолчанию - 0
    'NameOnly - Только имя, без расширения
    '
    If (mArchive Is Nothing) Then Exit Function 'Проверяем указан ли архив ?
    On Error Resume Next
    If NameOnly Then
        NameArchiveFiles = mArchive.Items().Item((ind)).Рath
    Else
        NameArchiveFiles = mArchive.Items().Item((ind)).Name
    End If
End Function
 
Public Function CopyPathToArchive(ByVal FilePath$) As Boolean
    '
    'Копирует файл / папку в архив
    'Арг: полное имя
    '
    If (mArchive Is Nothing) Then Exit Function 'Проверяем указан ли архив ?
    If Len(Dir(FilePath, vbDirectory)) > 0 And Len(Dir(FilePath)) = 0 Then
 
        If WshShell.NameSpace((FilePath)).Items.Count = 0 Then
            MsgBox ("Нельзя добавить пустую папку")
            Exit Function
        End If
    End If
    'mArchive.CopyHere (FilePath)
    CopyPathToArchive = CopyHere(mArchive, FilePath) 'Копируем в архив
End Function
 
Public Function CreateArchive(ByVal Рath$) As Boolean
    '
    'Создаёт новый архив
    'Возврат утверждения о создании
    '
    If Fso.FileExists(Рath) Then Kill Рath
    Fso.CreateTextFile(Рath, True).Write "PK" & Chr(5) & Chr(6) & String(18, 0)
    Set mArchive = WshShell.NameSpace((Рath))
    CreateArchive = Not (mArchive Is Nothing) 'Возврат утверждения о создании
End Function
 
 
 
Public Property Get Archive() As Variant
    '
    'Возвращает объект архива
    '
    Set Archive = mArchive
End Property
 
Public Property Let Archive(ByVal vNewValue As Variant)
    '
    'Свойство: Archive = Файловый путь
    'Арг: полное имя
    '
    If Fso.FileExists(vNewValue) Then
        Set mArchive = WshShell.NameSpace((vNewValue))
    End If
End Property
 
 
Private Function RegSvr32(Path$, Optional UnReg As Boolean) As Boolean
 
    Dim hProc&, hShell&
    If Fso.FileExists(Path) = False Then Exit Function
    Select Case LCase(Fso.GetExtensionName(Path))
    Case "dll", "ocx"
    Case Else: Exit Function
    End Select
 
    If UnReg Then
        hShell = WshShell("RegSvr32 /s /u " & Path)
    Else
        hShell = WshShell("RegSvr32 /s " & Path)
    End If
 
    hProc = OpenProcess(Synchronize, False, hShell)
    WaitForSingleObject hProc, Infinite
    CloseHandle hProc
    RegSvr32 = True
End Function
 
 
Private Function ReadBytes(FileName$, Optional ByRef Start&, Optional ByVal dln&) As Byte()
    'Чтение байт из файла
    'Арг: Путь // Старт // Длина по умолчанию всего файла
    'Возврат: Массив байт и следующая позиция чтения
    Dim n, f: On Error Resume Next
    f = FreeFile
    Open FileName For Binary As #f
    If Start Then Else Start = 1
    n = LOF(f) - Start + 1
    If dln = 0 Or dln > n Then dln = n
    ReDim Preserve ReadBytes(dln - 1)
    Get #f, Start, ReadBytes: Close #f
    If Err = 0 Then Start = Start + UBound(ReadBytes) + 1
End Function
 
Private Function WriteBytes&(FileName$, Bytes() As Byte, Optional ByVal Start&, _
Optional Overwrite As Boolean)
    'Запись байт в файл
    'Арг: Путь // Массив байт // Старт // Флаг перезаписи
    'Возврат: Следующая позиция записи (при успешном выполнении)
    Dim n, f: On Error Resume Next
    If Start Then Else Start = 1
    f = FreeFile 'Определяем номер свободного файла
    If Overwrite Then Kill FileName
    Open FileName$ For Binary As #f: Put #f, Start, Bytes: Close #f 'Копируем !
    If Err = 0 Then WriteBytes = Start + UBound(Bytes) + 1
End Function


так вот..
я хочу внести туда еще три команды
r+ =Зарегить при условии что эта dll не зарегестрированна
u+ =Отменить рег. только при условии что не этой прогой было регестрированно
u- =Отменить при условии... затем удалить !
uz+ =Извлеч при условии что если это dll(ocx) и если она не зареганна...

как правильно организовать логику регистрации файла

Добавлено через 15 минут
Подозреваю что при выполнении регистраций придёться гдето хранить
записи, то что было сделанно...

вот я и хочу узнать как правильно и где их хранить чтоб не оказаться потом криворуким програмистом...

и не удалить по неосторожности важные компоненты для системы...

Добавлено через 24 минуты
...вобщем буду делать так...
хранить гдето отдельно, например в системной папке
специальный файл, в котором будет только список тех компонентов
которые зарегала эта прога, в этом случае восстановление системы будет
следить за этим файлом...

при регистрации компонента сначало будет проверяться
зареган ли этот компонент, и только если он никак не зареган
только тогда будет добавленна запись в этот список...

при отмене-же регистрации, сначало будет просматриваться список...
и если в списке есть эта запись то только тогда можно отменить, и удалить
эту запись...

как-то так.. наверное... я конечно сомневаюсь..
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.05.2014, 08:23
Ответы с готовыми решениями:

Создание регистрации и аутентификации spring. Логика регистрации и авторизации
Для регистрации юзера на сервер приходят данные в json формате(логин пароль подтвержденный пароль). Принимаю их на контроллер на маппинг...

В каком элементе MVC должна обрабатываться логика регистрации и авторизации?
Доброго всем времени суток уважаемые форумчане! Вот начал изучать ООП в php с использованием MVC. И у меня возник вопрос: как сделать если...

Описание файла журнала регистрации
Приветствую, ребята! Подскажите пожалуйста, где можно почитать про описание протокола файла ЖР, я имею ввиду структуру файла *.lgd,...

50
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
15.05.2014, 22:36  [ТС]
Студворк — интернет-сервис помощи студентам
✰ ✰ ✰
Сделал по своему
теперь у меня DLL'ка которая показывает инфу TlbInf32.Dll
надёжно самоизвлекаеться, в случае её отсутствия и регистрации на других машинах
в папку C:\WINDOWS\system32\RegLib\

кстате скачал её на странице у Castal'а ..она новее моей оказалась
  • версия: 6.00.8804
  • коментарий: March 14, 2000

только чтото я не пойму она как-то через раз показывает GUID ...
пробывал по GUID'у сканить реестр не помогает, реестр синхронно выдаёт тоже самое..
не пойму, что я не так делаю...

ниже модуль и проект
также...исправил важный момент! ..двойные кавычки
..ну и много чего еще наисправлял

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
Option Explicit
DefLng F, H-I, L, N: DefStr J, S
'
'    © FelixMacintosh 2014
'
Private Const r = "/", k = "\", p = " ", w = ";", t = "."
Private Const Infinite = -1&
Private Const SYNCHRONIZE = &H100000
Private Const TH32CS_SNAPTHREAD = &H4
'
Private ShellApp As Object 'As Shell '
Private Fso As Object ' As FileSystemObject '
Private TliApp As Object 'As TLIApplication '
Private WshShell As Object
'
Private Archive As Object
'
Private Type THREADENTRY32
    dwSize As Long
    cntUsage As Long
    th32ThreadID As Long
    th32OwnerProcessID As Long
    tpBasePri As Long
    tpDeltaPri As Long
    dwFlags As Long
End Type
 '
Private Declare Function Thread32First Lib "kernel32" (ByVal hSnapshot As Long, ByRef lpte As THREADENTRY32) As Long
Private Declare Function Thread32Next Lib "kernel32" (ByVal hSnapshot As Long, ByRef lpte As THREADENTRY32) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function OpenThread Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwThreadId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
 
Dim j1(), ID$, bool As Boolean, Start&
Dim Install_log$, System32$
 
Function GetName$(FileName$)
    '
    'Возвращает только имя без папок [\]
    'в формате GetBaseName.GetExtensionName или только GetBaseName
    '
    Dim s$
    GetName = Fso.GetBaseName(FileName)
    s = Fso.GetExtensionName(FileName)
    If Len(s) Then GetName = GetName & t & s
 
End Function
 
Function GUID$(FileName$, Optional HelpDir$)
    On Error Resume Next
    GUID = TliApp.TypeLibInfoFromFile(GetName(FileName)).GUID
    HelpDir = WshShell.RegRead("HKEY_CLASSES_ROOT\TypeLib\" & GUID & "\1.0\HELPDIR\")
End Function
 
Function ResReg(ByVal AbsPath$, Class$) As Object
    '
    'Внутренняя функция для обеспечения работы программы
    'Проверка, извлечение DLL из ресурса, регистрация
    'и возврат ссылки на указанный класс этого объекта
    '
    Dim f&, j$()
    On Error Resume Next
    For f = 0 To 1
        Err.Clear
        Set ResReg = CreateObject(Class)
        If Err Then
            If Not Fso.FileExists(AbsPath) Then
                j = Split(GetName(AbsPath), t)
                If Not CreateFile(AbsPath, True, LoadResData(j(0), j(1))) Then
                    Exit For 'Если файл не мог создасьться то выход
                End If
            End If
            RegSvr32 AbsPath 'Регистрация
        Else: Exit For
        End If
    Next
    
End Function
 
Sub Main()
    Dim f&, ListComands$(), s$, j$()
 
    Set ShellApp = CreateObject("Shell.Application")
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set WshShell = CreateObject("WScript.Shell")
    System32 = Fso.GetParentFolderName(Environ("ComSpec"))
    Set TliApp = ResReg(System32 & k & App.EXEName & "\TLBINF32.DLL", "TLI.TLIApplication")
 
    On Error Resume Next
    'Проверка на наличие файла Install.log (создание его)
    Install_log = System32 & k & App.EXEName & "\Install.Log"
    CreateFile Install_log
    
    DeleteSetting App.EXEName
 
    s = Command$
    ListComands = Split(s, r): TrimArray ListComands
    For f = 1 To UBound(ListComands)
        j = Split(ListComands(f), p, 2): TrimArray j
        '---------
        Select Case LCase(j(0))
        Case "cmd": com_cmd j
        Case "s": com_s j
        Case "j": com_j j
        Case "uz", "uz+": com_uz j
        Case "z": com_z j
        Case "r", "r+": com_r j
        Case "u", "u+": com_u j
        Case "h", "help": com_h j
        Case Else
            'Не выполнена ни одна комманда
        End Select
    Next
    '-------------------------Конец программы
    Set ShellApp = Nothing
    Set Fso = Nothing
    Set TliApp = Nothing
 
End Sub
 
Sub com_h(j())
    SS j(0), MsgBox(LoadResString(101))
End Sub
 
Sub com_u(j())
    SS j(0), "GUID", RegSvr32(j(1), False)
End Sub
 
Sub com_r(j())
    Dim h$
    ID = GUID(j(1), h)
    If j(0) = "r+" And Len(ID) Then
        SS j(0), "GUID", ID
    Else
        ID = RegSvr32(j(1))
        If Len(ID) Then 'Запись о зарегестрированном файле
            CreateFile Install_log, False, vbCrLf & ID, Fso.GetFile(Install_log).Size + 1
        End If
        SS j(0), "GUID", ID
    End If
End Sub
 
Sub com_z(j())
    j1 = Split(j(1), w): TrimArray j1
    If Fso.FileExists(j1(0)) And LCase(Fso.GetExtensionName(j1(0))) = "zip" Then
        'Используем архив
        Set Archive = ShellApp.NameSpace((Fso.GetAbsolutePathName(j1(0))))
        SS j(0), CopyPathToArchive(Fso.GetAbsolutePathName(j1(1)))
    ElseIf LCase(Fso.GetExtensionName(j1(0))) = "zip" Then
        'Создаём архив
        CreateArchive Fso.GetAbsolutePathName(j1(0))
        SS j(0), CopyPathToArchive(Fso.GetAbsolutePathName(j1(1)))
    End If
End Sub
 
Sub com_uz(j())
    j1 = Split(j(1), w): TrimArray j1
    If Fso.FileExists(j1(0)) And LCase(Fso.GetExtensionName(j1(0))) = "zip" Then
        If UBound(j1) = 1 Then
            ReDim Preserve j1(2): j1(2) = CurDir$
        End If
        Set Archive = ShellApp.NameSpace((Fso.GetAbsolutePathName(j1(0))))
        SS j(0), UnZipFile(j1(1), j1(2))
    End If
End Sub
 
Sub com_j(j())
    j1 = Split(j(1), w): TrimArray j1
    Start = Fso.GetFile(j1(0)).Size + 1
    SS j(0), "Start", Start
    SS j(0), "Len", WriteBytes(j1(0), ReadBytes(j1(1)), Start) - 1
End Sub
 
Sub com_s(j())
    j1 = Split(j(1), w): TrimArray j1
    SS j(0), "Len", WriteBytes(j1(1), ReadBytes(j1(0), CLng(j1(2))), , True)
End Sub
 
Sub com_cmd(j())
    SS j(0), WaitShell(j(1))
End Sub
 
Function CreateFile(ByVal AbsPath$, Optional Overwrite As Boolean, Optional vBytes, Optional ByRef Start&) As Boolean
    '
    'Проверяет путь и при не обходимости создаёт вложенные папки и файл
    'Арг: Абсолютный путь // True = перезапись // Данные // ByRef Начальная позиция записи
    '
    Dim f&, j$(), s$, byt() As Byte, bit As Boolean
    bit = Fso.FileExists(AbsPath)
    If bit And Overwrite Then
        s = AbsPath: GoTo WriteFile
    ElseIf bit Then
        GoTo WriteFile
    End If
    '------------------------
    j = Split(AbsPath, k)
    On Error GoTo EndFunction
    For f = 0 To UBound(j) - 1
        s = s & j(f) & k
        If Not Fso.FolderExists(s) And f = 0 Then
            Exit Function 'Драйвер указан не верно
        ElseIf Not Fso.FolderExists(s) Then
            Call Fso.CreateFolder(s)
        End If
    Next
WriteFile:
    s = TypeName(vBytes)
    Select Case s
    Case "String", "Byte()" 'Если в переменной vBytes правильные данные, то ...
        'Конвертировать данные в байтовый массив
        If s = "String" Then byt = StrConv(vBytes, vbFromUnicode) Else byt = vBytes
        Start = WriteBytes(AbsPath, byt, Start, Overwrite) 'Копируем эти данные
        Erase byt 'Уничтожить массив для высвобождения памяти
    Case Else
        'Если файла не существует, то...
        If bit = False Then Call WriteBytes(AbsPath, byt, 0, False) 'Создаём пустой файл 0 байт
    End Select
    CreateFile = Fso.FileExists(AbsPath) 'Получаем бит утверждения что файл на месте
    
EndFunction:
End Function
 
Function CreateFolder(ByVal AbsPath$) As Boolean
    '
    'Проверяет путь и при не обходимости создаёт недостающие папки
    '
    Dim f&, j$(), s$
    CreateFolder = Fso.FolderExists(AbsPath)
    If CreateFolder Then Exit Function
    '---------------
    j = Split(AbsPath, k)
    On Error GoTo 1
    For f = 0 To UBound(j)
        s = s & j(f) & k
        If Not Fso.FolderExists(s) And f = 0 Then
            Exit Function 'Драйвер указан не верно
        ElseIf Not Fso.FolderExists(s) Then
            Call Fso.CreateFolder(s)
        End If
    Next
    CreateFolder = Fso.FolderExists(AbsPath)
1
End Function
 
Function WaitShell(MyCommand$) As Long
    '
    'Вызов Shell и новой команды, с ожиданием её завершения
    '
    Dim hProc&
    WaitShell = Shell(MyCommand)
    hProc = OpenProcess(SYNCHRONIZE, False, WaitShell)
    WaitForSingleObject hProc, Infinite
    CloseHandle hProc
End Function
 
Sub SS(ByVal Section$, ByVal Key$, Optional ByVal Setting$ = "0")
    SaveSetting App.EXEName, Section, Key, Setting
End Sub
 
Function GS(ByVal Section$, ByVal Key$, Optional ByVal Setting$ = "0")
    GS = GetSetting(App.EXEName, Section, Key, "")
End Function
 
Sub TrimArray(Arr() As String)
    Dim f&
    For f = 0 To UBound(Arr): Arr(f) = Trim(Arr(f)): Next
End Sub
 
Function CopyHere(Parent, vItem) As Boolean
    '
    'Функция копирования
    'Аргументы: Папка (Zip-папка) // Копируемый объект
 
    Dim f&, Key$, hnd&
    Dim Trd(2) As Collection
    Dim tid As Long, hTrd As Long
    On Error Resume Next
 
    'Получаем список потоков !
    GetThreadsList Trd(0) 'Запомнить старые потоки
    Call Parent.CopyHere((vItem)) 'Копирование >>>>>>>>>>>>
    GetThreadsList Trd(1) 'Запомнить новые потоки
 
    If vItem.Count > 0 Then If Err.Number = 0 Then GoTo 1 'В этом случае ждать не нужно
 
    Err.Clear 'Сброс всех ошибок
 
    Set Trd(2) = New Collection
    For f = Trd(1).Count To 1 Step -1
        Key = "C" & Trd(1).Item(f)
        hnd = Trd(0)(Key)
        If hnd = 0 Then Trd(2).Add CLng(Mid$(Key, 2))
    Next
 
    For f = 1 To Trd(2).Count 'Ожидание открытых потоков
        tid = Trd(2).Item(f)
        hTrd = OpenThread(SYNCHRONIZE, False, tid)
        WaitForSingleObject hTrd, Infinite
        CloseHandle hTrd
    Next
    CopyHere = True
    Exit Function
1
End Function
 
 
Sub GetThreadsList(List As Collection)
    '
    '   Возвращает List с коллекцией потоков
    '
    Dim hSnap&, TE As THREADENTRY32, PID&
    Set List = New Collection
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0)
    If hSnap = -1 Then Exit Sub
    TE.dwSize = Len(TE)
    PID = GetCurrentProcessId()
    If Thread32First(hSnap, TE) Then
        Do
            If TE.th32OwnerProcessID = PID Then List.Add TE.th32ThreadID, "C" & CStr(TE.th32ThreadID)
        Loop While Thread32Next(hSnap, TE)
    End If
    CloseHandle hSnap
End Sub
 
 
Function UnZipFile(ByVal ParseName$, ByVal DestPath$) As Boolean
    '
    'Извлечение из архива
    'Аргументы:
    'DestPath - Путь к папке для распаковки архива
    'ParseName - Путь в архиве
    'Примечание: Имена файлов в архиве, должны быть полными !
    '
    Dim DestDir As Object, Parse As Object
    If (Archive Is Nothing) Then Exit Function 'Проверяем указан ли архив ?
    On Error GoTo 1
 
    If Not Fso.FolderExists(DestPath) Then 'Проверяем есть ли папка
        Fso.CreateFolder (DestPath) 'Создаём папку для перемещаемых туда объектов
    End If
 
    Set DestDir = ShellApp.NameSpace((DestPath))
    Set Parse = Archive.ParseName((ParseName))
    UnZipFile = CopyHere(DestDir, Parse)
    Exit Function
1
End Function
 
Function ArchivePath$(Optional ByVal ind&)
    '
    'Возврат имени файла в архиве
    'Ind - номер файла в архиве (начало с 0), по умолчанию - 0
    '
    If (Archive Is Nothing) Then Exit Function 'Проверяем указан ли архив ?
    On Error Resume Next
    ArchivePath = Archive.Items().Item((ind)).Рath
End Function
 
Function CopyPathToArchive(ByVal FilePath$) As Boolean
    '
    'Копирует файл / папку в архив
    'Арг: полное имя
    '
    If (Archive Is Nothing) Then Exit Function 'Проверяем указан ли архив ?
    If Len(Dir(FilePath, vbDirectory)) > 0 And Len(Dir(FilePath)) = 0 Then
 
        If ShellApp.NameSpace((FilePath)).Items.Count = 0 Then
            MsgBox ("Нельзя добавить пустую папку")
            Exit Function
        End If
    End If
    CopyPathToArchive = CopyHere(Archive, FilePath) 'Копируем в архив
End Function
 
Function CreateArchive(ByVal AbsPath$) As Boolean
    '
    'Создаёт новый архив
    'Возврат утверждения о создании
    'Арг: полное имя
    '
    CreateFile AbsPath, True, "PK" & Chr(5) & Chr(6) & String(18, 0)
    Set Archive = ShellApp.NameSpace((AbsPath))
    CreateArchive = Not (Archive Is Nothing) 'Возврат утверждения о создании
End Function
 
Function RegSvr32(ByVal Path$, Optional Reg As Boolean = True) As String
    '
    'Возвращает GUID
    'Арг: Зарегить/Отменить регистрацию
    '
    Dim hProc&, hShell&, Path34$
    
    Path = Replace(Path, Chr(34), vbNullString)
    If Len(Path) Then Path34 = Chr(34) & Path & Chr(34)
    If Fso.FileExists(Path) = False Then Exit Function
    Select Case LCase(Fso.GetExtensionName(Path))
    Case "dll", "ocx"
    Case Else: Exit Function
    End Select
    If Reg Then
        hShell = Shell("RegSvr32 " & Path34) 'Зарегить
'        hShell = Shell("RegSvr32 /s " & Path34) 'Зарегить тихий режим
    Else
        hShell = Shell("RegSvr32 /u " & Path34) 'Отменить
'        hShell = Shell("RegSvr32 /s /u " & Path34) 'Отменить тихий режим
    End If
    hProc = OpenProcess(SYNCHRONIZE, False, hShell)
    WaitForSingleObject hProc, Infinite
    CloseHandle hProc
    RegSvr32 = GUID(Path)
End Function
 
 
Function ReadBytes(FileName$, Optional ByRef Start&, Optional ByVal dln&) As Byte()
    'Чтение байт из файла
    'Арг: Путь // Старт // Длина по умолчанию всего файла
    'Возврат: Массив байт и следующая позиция чтения
    Dim n&, f&: On Error Resume Next
    f = FreeFile
    Open FileName For Binary As #f
    If Start Then Else Start = 1
    n = LOF(f) - Start + 1
    If dln = 0 Or dln > n Then dln = n
    ReDim Preserve ReadBytes(dln - 1)
    Get #f, Start, ReadBytes: Close #f
    If Err = 0 Then Start = Start + UBound(ReadBytes) + 1
End Function
 
Function WriteBytes&(FileName$, Bytes() As Byte, Optional ByVal Start&, _
Optional Overwrite As Boolean)
    'Запись байт в файл
    'Арг: Путь // Массив байт // Старт // Флаг перезаписи
    'Возврат: Следующая позиция записи (при успешном выполнении)
    Dim n&, f&: On Error Resume Next
    If Start Then Else Start = 1
    f = FreeFile 'Определяем номер свободного файла
    If Overwrite Then Kill FileName
    Open FileName$ For Binary As #f: Put #f, Start, Bytes: Close #f 'Копируем !
    If Err = 0 Then WriteBytes = Start + UBound(Bytes) + 1
End Function
Вложения
Тип файла: rar RegLib.rar (61.2 Кб, 5 просмотров)
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
16.05.2014, 03:02
Лучший ответ Сообщение было отмечено Антихакер32 как решение

Решение

Ты не учитываешь что компонент может не содержать библиотеки типов, например zipfldr, хотя может быть зарегистрирован. Приблизительный код, для получения списка зарегистрированных библиотек
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Option Explicit
 
' © The trick, 2014
 
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExW" (ByVal hKey As Long, ByVal lpSubKey As Long, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyW" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As Long, ByVal cbName As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExW" (ByVal hKey As Long, ByVal lpValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
 
Private Const KEY_READ = &H19
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const ERROR_NO_MORE_ITEMS = 259&
Private Const IPS = "\InProcServer32"
 
Private Type HashItem
    Value   As String
    Next    As Long
End Type
 
Dim WithEvents Lst As ListBox
 
Private Sub Form_Load()
    Dim hKey    As Long
    Dim hSubKey As Long
    Dim buf     As String
    Dim I       As Long
    Dim c       As Long
    Dim hash()  As HashItem
    
    Set Lst = Controls.Add("VB.ListBox", "Lst")
    Lst.Visible = True
    
    ReDim hash(511)
    
    If RegOpenKeyEx(HKEY_CLASSES_ROOT, StrPtr("CLSID"), 0, KEY_READ, hKey) Then MsgBox "Error": Exit Sub
    ' Ïîëó÷àåì ñïèñîê áèáëèîòåê
    buf = Space(260)
    Do Until RegEnumKey(hKey, I, StrPtr(buf), Len(buf)) = ERROR_NO_MORE_ITEMS
        Mid$(buf, InStr(1, buf, vbNullChar)) = IPS & vbNullChar
        If RegOpenKeyEx(hKey, StrPtr(buf), 0, KEY_READ, hSubKey) = 0 Then
            ' Ïîëó÷àåì ïóòü
            If RegQueryValueEx(hSubKey, 0, 0, 0, ByVal 0&, c) = 0 Then
                If c > Len(buf) Then buf = Space(c)
                RegQueryValueEx hSubKey, 0, 0, 0, ByVal StrPtr(buf), c
                Add hash(), Left$(buf, c \ 2 - 1)
            End If
            RegCloseKey hSubKey
        End If
        I = I + 1
    Loop
    RegCloseKey hKey
    ' Ïåðå÷èñëåíèå
    For I = 0 To UBound(hash)
        If Len(hash(I).Value) Then Lst.AddItem hash(I).Value
    Next
    ' Ñîðòèðîâêà
    qSort 0, Lst.ListCount - 1
End Sub
Private Sub qSort(ByVal low As Long, ByVal high As Long)
    Dim I As Long, J As Long, M As String, wsp As String
    I = low: J = high: M = Lst.List((I + J) \ 2)
    Do Until I > J: Do While Lst.List(I) < M: I = I + 1: Loop: Do While Lst.List(J) > M: J = J - 1: Loop
        If (I <= J) Then wsp = Lst.List(I): Lst.List(I) = Lst.List(J): Lst.List(J) = wsp: I = I + 1: J = J - 1
    Loop
    If low < J Then qSort low, J
    If I < high Then qSort I, high
End Sub
Private Sub Add(Items() As HashItem, Value As String)
    Dim I   As Long
    Dim N   As Long
    I = CalcHash(Value)
    If Len(Items(I).Value) Then
        If StrComp(Items(I).Value, Value, vbTextCompare) = 0 Then Exit Sub
        Do While Items(I).Next
            I = Items(I).Next
            If StrComp(Items(I).Value, Value, vbTextCompare) = 0 Then Exit Sub
        Loop
        N = UBound(Items) + 1
        ReDim Preserve Items(N)
        Items(N).Value = Value
        Items(I).Next = N
    Else: Items(I).Value = Value
    End If
End Sub
Private Function CalcHash(S As String) As Long
    Dim I   As Long
    Dim c   As Integer
    For I = 1 To Len(S)
        c = Asc(LCase(Mid$(S, I, 1)))
        If c = 0 Then Exit For
        CalcHash = (CalcHash * 11 + c) And &HFFFFFF
    Next
    CalcHash = CalcHash And &H1FF
End Function
Private Sub Form_Resize()
    Lst.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
End Sub
3
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
16.05.2014, 07:10  [ТС]
The trick, спасибо ! ✰ ✰ ✰ ...
ты настоящий друг !...
правильно я сделал, что добавил в друзья на всех форумах...

Значит теперь можно избавится от TlbInf32.Dll
Всё необходимое можно получить твоим кодом, а вот zipfldr
может быть зарегана но не содержать типов...
или zipfldr может
в оперативке быть, но не зареганна... в Windows , если я не ошибаюсь даже гдето
параметр такой есть ...возможность работы с zip, как с обычными папками...
...а стоит ли её таскать с собой ?

...пойду переделывать,

Не по теме:


P.S из за нарушений я не могу получить доступ к своему альбому до лета,
тем-не менее я нашел способ ставить картинки :)

0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
16.05.2014, 08:53  [ТС]
Ну да... вот она !

между прочим, винду я совсем недавно установил...
и к тому-же мини версию, около 100мб так что можно делать
вывод что таскать её не надо
Миниатюры
Логика регистрации файла  
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
16.05.2014, 08:57
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
...а стоит ли её таскать с собой ?
Если ты с ней работаешь, то возможно. Но ты видимо не работаешь, я тебе тогда давал ссылку, ты не пользовался ей же.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
16.05.2014, 09:56  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
я тебе тогда давал ссылку, ты не пользовался ей же.
я иногда пользуюсь, не обижайся... просто я иногда не запоминаю того
с чем не приходиться сталкиваться практически...

Добавлено через 45 минут
Сейчас построчно, (посимвольно..) изучаю твой код..
примечательно что оператор деления может писаться вот так [\]
Add hash(), Left$(buf, c \ 2 - 1)
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
16.05.2014, 09:58
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
примечательно что оператор деления может писаться вот так
Это целочисленное деление, в данном коде это сдвиг вправо (намного эффективнее деления)
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
16.05.2014, 10:01  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Это целочисленное деление
Спасибо тоже чтото новое для меня, и полезное ✰..., говорю-же.. тебе надо в майкрософте работать...
и зарплату, как у депутата
0
16.05.2014, 10:06

Не по теме:

Цитата Сообщение от FelixMacintosh Посмотреть сообщение
примечательно что оператор деления может писаться вот так [\]
Жора, ты этого не знал?? :swoon:

0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
16.05.2014, 10:13  [ТС]
Предлагаю внести этот пост в готовые решения...
как полезность номер 1

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от SoftIce Посмотреть сообщение
Жора, ты этого не знал?
...к сожалению нет... :black_eye.:

0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
16.05.2014, 10:44  [ТС]
недостаток в том, что по-видимому такое деление недопустимо для Double
тоесть величиной более 2^32
Миниатюры
Логика регистрации файла  
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
16.05.2014, 10:48
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
недостаток в том, что по-видимому такое деление недопустимо для Double'й
Смысл? Double - вещественное число c плавающей точкой (запятой). Тоже деление в Double
Visual Basic
1
Z = Fix(X/2)
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
16.05.2014, 10:59  [ТС]
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
величиной более + - 2 ^ 32
...я про это, так- что использовать такое деление только в типах Long...

Добавлено через 4 минуты
...ну это как говорится другая история...
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
21.05.2014, 21:20  [ТС]

Во как замутно получилось, предворительно можно ознакомиться...
с главным модулем...
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
Option Explicit
DefLng F, H-I, L, N: DefStr J, S 'Переменные по умолчанию
'
'© FelixMacintosh (CiberForum.ru)
'Соавторство: The trick, 2014
'Главный запускающий модуль
'
'''#Const Variant_RegSvr32 = "WinApi" 'Вариант с использованием WinApi
#Const Variant_RegSvr32 = "Shell" 'Вариант с использованием Shell
'
Public Const r = "/", k = "\", p = " ", w = ";", t = "." 'Общие символы
Public Const INFINITE = -1&
Public Const SYNCHRONIZE = &H100000
Public Const TH32CS_SNAPTHREAD = &H4
'
Public Type HashItem
    Value   As String
    Next    As Long
End Type
'
Public Type THREADENTRY32
    dwSize As Long
    cntUsage As Long
    th32ThreadID As Long
    th32OwnerProcessID As Long
    tpBasePri As Long
    tpDeltaPri As Long
    dwFlags As Long
End Type
 
Public Declare Function OpenThread Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwThreadId As Long) As Long
Public Declare Function Thread32First Lib "kernel32" (ByVal hSnapshot As Long, ByRef lpte As THREADENTRY32) As Long
Public Declare Function Thread32Next Lib "kernel32" (ByVal hSnapshot As Long, ByRef lpte As THREADENTRY32) As Long
Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Public Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'
#If Variant_RegSvr32 = "WinApi" Then
    Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
    Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
    Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
#End If
'
Dim m_TliApp As Object
Dim m_ShellApp As Object
Dim m_Fso As Object
Dim j1(), ID$
Dim Install_log$, System32$
'
Public Property Get ShellApp() As Object 'As Shell '
    If m_ShellApp Is Nothing Then Set m_ShellApp = CreateObject("Shell.Application")
    Set ShellApp = m_ShellApp
End Property
'
Public Property Get Fso() As Object 'As FileSystemObject '
    If m_Fso Is Nothing Then Set m_Fso = CreateObject("Scripting.FileSystemObject")
    Set Fso = m_Fso
End Property
'
Sub TrimArray(arr() As String)
    Dim f&
    For f = 0 To UBound(arr): arr(f) = Trim(arr(f)): Next
End Sub
'
Private Property Get TliApp() As Object 'As TLIApplication'
    'TLBINF32.DLL находится в ресурсе, и нужна только сдесь
    'В этом единственном случае при регистрации файла
    'Функция CheckReg возвратит False, так как её-же и использует...
    '
    If m_TliApp Is Nothing Then _
    Set m_TliApp = ResReg(System32 & k & App.EXEName & "\TLBINF32.DLL", "TLI.TLIApplication")
    Set TliApp = m_TliApp
End Property
'
Function WaitShell(ByVal MyCommand$, Optional ByVal Mileseconds& = INFINITE) As Long
    '
    'Вызов Shell и новой команды, с ожиданием её завершения
    'Арг: Команда // Ожидание в милисекундах (-1 = ждать вечно)
    '
    Dim hProc&
    WaitShell = Shell(MyCommand)
    hProc = OpenProcess(SYNCHRONIZE, False, WaitShell)
    WaitForSingleObject hProc, Mileseconds
    CloseHandle hProc
End Function
 
Function CheckReg(ByVal Path$) As Boolean
    '
    'Проверка на зарегестрированность
    '
    Dim o(3) As Object
    On Error Resume Next
    Path = Fso.GetAbsolutePathName(Path)
    If Fso.FileExists(Path) = False Then Exit Function
    Set o(0) = TliApp.TypeLibInfoFromFile(Path).TypeInfos
    For Each o(1) In o(0)
        If InStr(1, o(1), "_") And Err = 0 Then
        ElseIf Len(o(1)) And Err = 0 Then
            '
            'Находим одноименный класс этой библиотеки, в системе
            'и пытаемся создать на него ссылу
            '
            Set o(2) = CreateObject(GetName(Path, True) & t & o(1))
            CheckReg = Not (o(2) Is Nothing)
            Debug.Assert CheckReg 'Не зареганна !''''''''''''''''''_Режим отладки
            Debug.Assert Not CheckReg 'Зареганна !
            If CheckReg Then Exit For '>>> Выход при обнаружении класса в системе
            'Если не удалось то ...
            'Дальнейшее перечисление классов, если найдутся...
            '
        End If
    Next
    Set o(2) = Nothing
End Function
 
#If Variant_RegSvr32 = "WinApi" Then
    '
    'Вариант с использованием WinApi
    '
    Function RegSvr32(ByVal Path$, Optional Reg As Boolean = True) As Boolean
        '
        'Возвращает утверждение о зарегестрированной dll // Ocx
        'Арг: Зарегить/Отменить регистрацию
        '
        Dim lb As Long, pa As Long
        On Error Resume Next
        Path = Fso.GetAbsolutePathName(Replace(Path, Chr(34), vbNullString))
        lb = LoadLibrary(Path)
        If lb Then
            pa = GetProcAddress(lb, IIf(Reg, "DllRegisterServer", "DllUnregisterServer"))
           If pa > 0 Then
               Call CallWindowProc(pa, 0, ByVal 0&, ByVal 0&, ByVal 0&)
                If FreeLibrary(lb) Then RegSvr32 = CheckReg(Path)
           End If
        End If
    End Function
    
#ElseIf Variant_RegSvr32 = "Shell" Then
    '
    'Вариант с использованием Shell
    '
    Function RegSvr32(ByVal Path$, Optional Reg As Boolean = True) As Boolean
        '
        'Возвращает утверждение о зарегестрированной dll // Ocx
        'Арг: Зарегить/Отменить регистрацию
        '
        Dim hProc&, hShell&, Path34$
        On Error Resume Next
        Path = Fso.GetAbsolutePathName(Replace(Path, Chr(34), vbNullString))
        If Fso.FileExists(Path) = False Then Exit Function
        Path34 = Chr(34) & Path & Chr(34)
        hShell = Shell(IIf(Reg, "RegSvr32 /s", "RegSvr32 /s /u") & p & Path34)
        hProc = OpenProcess(SYNCHRONIZE, False, hShell)
        WaitForSingleObject hProc, 100 'Подождать процесс регистрации
        CloseHandle hProc
        RegSvr32 = CheckReg(Path)
    End Function
#End If
 
 
Function ResReg(ByVal Path$, Class$) As Object
    '
    'Внутренняя функция для обеспечения работы программы
    'Проверка, извлечение DLL из ресурса, регистрация
    'и возврат ссылки на указанный класс этого объекта
    '
    Dim f&, J$()
    On Error Resume Next
    For f = 0 To 1
        Err.Clear
        Set ResReg = CreateObject(Class)
        If Err Then
            If Not Fso.FileExists(Path) Then
                J = Split(GetName(Path), t)
                If Not CreateFile(Path, True, LoadResData(J(0), J(1))) Then
                    Exit For 'Если файл не мог создасьться то выход
                End If
            End If
            RegSvr32 Path 'Регистрация
        Else: Exit For
        End If
    Next
End Function
 
Sub main()
    Dim f&, ListComands$(), S$, J$()
    '
    'Определение пути для хранения настроек
    System32 = Fso.GetParentFolderName(Environ("ComSpec"))
 
    On Error Resume Next
    'Проверка на наличие файла Install.log (создание его)
    Install_log = System32 & k & App.EXEName & "\Install.Log"
    CreateFile Install_log
 
    DeleteSetting App.EXEName
 
    S = Command$
    ListComands = Split(S, r): TrimArray ListComands
    For f = 1 To UBound(ListComands)
        J = Split(ListComands(f), p, 2): TrimArray J
        '---------
        Select Case LCase(J(0))
        Case "cmd": com_cmd J
        Case "s": com_s J
        Case "j": com_j J
        Case "uz", "uz+": com_uz J
        Case "z": com_z J
        Case "r", "r+": com_r J
        Case "u", "u+": com_u J
        Case "h", "help": com_h J
        Case Else
            'Не выполнена ни одна комманда
        End Select
    Next
    '-------------------------Конец программы
    Set m_ShellApp = Nothing
    Set m_Fso = Nothing
    Set m_TliApp = Nothing
End Sub
 
Sub com_h(J())
    SS J(0), MsgBox(LoadResString(101))
End Sub
 
Sub com_u(J())
    SS J(0), "RegSvr32", RegSvr32(J(1), False)
End Sub
 
Sub RecordInstall_log(LineIn$, Optional Rec As Boolean = True)
    '
    'Запись в специальный файл
    'Арг: строка // Rec = Запись или удаление
    '
   
    Dim f&, S$, J(), bit As Boolean
    On Error Resume Next
    LineIn = Fso.GetAbsolutePathName(LineIn)
    S = StrConv(ReadBytes(Install_log), vbUnicode)
    J = Split(S, vbCrLf)
    For f = 0 To UBound(J) - 1
        bit = InStr(1, J(f), LineIn, vbTextCompare) > 0
        If bit Then Exit For
    Next
    If Rec = True And bit = False Then
        'Для записи:
        'Если данной записи нет то записываем в конец
        CreateFile Install_log, False, LineIn$ & vbCrLf, Fso.GetFile(Install_log).Size + 1
    ElseIf Rec = False And bit = True Then
        CreateFile Install_log, True 'Перезапись всего текста
        S = J(f) 'Пропустить эту строку
        For f = 0 To UBound(J) - 1
            If J(f) <> S Then _
            CreateFile Install_log, False, J(f) & vbCrLf, Fso.GetFile(Install_log).Size + 1
        Next
    End If
End Sub
 
Sub com_r(J())
    Dim h$, bit As Boolean
    bit = CheckReg(J(1))
    If J(0) = "r+" And bit Then 'Не регестрировать заново
        SS J(0), "RegSvr32", bit
    Else 'Новая запись о зарегестрированном файле
        bit = RegSvr32(J(1))
        If bit Then
            RecordInstall_log J(1)
            SS J(0), "RegSvr32", bit
        End If
    End If
End Sub
 
Sub com_z(J())
    j1 = Split(J(1), w): TrimArray j1
    'Используем/Создаём архив
    Zip.Archive = j1(0)
    SS J(0), CopyPathToArchive(j1(1)) 'Перемещаем туда объект
End Sub
 
Sub com_uz(J())
    j1 = Split(J(1), w): TrimArray j1
    If Fso.FileExists(j1(0)) And LCase(Fso.GetExtensionName(j1(0))) = "zip" Then
        If UBound(j1) = 1 Then
            ReDim Preserve j1(2): j1(2) = CurDir$
        End If
        Set Archive = ShellApp.NameSpace((Fso.GetAbsolutePathName(j1(0))))
        SS J(0), UnZipFile(j1(1), j1(2))
    End If
End Sub
 
Sub com_j(J())
    Dim Start&
    j1 = Split(J(1), w): TrimArray j1
    Start = Fso.GetFile(j1(0)).Size + 1
    SS J(0), "Start", Start
    SS J(0), "Len", WriteBytes(j1(0), ReadBytes(j1(1)), Start) - 1
End Sub
 
Sub com_s(J())
    j1 = Split(J(1), w): TrimArray j1
    SS J(0), "Len", WriteBytes(j1(1), ReadBytes(j1(0), CLng(j1(2))), , True)
End Sub
 
Sub com_cmd(J())
    SS J(0), WaitShell(J(1))
End Sub
 
 
Sub SS(ByVal Section$, ByVal Key$, Optional ByVal Setting$ = "0")
    SaveSetting App.EXEName, Section, Key, Setting
End Sub
 
Function GS(ByVal Section$, ByVal Key$, Optional ByVal Setting$ = "0")
    GS = GetSetting(App.EXEName, Section, Key, "")
End Function
а ниже проект целиком

Добавлено через 4 минуты
...
Миниатюры
Логика регистрации файла  
Вложения
Тип файла: rar RegLib.rar (67.6 Кб, 6 просмотров)
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
21.05.2014, 22:58  [ТС]
Сейчас отлаживаю возможность чтения
библиотек в zip - архиве...

так вот.. к сожалению в архиве невозможно получить инфу классов файла dll
наверное придёться сначало извлеч во временную папку, прочитать, затем
переместить или удалить .. тоесть если использовать этот ключ /uz+

Добавлено через 7 минут
остануться только мелочи.. иконку добавить или еще чего..
и наднях .. уже гденибудь выложу, готовый скомпиленный эксешник
получится чтото вроде самораспаковывающего архива ..
хотя можно и его потом делать .. посретством 7zip или WinRar
там главное правильно организовать установку ..

Добавлено через 2 минуты
после этого, уже можно посылать клиентам скомпиленные файлы ..
с секретиками всякими ...сюрпризами ...и тп
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
23.05.2014, 23:16  [ТС]
делать dll-ку из за двух функций, это-же глупость...
я сделал dll'ку с помощью которой можно управлять всей
операционной системой .. (ссыль)
после того как RegLib.exe запустится, ... кстате в ней-же и будет эта dll-ка
то можно получить от программы нормальный ответ...

в тех наработках я еще использую пока реестр, для обмена..
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
23.05.2014, 23:47  [ТС]
вот как-бы что требуется

например я вызвал программу командой /help или /h
появилось окно, и родительская прога его ждёт...
Миниатюры
Логика регистрации файла  
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
24.05.2014, 00:38  [ТС]
затем после выхода из программы , я намеренно поставил Stop
чтоб посмотреть ответ от дочерней проги, но хелп ничего не возвращает поэтому
для пустых данных я сделал ответ Null

Добавлено через 4 минуты
...хотел картинку вложить не получилось, ошибка этого сайта...
на словах объясню...
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Command1_Click()
    Dim v, f, n
'    Shell "RegLib\RegLib.exe /u RegLib\dllerr.dll"
    Call Wait(Shell("RegLib\RegLib.exe /h"), -1)
 
    v = GetAllSettings("RegLib", 0)
    Stop 'Посмотреть переменные
    For f = 0 To UBound(v)
       Debug.Print v(0, 1)
    Next
 
End Sub
Добавлено через 14 минут
...Ну теперь можно и отдохнуть... до лета

Добавлено через 28 минут
...
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
24.05.2014, 00:39  [ТС]
картинка...
Миниатюры
Логика регистрации файла   Логика регистрации файла  
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
24.05.2014, 20:06  [ТС]
Теперь я на полном серьёзе изучаю возможность
запуска программы с различными вариантами
тоесть кликается правая кнопка мышки на мой эксэшник..
а там вызываеться подсказка
привет Вася!
выбери свой запуск..
  • Обычный запуск
  • Настройки программы
  • Деинсталяция
все это пропишеться в реестре по GUID'у программы
а по умолчанию, конечно-же запустится обычный запуск от левой кнопки как у всех

Добавлено через 4 минуты
там же можно организовать и такое
...при деинсталяции обязательно укажите причину
чтоб наши специалисты смогли сделать эту программу лучше
Добавлено через 4 минуты
вообще, с таким подходом
когда у эксешника пришит файл
неизвестного кодирования (известного только программе)
невозможно будет ничего взломать и прочитать
всё будет надёжно запароленно

Добавлено через 7 часов 21 минуту
а вообще... я сейчас всё переделаю...
у меня мои собственные DLL'ки вообще не будут нуждаться в регистрации ...

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Option Explicit
 
Private Const DLL_PROCESS_ATTACH As Long = 1
Private Const DLL_PROCESS_DETACH As Long = 0
Private Const DLL_THREAD_ATTACH As Long = 2
Private Const DLL_THREAD_DETACH As Long = 3
 
 
 
 
 
Public Function DllEntryPoint(ByVal hInstance As Long, ByVal lReason As Long, ByVal lReserved As Long) As Long
    ' Эта функция - точка входа в библиотеку.
    ' Это значит, что она будет вызвана при загрузке и выгрузке библиотеки
    ' из адресного пространства процесса, а так же при "присоединении" и
    ' "отсоединении" потока.
    
    ' Здесь может быть абсолютно любой код, но логичнее использовать точку входа
    ' для инициализации/деинициализации внутренних данных библиотеки.
    
    ' Если вам не нужна своя точка входа, можете её удалить. Для этого
    ' необходимо:
    '    1) Перейти в модуль класса "CStdDLLInfo"
    '    2) Удалить/закомментировать там строчку:
    '         .SetEntryPoint AddressOf DllEntryPoint
    '    3) Удалить эту процедуру (не обязательно)
    
    ' Помните: функция должна иметь исключительно 3 аргумента типа As Long,
    '           передаваемых по значению ( ByVal), а также иметь возвратный тип Long
    '          В противном случае библиотеку будет незагружаемой (в лучшем случае,
    '          а в худщем - будет рушить процесс, который пытается загрузить библиотеку)
              
    Select Case lReason
        Case DLL_PROCESS_ATTACH
            ' Разместите здесь код, который должен выполняться при загрузке
            ' библиотеки.
            ' ВНИМАНИЕ: DllEntryPoint при передаче DLL_PROCESS_ATTACH в
            '           качестве lReason должна обязательно возвращать
            '           ненулевое значение, в знак того, что она загрузилась.
            '           В противном случае, библиотека загружаться не будет.
                        
                        
                        
                        
                        
        
            DllEntryPoint = 1
            
        Case DLL_PROCESS_DETACH
            ' Поместите здесь код, который должен выполняться при выгрузке
            ' библиотеки.
            
            
            
            
        Case DLL_THREAD_ATTACH
            ' Поместите здесь код, который должен выполняться, когда загрузивший
            ' библиотеку процесс создаёт новый поток (нить выполнения )
            
            
            
            
        Case DLL_THREAD_DETACH
            ' Поместите здесь код, который должен выполняться, когда какой-либо
            ' поток процесса завершается.
            
            
            
    End Select
End Function
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.05.2014, 20:06

Как вывести переменную из файла регистрации
У меня есть регистрация, при регистрации пользователь указывает логин,пароль,мыло и телефон. Вот как мне вывести номер телефон...

Вывод уведомления о успешной регистрации(не удачной) на странице с формой регистрации
Здравствуйте, не получается сделать вывод сообщения на странице с формой регистрации. &lt;?php $dbc = mysqli_connect('...',...

Вывести форму регистрации для регистрации другого пользователя
Здравствуйте, уважаемые форумчане! Простите, вообще не бум-бум в Joomle, но нужно сделать лабу по нему. Мне нужно сделать регистрацию...

Что за журнал регистрации в 1с8.3 есть, где все регистрации сохраняются в отдельными файлами в определенную папку
Здравствуйте, не подскажите, кто знает Что за журнал регистрации в 1с8.3 есть, где все регистрации сохраняются в отдельными файлами...

хочу вконтакт, а не получается. просит регистрации через два файла jad и ...! заколебался слать смс!
что делать с тупарылым аккаунтом, хочу вконтакт, а не получается. просит регистрации через два файла jad и ...! заколебался слать смс!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru