Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/2086: Рейтинг темы: голосов - 2086, средняя оценка - 4.60
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
18.05.2015, 10:16  [ТС]
Студворк — интернет-сервис помощи студентам
Расчет хешей:
  • MD5
  • SHA-256 (SHA-2)
Шифрование по алгоритмам:
  • RC2, RC4
  • Rijndael AES Block Cipher
Автор порта: Phil Fresle
http://www.frez.co.uk/free/vb6code
Вложения
Тип файла: zip md5.zip (16.0 Кб, 152 просмотров)
Тип файла: zip frezcrypto.zip (17.9 Кб, 138 просмотров)
Тип файла: zip rijndaelvb.zip (13.3 Кб, 141 просмотров)
Тип файла: zip sha.zip (13.3 Кб, 143 просмотров)
4
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.05.2015, 10:16
Ответы с готовыми решениями:

Продам готовые коды и решения на Visual Basic за 400 рублей
душу продаю:cry: Продам коды исходные на VB !!10 лет копил за 400р !!размер тока кодов 312метров там есть все ! мыло контакты удалены....

Коды на Visual Basic
Ребята всем привет,я начел изучать "Visual Basic"! Очень буду благодарен за коды по этому языку, очень интиресный язык)))! Бросайте сюда...

Вывод решения вместо Immediate в textbox (visual basic 6.0)
программа выводит решение в Immediate а я хочу разместить на форме text1 и что бы решение выводилось туда ,менял код менял не че не...

360
Заблокирован
21.06.2015, 18:20
Фрейм, который дружит с манифестом

Разработал фрэйм который полностью имитирует оригинальный

Но при этом дружит с манифестом, не вызывает глюков как в режиме проектирования,
так и в режиме выполнения

Целиком код модуля UserControl
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
Option Explicit
'Property Variables:
Dim LbSize As Label
 
Private Sub UserControl_Initialize()
    Dim i&
    For i = 1 To 4
        With Controls.Add("vb.PictureBox", "Pic" & i)
            .Visible = 1
            If i = 1 Then
                 Set Frm1.Container = Controls("Pic" & i)
            Else
                With Controls.Add("vb.Frame", "Frm" & i)
                    Set .Container = Controls("Pic" & i)
                    .Visible = 1
                End With
            End If
            .BorderStyle = 0
        End With
    Next
    Set LbSize = Controls.Add("vb.Label", "LbSize")
    With LbSize
        .AutoSize = True
    End With
    
 
End Sub
 
Private Sub UserControl_InitProperties()
    Frm1.Caption = Extender.Name
End Sub
 
Private Sub UserControl_Resize()
    Const minSize = 75
    Dim maxSize&
    Set LbSize.Font = Frm1.Font
    LbSize.Caption = Frm1.Caption
    maxSize = LbSize.Height
    '''----
    Controls("Pic" & 1).Move 0, 0, Width, maxSize
    Controls("Frm" & 1).Move 0, 0, Width, Height
    '''----
    Controls("Pic" & 2).Move Width - minSize, 0, minSize, Height
    Controls("Frm" & 2).Move -Width + minSize, 0, Width, Height
    '''----
    Controls("Pic" & 3).Move 0, Height - minSize, Width, minSize
    Controls("Frm" & 3).Move 0, -Height + minSize, Width, Height
    '''----
    Controls("Pic" & 4).Move 0, 0, minSize, Height
    Controls("Frm" & 4).Move 0, 0, Width, Height
End Sub
 
'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
'MappingInfo=Frame1,Frm1,-1,Caption
Public Property Get Caption() As String
    Caption = Frm1.Caption
End Property
 
Public Property Let Caption(ByVal New_Caption As String)
    Frm1.Caption() = New_Caption
    PropertyChanged "Caption"
End Property
 
'Load property values from storage
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
    Frm1.Caption = PropBag.ReadProperty("Caption", "Frm1")
    Set Frm1.Font = PropBag.ReadProperty("Font", Ambient.Font)
    UserControl.BackColor = PropBag.ReadProperty("BackColor", &H8000000F)
End Sub
 
Private Sub UserControl_Show()
    BackColor = UserControl.BackColor
End Sub
 
'Write property values to storage
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
    Call PropBag.WriteProperty("Caption", Frm1.Caption, "Frm1")
    Call PropBag.WriteProperty("Font", Frm1.Font, Ambient.Font)
    Call PropBag.WriteProperty("BackColor", UserControl.BackColor, &H8000000F)
End Sub
 
'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
'MappingInfo=Frame1,Frm1,-1,Font
Public Property Get Font() As Font
    Set Font = Frm1.Font
End Property
 
Public Property Set Font(ByVal New_Font As Font)
    Set Frm1.Font = New_Font
    UserControl_Resize
    PropertyChanged "Font"
End Property
 
'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
'MappingInfo=UserControl,UserControl,-1,BackColor
Public Property Get BackColor() As OLE_COLOR
    BackColor = UserControl.BackColor
End Property
 
Public Property Let BackColor(ByVal New_BackColor As OLE_COLOR)
    Dim i&
    For i = 1 To 4
        Controls("Frm" & i).BackColor = New_BackColor
    Next
    UserControl.BackColor() = New_BackColor
    Refresh
    PropertyChanged "BackColor"
End Property



Картинки !





В архиве тэстовый проект
Миниатюры
Готовые решения и полезные коды на Visual Basic 6.0   Готовые решения и полезные коды на Visual Basic 6.0  
Вложения
Тип файла: rar NewFrame.rar (28.3 Кб, 134 просмотров)
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
29.06.2015, 13:07  [ТС]
Функция sTrimU (аналог Trim для обрезания произвольных букв)

1 аргумент - строка, из которой будут вырезаны символы слева и справа.
2 аргумент - символ или набор символов, которые нужно урезать.

Trim$, обрезка пробелов, табуляций и прочего
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
29.06.2015, 20:19  [ТС]
Получение списка процессов / информации о потоках процессов

Показывает:
- имя процесса,
- путь к образу,
- PID
- да и любые другие данные полей структуры SYSTEM_PROCESS_INFORMATION

Данному коду не нужны права Администратора. Используется функция NtQuerySystemInformation.

Тем не менее, для получения полного пути к образу нужны повышенные привилегии,
чтобы открыть процессы, запущенные с правами выше предоставленных группе "Ограниченный пользователь".

Путь получаем разными функциями в зависимости от версии ОС:
- Windows XP - GetModuleFileNameEx,
- а для x64 битных процессов - GetProcessImageFileName с преобразованием имен в стиле объектов ядра (\Device\HarddiskVolumeX) в стиль имен разделов диска.
- Windows Vista и выше - QueryFullProcessImageName, если ошибка, то функциями, описанными выше.

Для процессов, открытых от LOCAL SERVICES, путь не всегда будет получен по причине отказа в доступе для открытия процесса на чтение. Диспетчер задач такие данные берет скорее всего из таблицы хендлов smss.exe (как например, это делается в "Process manipulator" (взял у одного китайца, м.б. кому то будет интересно посмотреть (в учебных целях), код прилагаю / не проверял) ).

В коде также предоставляются привилегии отладчика. Это в принципе лишнее. Upd... Фига, таки нужны. В скомпилированном виде без них не может получить пути. Видимо среда IDE VB6 автоматически получает права отладчика процесса.

Process List
Кликните здесь для просмотра всего текста

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
' Process List by Alex Dragokas
 
Option Explicit
 
Const MAX_PATH As Long = 260&
 
Private Declare Function NtQuerySystemInformation Lib "ntdll.dll" (ByVal infoClass As Long, Buffer As Any, ByVal BufferSize As Long, ret As Long) As Long
Private Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExW" (lpVersionInformation As Any) 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetModuleFileNameEx Lib "psapi.dll" Alias "GetModuleFileNameExW" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFileName As Long, ByVal nSize As Long) As Long
Private Declare Function GetProcessImageFileName Lib "psapi.dll" Alias "GetProcessImageFileNameW" (ByVal hProcess As Long, ByVal lpImageFileName As Long, ByVal nSize As Long) As Long
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryW" (ByVal lpBuffer As Long, ByVal nSize As Long) As Long
Private Declare Function ExpandEnvironmentStrings Lib "kernel32" Alias "ExpandEnvironmentStringsW" (ByVal lpSrc As Long, ByVal lpDst As Long, ByVal nSize As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueW" (ByVal lpSystemName As Long, ByVal lpName As Long, lpLuid As Long) As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, ByVal PreviousState As Long, ByVal ReturnLength As Long) As Long
Private Declare Function GetFullPathName Lib "kernel32.dll" Alias "GetFullPathNameW" (ByVal lpFileName As Long, ByVal nBufferLength As Long, ByVal lpBuffer As Long, lpFilePart As Long) As Long
Private Declare Function QueryFullProcessImageName Lib "kernel32.dll" Alias "QueryFullProcessImageNameW" (ByVal hProcess As Long, ByVal dwFlags As Long, ByVal lpExeName As Long, ByVal lpdwSize As Long) As Long
Private Declare Function GetLogicalDriveStrings Lib "kernel32.dll" Alias "GetLogicalDriveStringsW" (ByVal nBufferLength As Long, ByVal lpBuffer As Long) As Long
Private Declare Function QueryDosDevice Lib "kernel32.dll" Alias "QueryDosDeviceW" (ByVal lpDeviceName As Long, ByVal lpTargetPath As Long, ByVal ucchMax As Long) As Long
 
Private Type TOKEN_PRIVILEGES
    PrivilegeCount  As Long
    LuidLowPart     As Long
    LuidHighPart    As Long
    Attributes      As Long
End Type
 
Private Type LARGE_INTEGER
    LowPart     As Long
    HighPart    As Long
End Type
 
Private Type CLIENT_ID
    UniqueProcess   As Long  ' HANDLE
    UniqueThread    As Long  ' HANDLE
End Type
 
Private Type UNICODE_STRING
    Length      As Integer
    MaxLength   As Integer
    lpBuffer    As Long
End Type
 
Private Type VM_COUNTERS
    PeakVirtualSize             As Long
    VirtualSize                 As Long
    PageFaultCount              As Long
    PeakWorkingSetSize          As Long
    WorkingSetSize              As Long
    QuotaPeakPagedPoolUsage     As Long
    QuotaPagedPoolUsage         As Long
    QuotaPeakNonPagedPoolUsage  As Long
    QuotaNonPagedPoolUsage      As Long
    PagefileUsage               As Long
    PeakPagefileUsage           As Long
End Type
 
Private Type IO_COUNTERS
    ReadOperationCount      As Currency 'ULONGLONG
    WriteOperationCount     As Currency
    OtherOperationCount     As Currency
    ReadTransferCount       As Currency
    WriteTransferCount      As Currency
    OtherTransferCount      As Currency
End Type
 
Private Type SYSTEM_THREAD
    KernelTime          As LARGE_INTEGER
    UserTime            As LARGE_INTEGER
    CreateTime          As LARGE_INTEGER
    WaitTime            As Long
    StartAddress        As Long
    ClientId            As CLIENT_ID
    Priority            As Long
    BasePriority        As Long
    ContextSwitchCount  As Long
    State               As Long 'enum KTHREAD_STATE
    WaitReason          As Long 'enum KWAIT_REASON
    dReserved01         As Long
End Type
 
Private Type SYSTEM_PROCESS_INFORMATION
    NextEntryOffset         As Long
    NumberOfThreads         As Long
    SpareLi1                As LARGE_INTEGER
    SpareLi2                As LARGE_INTEGER
    SpareLi3                As LARGE_INTEGER
    CreateTime              As LARGE_INTEGER
    UserTime                As LARGE_INTEGER
    KernelTime              As LARGE_INTEGER
    ImageName               As UNICODE_STRING
    BasePriority            As Long
    ProcessId               As Long
    InheritedFromProcessId  As Long
    HandleCount             As Long
    SessionId               As Long
    pPageDirectoryBase      As Long '_PTR
    VirtualMemoryCounters   As VM_COUNTERS
    PrivatePageCount        As Long
    IoCounters              As IO_COUNTERS
    Threads()               As SYSTEM_THREAD
End Type
 
Const SystemProcessInformation      As Long = &H5&
Const STATUS_INFO_LENGTH_MISMATCH   As Long = &HC0000004
Const STATUS_SUCCESS                As Long = 0&
Const ERROR_PARTIAL_COPY            As Long = 299&
 
Dim sWinDir             As String
Dim bIsWinVistaOrLater  As Boolean
 
 
Private Sub Form_Load()
    Const SPI_SIZE      As Long = &HB8&
    Const THREAD_SIZE   As Long = &H40&
    
    Dim i           As Long
    Dim ret         As Long
    Dim buf()       As Byte
    Dim Offset      As Long
    Dim Process     As SYSTEM_PROCESS_INFORMATION
    Dim ProcName    As String
    Dim ProcPath    As String
    
    Dim inf(68) As Long
    inf(0) = 276: GetVersionEx inf(0): bIsWinVistaOrLater = (inf(1) >= 6)
    sWinDir = GetWinDir()
    
    SetCurrentProcessPrivileges "SeDebugPrivilege"
    
    If NtQuerySystemInformation(SystemProcessInformation, ByVal 0&, 0&, ret) = STATUS_INFO_LENGTH_MISMATCH Then
    
        ReDim buf(ret - 1)
        
        If NtQuerySystemInformation(SystemProcessInformation, buf(0), ret, ret) = STATUS_SUCCESS Then
        
            With Process
            
                Do
                    memcpy Process, buf(Offset), SPI_SIZE
                    
                    ReDim .Threads(0 To .NumberOfThreads - 1)
                    
                    For i = 0 To .NumberOfThreads - 1
                        memcpy .Threads(i), buf(Offset + SPI_SIZE + i * THREAD_SIZE), THREAD_SIZE
                    Next
                    
                    If .ProcessId = 0 Then
                        ProcName = "System Idle Process"
                    Else
                        ProcName = Space$(.ImageName.Length \ 2)
                        memcpy ByVal StrPtr(ProcName), ByVal .ImageName.lpBuffer, .ImageName.Length
                        ProcPath = GetFilePathByPID(.ProcessId)
                    End If
                    
                    Debug.Print Right$("00000" & .ProcessId, 6) & " - " & ProcName & " - " & ProcPath
                    
                    Offset = Offset + .NextEntryOffset
                    
                Loop While .NextEntryOffset
                
            End With
            
        End If
        
    End If
    
    End
    
End Sub
 
Function GetFilePathByPID(PID As Long) As String
    Const MAX_PATH_W                        As Long = 32767&
    Const PROCESS_VM_READ                   As Long = 16&
    Const PROCESS_QUERY_INFORMATION         As Long = 1024&
    Const PROCESS_QUERY_LIMITED_INFORMATION As Long = &H1000&
    
    Dim ProcPath    As String
    Dim hProc       As Long
    Dim cnt         As Long
    Dim pos         As Long
    Dim FullPath    As String
    Dim SizeOfPath  As Long
    Dim lpFilePart  As Long
 
    hProc = OpenProcess(IIf(bIsWinVistaOrLater, PROCESS_QUERY_LIMITED_INFORMATION, PROCESS_QUERY_INFORMATION) Or PROCESS_VM_READ, 0, PID)
    If hProc <> 0 Then
    
        If bIsWinVistaOrLater Then
            cnt = MAX_PATH_W + 1
            ProcPath = Space$(cnt)
            Call QueryFullProcessImageName(hProc, 0&, StrPtr(ProcPath), VarPtr(cnt))
        End If
        
        If 0 <> Err.LastDllError Or Not bIsWinVistaOrLater Then     'Win 2008 Server (x64) can cause Error 128 if path contains space characters
        
            ProcPath = Space$(MAX_PATH)
            cnt = GetModuleFileNameEx(hProc, 0&, StrPtr(ProcPath), Len(ProcPath))
        
            If cnt = MAX_PATH Then 'Path > MAX_PATH -> realloc
                ProcPath = Space$(MAX_PATH_W)
                cnt = GetModuleFileNameEx(hProc, 0&, StrPtr(ProcPath), Len(ProcPath))
            End If
        End If
        
        If cnt <> 0 Then                          'clear path
            ProcPath = Left$(ProcPath, cnt)
            If StrComp("\SystemRoot\", Left$(ProcPath, 12), 1) = 0 Then ProcPath = sWinDir & Mid$(ProcPath, 12)
            If "\??\" = Left$(ProcPath, 4) Then ProcPath = Mid$(ProcPath, 5)
        End If
        
        If ERROR_PARTIAL_COPY = Err.LastDllError Then       'because GetModuleFileNameEx cannot access to that information for 64-bit processes on WOW64
            ProcPath = Space$(MAX_PATH)
            cnt = GetProcessImageFileName(hProc, StrPtr(ProcPath), Len(ProcPath))
            
            If cnt <> 0 Then
                ProcPath = Left$(ProcPath, cnt)
                
                ' Convert DosDevice format to Disk drive format
                If StrComp(Left$(ProcPath, 8), "\Device\", 1) = 0 Then
                    pos = InStr(9, ProcPath, "\")
                    If pos <> 0 Then
                        FullPath = ConvertDosDeviceToDriveName(Left$(ProcPath, pos - 1))
                        If Len(FullPath) <> 0 Then
                            ProcPath = FullPath & Mid$(ProcPath, pos + 1)
                        End If
                    End If
                End If
                
            End If
            
        End If
        
        If cnt <> 0 Then    'if process ran with 8.3 style, GetModuleFileNameEx will return 8.3 style on x64 and full pathname on x86
                            'so wee need to expand it ourself
        
            FullPath = Space$(MAX_PATH)
            SizeOfPath = GetFullPathName(StrPtr(ProcPath), MAX_PATH, StrPtr(FullPath), lpFilePart)
            If SizeOfPath <> 0& Then
                GetFilePathByPID = Left$(FullPath, SizeOfPath)
            Else
                GetFilePathByPID = ProcPath
            End If
            
        End If
        
        CloseHandle hProc
    End If
End Function
 
Function GetWinDir() As String
    Dim ret&, sWinDir$
    sWinDir = Space$(MAX_PATH)
    ret = GetWindowsDirectory(StrPtr(sWinDir), MAX_PATH)
    If ret Then
        sWinDir = Left$(sWinDir, ret)
    Else
        ret = ExpandEnvironmentStrings(StrPtr("%SystemRoot%"), StrPtr(sWinDir), MAX_PATH + 1)
        If ret Then sWinDir = Left$(sWinDir, ret - 1)
    End If
    GetWinDir = sWinDir
End Function
 
Public Function SetCurrentProcessPrivileges(PrivilegeName As String) As Boolean
    Const TOKEN_ADJUST_PRIVILEGES   As Long = &H20
    Const SE_PRIVILEGE_ENABLED      As Long = &H2
    Dim tp As TOKEN_PRIVILEGES, hToken&
    If LookupPrivilegeValue(0&, StrPtr(PrivilegeName), tp.LuidLowPart) Then   'i.e. "SeDebugPrivilege"
        If OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken) Then
            tp.PrivilegeCount = 1
            tp.Attributes = SE_PRIVILEGE_ENABLED
            SetCurrentProcessPrivileges = AdjustTokenPrivileges(hToken, 0&, tp, Len(tp), 0&, 0&)
            CloseHandle hToken
        End If
    End If
End Function
 
Public Function ConvertDosDeviceToDriveName(inDosDeviceName As String) As String
    On Error Resume Next
 
    Static DosDevices   As New Collection
    
    If DosDevices.Count Then
        ConvertDosDeviceToDriveName = DosDevices(inDosDeviceName)
        Exit Function
    End If
    
    Dim aDrive()        As String
    Dim sDrives         As String
    Dim cnt             As Long
    Dim i               As Long
    Dim DosDeviceName   As String
    
    cnt = GetLogicalDriveStrings(0&, StrPtr(sDrives))
    
    sDrives = Space(cnt)
    
    cnt = GetLogicalDriveStrings(Len(sDrives), StrPtr(sDrives))
 
    If 0 = Err.LastDllError Then
    
        aDrive = Split(Left$(sDrives, cnt - 1), vbNullChar)
    
        For i = 0 To UBound(aDrive)
            
            DosDeviceName = Space(MAX_PATH)
            
            cnt = QueryDosDevice(StrPtr(Left$(aDrive(i), 2)), StrPtr(DosDeviceName), Len(DosDeviceName))
            
            If cnt <> 0 Then
            
                DosDeviceName = Left$(DosDeviceName, InStr(DosDeviceName, vbNullChar) - 1)
 
                DosDevices.Add aDrive(i), DosDeviceName
 
            End If
            
        Next
    
    End If
    
    ConvertDosDeviceToDriveName = DosDevices(inDosDeviceName)
    
End Function
Вложения
Тип файла: zip ProcessInfo.zip (4.6 Кб, 161 просмотров)
Тип файла: zip Process Manipulator by Object Table.zip (5.9 Кб, 139 просмотров)
4
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
30.06.2015, 23:58  [ТС]
Класс получения информации об ОС:

Внимание! Обновлённая версия здесь.

Название ОС: Windows 7
Версия Service Pack: 1
Битность: x64
Редакция: Ultimate
Семейство: Vista
ОС - Vista и новее? Истина
Major: 6
Minor: 1
Major + Minor: 6,1
Сборка: 7601
Язык, отображаемый в диалогах: 1049 RU Russian
Язык установки ОС: 1049 RU Russian
Язык для программ, не поддерживающих юникод: 1049 RU Russian
Уровень целостности процесса: Medium
Повышенные привилегии? Ложь
Тип пользователя: Administrator
ОС загружена в безопасном режиме? Ложь
* Приложения, в которые не включен манифест поддержки Windows 8.1/10, будут возвращать версию - Windows 8 (значение - 6.2).

Operating System Version
Targeting your application for Windows
Вложения
Тип файла: zip clsOSInfo by Dragokas.zip (9.0 Кб, 146 просмотров)
4
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 14
01.07.2015, 08:47
Dragokas, у меня была проблема админских прав (в инсталляторе для доступа к реестру). Я решил ее так:

- пытаюсь создать ключ в реестре
- удалось - идем дальше
- нет - сообщение о недостатке прав.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
01.07.2015, 15:25  [ТС]
Catstail, инсталлятор самодельный?

Тогда, я думаю, если требуется запись в куст HKLM, более кратким решением будет просто добавить манифест с правами requireAdministrator.

Система перед запуском инсталлятора сама сообщит о недостатке прав.

Для добавления манифеста к программе на VB6 можно воспользоваться 2 способами:

1) Добавить файл манифеста в ресурсы приложения в самом проекте.
Для этого нажать "Tools" -> Resource Editor, предпоследняя иконка "Add custom resource", выбрать файл манифеста.
Двойной клик по ресурсу в появившемся дереве.
Указать: тип: #24, ID: 1. Язык - не важно.



2) пропатчить готовый EXE-файл. Сделать это весьма просто с помощью программы Manifest By The Trick.

1-й способ имеет преимущества в плане - не нужно постоянно пропатчивать свой проект при выпуске новой версии программы.
2-й способ имеет +, если нужно добавить/заменить манифест в чужом приложении.

Детальнее о манифестах и программе Manifest By The Trick:

Кликните здесь для просмотра всего текста

Я выпустил форк v.1.3.
Возможно, The Trick, захочет обновить и у себя в блоге.

Список изменений

Список изменений:

' ver. 1.3 fork:
' Добавлена замена файла манифеста вне зависимости от языка уже присутствующего ресурса
' Автоматически исправляется название кодировки в заголовке текста манифеста
' Автоматически добавляется заголовок в манифест, если он отсутствовал
' Производится выравнивание манифеста по 4-байтовой границе
' Если файл содержал атрибут "Только для чтения", он будет снят
' Добавлена иконка

' ver. 1.2 fork:
' Файл манифеста перекодируется в UTF-8 (Спасибо The Trick)
' Добавлено меню "Open manifest file"
' Добавлены образцы файлов манифеста

' ver. 1.1 fork:
' 1. Добавлено чтение манифеста по-умолчанию из файла "manifest.txt"
' 2. Добавлено меню "Save to default manifest"
' 3. Добавлен тихий режим (ключ командной строки -silent).
' 4. Добавлена возможность работы через командную строку.
' 5. Удалено создание резервных копий файла, который патчится.


Как пользоваться:

1) Подготовьте файл манифеста (в архиве уже есть несколько готовых).
2) Запустите Manifested.exe. Нажмите File -> Path... Выберите нужный EXE-файл, нажмите ОК. Все готово.

По умолчанию, программа открывает файл манифеста, который лежит рядом с ней под именем manifest.txt
Файл должен быть в кодировке ANSI !!!
(программа сама сделает нужное конвертирование)

Также поддерживается запуск из командной строки:
Code
1
Manifested.exe [файл для патча] [внедряемый файл манифеста] [-silent]
-silent - опционально (не выводить сообщения, закрыть программу по готовности).


Зачастую манифесты используются:

1) для изменения привилегий, с которыми запускается приложение (например, отображение диалогового окна UAC, для запуска программы сразу с повышенными привилегиями.)

2) для добавления совместимости приложения с операционными системами поколения Windows Vista и выше (ID каждой ОС должен быть отдельно прописан в файле манифеста). См. пример в этой теме.
Точнее говоря, программа сообщает системе, что она с ней совместима. Остальное - на совести ее автора.
Также без этого, функция GetVersionEx будет неправильно возвращать версию ОС на системах от Windows 8.1 и новее.

3) Активации новых стилей визуального оформления кнопок/диалогов/и пр... (программа может не запустится в Windows XP ! - потребуется инициализация через InitCommonControlsEx)

Этот набор функций будет зависеть от того, как Вы составите текст файла манифеста.

Более подробно, что такое и зачем нужен манифест.

Немного о составлении манифеста.

1. <requestedExecutionLevel>

Уровень прав, который затребуется при старте приложения, делится на 3 вида:
- asInvoker - запуск с текущими правами
- HighestAvailable - запросит повышенные привилегии,
но если пользователь ими не обладает, то запустится в ограниченной среде
- RequireAdministrator - всегда затребует повышенные привилегии. Если получить их не удалось, программа не запустится.

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


Пример файла манифеста:
Code
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
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 
    <assemblyIdentity
        version="1.0.0.0"
        processorArchitecture="*"
        name="Alex.Dragokas"
        type="win32">
    </assemblyIdentity>
 
    <description>Alex Dragokas</description>
 
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="X86"
                publicKeyToken="6595b64144ccf1df"
                language="*"
             />
        </dependentAssembly>
    </dependency>
 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel
                    level="requireAdministrator"
                    uiAccess="false">
                </requestedExecutionLevel>
            </requestedPrivileges>
        </security>
    </trustInfo>
 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
            <!-- Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
            <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
            <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- Windows 10 -->
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
        </application>
    </compatibility>
 
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
        </windowsSettings>
    </application>
 
</assembly>
Вложения
Тип файла: zip ManifestByTheTrick_fork.zip (74.9 Кб, 153 просмотров)
3
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
02.07.2015, 23:52  [ТС]
Класс для работы с реестром Windows

Описание функционала:

Кликните здесь для просмотра всего текста

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
' Создает раздел
Public Function RegCreateKey(lHive As REG_HIVES, ByVal sKey$, Optional bUseWow64 As WOW_64_TYPE) As Boolean
' Читает значение параметра любого из этих типов: REG_SZ, REG_MULTI_SZ, REG_EXPAND_SZ, REG_DWORD, REG_DWORDLittleEndian, REG_DWORDBigEndian, REG_BINARY
Public Function GetRegData(hHive As REG_HIVES, ByVal KeyName As String, ByVal ValueName As String, Optional bUseWow64 As WOW_64_TYPE) As Variant
' Записывает значение параметра типа REG_SZ
Public Function RegSetStringVal(lHive As REG_HIVES, ByVal sKey$, sValue$, sData$, Optional bUseWow64 As WOW_64_TYPE) As Boolean
' Записывает значение параметра типа REG_EXPAND_SZ
Public Function RegSetExpandStringVal(lHive As REG_HIVES, ByVal sKey$, sValue$, sData$, Optional bUseWow64 As WOW_64_TYPE) As Boolean
' Записывает значение параметра типа REG_DWORD
Public Function RegSetDwordVal(lHive As REG_HIVES, ByVal sKey$, sValue$, lData&, Optional bUseWow64 As WOW_64_TYPE) As Boolean
' Удаляет параметр
Public Function RegDelVal(lHive As REG_HIVES, ByVal sKey$, sValue$, Optional bUseWow64 As WOW_64_TYPE) As Boolean
' Удаляет раздел (рекурсивно с подразделами)
Public Function RegDelKey(lHive As REG_HIVES, ByVal sKey$, Optional bUseWow64 As WOW_64_TYPE) As Boolean
' Проверяет, существует ли раздел
Public Function RegKeyExists(lHive As REG_HIVES, ByVal sKey$, Optional bUseWow64 As WOW_64_TYPE) As Boolean
' Проверяет, существует ли параметр
Public Function RegValueExists(lHive As REG_HIVES, ByVal sKey$, sValue$, Optional bUseWow64 As WOW_64_TYPE) As Boolean
' Проверяет, существует ли в разделе другие подразделы
Public Function RegKeyHasSubKeys(lHive As REG_HIVES, ByVal sKey$, Optional bUseWow64 As WOW_64_TYPE) As Boolean
' Проверяет, существуют ли в разделе параметры
Public Function RegKeyHasValues(lHive As REG_HIVES, ByVal sKey$, Optional bUseWow64 As WOW_64_TYPE) As Boolean
' Читает имя первого попавшегося подраздела в указанном разделе
Public Function RegGetFirstSubKey(lHive As REG_HIVES, ByVal sKey$, Optional bUseWow64 As WOW_64_TYPE) As String
' Возвращает все имена подразделов в указанном разделе. Результат - 1 строка (разделитель - знак "|".
Public Function RegEnumSubkeys(lHive As REG_HIVES, ByVal sKey$, Optional bUseWow64 As WOW_64_TYPE) As String
' Возвращает все имена параметров в указанном разделе. Результат - 1 строка (разделитель - знак "|".
Public Function GetEnumValues(lHive As REG_HIVES, ByVal KeyName$, Optional bUseWow64 As WOW_64_TYPE) As String
' Получить время модификации раздела
Public Function GetRegKeyTime(lHive As REG_HIVES, ByVal KeyName$, Optional bUseWow64 As WOW_64_TYPE) As Date
' Экспортировать раздел в бинарный файл ( для этого потребуются повышенные привилегии ! )
Public Function KeyExportToBinary(lHive As REG_HIVES, ByVal KeyName$, destFile As String, Optional bUseWow64 As WOW_64_TYPE) As Boolean     'Save key to binary .hiv file
' Узнать тип параметра
Public Function ValueType(lHive As REG_HIVES, ByVal KeyName$, ByVal ValueName As String, Optional bUseWow64 As WOW_64_TYPE) As REG_TYPE
' Находит подраздел реестра по началу имени, указанному в аргументе "Mask"
Public Function FindSubKey(lHive As REG_HIVES, ByVal KeyName As String, Mask As String, Optional bUseWow64 As WOW_64_TYPE) As String


Все функции юникодные.
Поскольку класс писался для обратной совместимости с проектом HiJackThis, аргументы всех функций приведены в единый стандарт и поддерживают гибридный способ указания улья:
1) 1-й аргумент - хендл (константа) улья, либо:
2) 1-й аргумент - число 0, а 2-й на выбор:
- полное имя улья в виде строки
- сокращенное имя улья в виде строки

Последний аргумент всех функций опционален - управляет реестровым редиректором:
- true - включить редиректор.
- false - не включать (по-умолчанию, редиректор отключен).

Небольшое демо использования части функций:
Кликните здесь для просмотра всего текста


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
Option Explicit
 
Dim Reg As clsRegistry
 
Private Sub Form_Load()
    Dim Key
    Set Reg = New clsRegistry
      
    ' Поиск первого попавшегося имени раздела по части имени
    Debug.Print Reg.FindSubKey(HKEY_LOCAL_MACHINE, "Software", Mask:="Mi")
    
    ' Создание раздела в обычном и альтернативном представлениях реестра
    Reg.RegCreateKey 0, "HKLM\Software\1_Test", WOW_64_OFF
    Reg.RegCreateKey 0, "HKLM\Software\1_Test", WOW_64_ON
    
    ' Создание структуры веток
    If Reg.RegCreateKey(0, "HKLM\Software\1_Test\1\2\3\4\5") Then Debug.Print "Успешно создан 1_Test\1\2\3\4\5"
    If Not Reg.RegCreateKey(0, "HKLM\SYSTEM\CurrentControlSet\Enum\Test") Then Debug.Print "Ошибка создания защищенного LS - Enum\Test."
    
    ' Запись значения параметра типа REG_SZ
    Reg.RegSetStringVal 0, "HKLM\Software\1_Test", "Bit", "x64", WOW_64_OFF
    Reg.RegSetStringVal 0, "HKLM\Software\1_Test", "Bit", "x32", WOW_64_ON
    
    ' Чтение значения параметра
    Debug.Print Reg.GetRegData(0, "HKLM\Software\1_Test", "Bit", WOW_64_OFF)
    Debug.Print Reg.GetRegData(0, "HKLM\Software\1_Test", "Bit", WOW_64_ON)
    
    ' Удаление раздела с контролем успешности операции
    If Reg.RegDelKey(0, "HKLM\Software\1_Test", WOW_64_OFF) Then Debug.Print "Успешное удаление x64"
    If Reg.RegDelKey(0, "HKLM\Software\1_Test", WOW_64_ON) Then Debug.Print "Успешное удаление x32"
    
    ' Перечисление имен параметров указанного раздела + их значения
    For Each Key In Split(Reg.GetEnumValues(0, "HKEY_CURRENT_USER\Environment"), "|")
        Debug.Print CStr(Key); " = "; Reg.GetRegData(0, "HKEY_CURRENT_USER\Environment", CStr(Key))
    Next
    
    ' Экспорт в бинарный файл
    Reg.KeyExportToBinary 0, "HKCU\Environment", "c:\temp\env.hiv"
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    Set Reg = Nothing
End Sub
(запущено с повышенными привилегиями)

Microsoft
Успешно создан 1_Test\1\2\3\4\5
Ошибка создания защищенного LS - Enum\Test.
x64
x32
Успешное удаление x64
Успешное удаление x32
TEMP = C:\Users\Alex\AppData\Local\Temp
TMP = C:\Users\Alex\AppData\Local\Temp


Устарело. Обновления забирать отсюда (не Stand-alone).
Вложения
Тип файла: zip RegistryFunctions By Dragokas.zip (25.7 Кб, 149 просмотров)
3
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
10.07.2015, 13:29  [ТС]
Класс StringBuilder - ускорение операций конкатенации строк

Автор: VolteFace
fork ver v1.2 by Dragokas

Этот класс позволит значительно увеличить скорость, если Вам нужно множество раз объединять
кусок текста к одной и той же переменной.

Всего в нем присутствуют такие методы:

Append(ByRef str As String) - Дополнить строку
Clear() - Очистить строку
ToString() As String - Получить текущую строку
StringData(ByRef value As String) - заменить строку на указанную
Insert(ByVal index As Long, ByRef str As String) - вставить фразу в указанную позицию строки (при вставке текст не заменяется)
Overwrite(ByVal index As Long, ByRef str As String) - вставить фразу поверх указанной позиции (текст будет заменен наложенным).
Remove(ByVal index As Long, ByVal Length As Long) - удалить указанный участок строки
Length() - вернуть длину текущей строки

Класс я немного модифицировал, переименовав пару методов и заменив во всех методах
способ передачи аргумента по ссылке (в оригинале было - по значению). Так будет еще быстрее.

Когда строка более не нужна, освободите память, занятую переменной, уничтожив экземпляр класса.
Пример:

Visual Basic
1
2
3
4
5
6
7
8
9
    Dim sLog As New cStringBuilder
    
    sLog.Append "Множество "
    sLog.Append "различных "
    sLog.Append "строк"
    Debug.Print "Результат: "; sLog.ToString
    Debug.Print "Длина строки: "; sLog.Length
    
    Set sLog = Nothing
В сети также есть подобный класс от Steve McMahon. Там присутствует аналогичный баг.
Также обратите внимание, что при инициализации класс сразу выделяет под переменную 1 МБ памяти. Не используйте необдуманно, или ограничьте внутри класса константу CHUNK_SIZE.

Скачать последнюю версию класса можно отсюда.
4
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.07.2015, 14:55
Direct3D9 библиотека типов для VB6.

Всем привет.
Уже довольно давно занимаюсь созданием библиотеки типов Direct3D9 и вспомогательных функций D3DX для VB6.
Итак в архиве содержится библиотека типов "DirectX 9 for Visual Basic 6.0 type library by The trick" (dx9vb.tlb) содержащая описание следующих интерфейсов:
  • IDirect3D9;
  • IDirect3DDevice9;
  • IDirect3DSurface9;
  • IDirect3DResource9;
  • IDirect3DSwapChain9;
  • IDirect3DTexture9;
  • IDirect3DBaseTexture9;
  • IDirect3DVolumeTexture9;
  • IDirect3DVolume9;
  • IDirect3DCubeTexture9;
  • IDirect3DVertexBuffer9;
  • IDirect3DIndexBuffer9;
  • IDirect3DStateBlock9;
  • IDirect3DVertexDeclaration9;
  • IDirect3DVertexShader9;
  • IDirect3DPixelShader9;
  • IDirect3DQuery9;
Также в этой библиотеке задеклалриованы множество типов, констант и энумов. Работа этой библиотеки слабо тестировалась, поэтому что-то может не работать.
Также в архиве содержится несколько модулей написанных на VB6:
  • D3DX_COLOR.bas - для работы с цветами
  • D3DX_MATRICES.bas - для работы с матрицами
  • D3DX_QUATERNION.bas - для работы с кватернионами
  • D3DX_VECTOR2.bas, D3DX_VECTOR3.bas, D3DX_VECTOR4.bas - для работы с векторами
  • D3DX_MISC.bas - различные функции которые не вошли не в одну из категорий
Эти модули содержат аналоги соответствующих функций D3DX.
Также в архиве содержится несколько тестовых примеров работы.

Скачать.
3
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.07.2015, 14:56
DirectSound библиотека типов для VB6.

Параллельно с Direct3D9 я делал библиотеку типов и модуль с вспомогательными функциями для DirectSound. В архиве библиотека типов dsvb.tlb и модуль DS_Functions.bas. В дальнейшем добавлю модуль класса для поддержки асинхронных уведомлений, пока можно пользоваться этим.
В модуле DS_Functions содержатся следующие функции:
  • DSCreateSoundBufferFromFile - создает объект с интерфейсом IDirectSoundBuffer8 из файла. Поддерживаются только WAVE и MP3 файлы. MP3 файлы могут содержать только ID3v1 и ID3v2 теги, какие-либо другие возможно не распознаются/не будут работать. Слишком длинные (по времени) файлы не поддерживаются. Для потокового воспроизведения нужно писать потоковое декодирование на основе кода функции DSCreateSoundBufferFromMemory.
  • DSCreateSoundBufferFromMemory - тоже самое, но вместо файла передается указатель на данные файла в памяти и их размер.
Также в архиве содержится пример плеера который реализует некоторые методы IDirectSoundBuffer8 интерфейса (громкость, панорама, частота, эффекты).
TLB также особо сильно не тестировалась, поэтому что-то может не работать. Если что-то не работает пишите сюда.
Скачать.
2
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
05.09.2015, 16:21  [ТС]
Преобразование даты из Unix-стиля в локальное время в формате Date

На примере получения времени установки ОС.

UNIX-время (англ. Unix time) или POSIX-время — система описания моментов во времени, принятая в UNIX и других POSIX-совместимых операционных системах. Определяется как количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг); время с этого момента называют «эрой UNIX» (англ. Unix Epoch).
Шпаргалка: http://blogs.msdn.com/b/joshpo... sions.aspx

Лайт-версия функции

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option Explicit
 
Private Declare Function SystemTimeToVariantTime Lib "oleaut32.dll" (ByVal lpSystemTime As Any, vtime As Date) As Long
Private Declare Function VariantTimeToSystemTime Lib "oleaut32.dll" (ByVal vtime As Date, ByVal lpSystemTime As Any) As Long
Private Declare Function SystemTimeToTzSpecificLocalTime Lib "kernel32.dll" (ByVal lpTimeZone As Any, ByVal lpUniversalTime As Any, ByVal lpLocalTime As Any) As Long
 
Private Sub Form_Load()
    Debug.Print ConvertUnixTimeToLocalDate(1380558746)
End Sub
 
Public Function ConvertUnixTimeToLocalDate(Seconds As Long) As Date
    Dim stime(15) As Byte 'SYSTEMTIME
    Dim DateTime  As Date
    
    DateTime = DateAdd("s", Seconds, #1/1/1970#)                           ' time_t -> Date
    VariantTimeToSystemTime DateTime, VarPtr(stime(0))                     ' Date -> SYSTEMTIME
    SystemTimeToTzSpecificLocalTime 0&, VarPtr(stime(0)), VarPtr(stime(0)) ' tz can be 0, if tz is current
    SystemTimeToVariantTime VarPtr(stime(0)), ConvertUnixTimeToLocalDate   ' SYSTEMTIME -> Date
End Function


Демо + альтернативный способ.

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
Option Explicit
 
Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
 
Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type
 
Private Declare Function FileTimeToSystemTime Lib "kernel32.dll" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Private Declare Function FileTimeToLocalFileTime Lib "kernel32.dll" (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long
Private Declare Function SystemTimeToFileTime Lib "kernel32.dll" (lpSystemTime As SYSTEMTIME, lpFileTime As FILETIME) As Long
Private Declare Function SystemTimeToVariantTime Lib "oleaut32.dll" (lpSystemTime As SYSTEMTIME, vtime As Date) As Long
Private Declare Function VariantTimeToSystemTime Lib "oleaut32.dll" (ByVal vtime As Date, lpSystemTime As SYSTEMTIME) As Long
Private Declare Function GetTimeZoneInformation Lib "kernel32.dll" (ByVal lpTimeZoneInformation As Long) As Long
Private Declare Function SystemTimeToTzSpecificLocalTime Lib "kernel32.dll" (ByVal lpTimeZone As Any, lpUniversalTime As SYSTEMTIME, lpLocalTime As SYSTEMTIME) As Long
 
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 RegQueryValueExLong Lib "advapi32.dll" Alias "RegQueryValueExW" (ByVal hKey As Long, ByVal lpValueName As Long, ByVal lpReserved As Long, lpType As Long, szData As Long, lpcbData As Long) As Long
 
Public Function ConvertUnixTimeToLocalDate(Seconds As Long) As Date
    On Error GoTo ErrorHandler
    Dim ftime               As FILETIME
    Dim stime               As SYSTEMTIME
    Dim DateTime            As Date
    Dim TimeZoneInfo(171)   As Byte
    
    DateTime = DateAdd("s", Seconds, #1/1/1970#)    ' time_t -> Date
    VariantTimeToSystemTime DateTime, stime         ' Date -> SYSTEMTIME
    
    'SystemTimeToFileTime stime, ftime               ' SYSTEMTIME -> FILETIME
    'FileTimeToLocalFileTime ftime, ftime            ' учитываем смещение согласно текущим региональным настройкам в системе
    'FileTimeToSystemTime ftime, stime               ' FILETIME -> SYSTEMTIME
    
    'alternate:
    'GetTimeZoneInformation VarPtr(TimeZoneInfo(0))
    'SystemTimeToTzSpecificLocalTime VarPtr(TimeZoneInfo(0)), stime, stime
    
    SystemTimeToTzSpecificLocalTime 0&, stime, stime    'tz can be 0, if tz is current
    
    SystemTimeToVariantTime stime, DateTime         ' SYSTEMTIME -> Date
    ConvertUnixTimeToLocalDate = DateTime
ErrorHandler:
End Function
 
Private Sub Form_Load()
    On Error GoTo ErrorHandler
 
    Const HKEY_LOCAL_MACHINE    As Long = &H80000002
    Const KEY_QUERY_VALUE       As Long = &H1&
    Const KEY_WOW64_64KEY       As Long = &H100&
 
    Dim hKey    As Long
    Dim ordType As Long
    Dim cData   As Long
    Dim lData   As Long
 
    RegOpenKeyEx HKEY_LOCAL_MACHINE, StrPtr("SOFTWARE\Microsoft\Windows NT\CurrentVersion"), 0&, KEY_QUERY_VALUE Or KEY_WOW64_64KEY, hKey
    
    If hKey <> 0 Then
        If (0 = RegQueryValueExLong(hKey, StrPtr("InstallDate"), 0&, 0&, lData, LenB(lData))) Then
            Debug.Print "Install Date is: " & ConvertUnixTimeToLocalDate(lData)
        End If
        RegCloseKey hKey
    End If
    
    Exit Sub
ErrorHandler:
    If hKey <> 0 Then RegCloseKey hKey
End Sub
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
08.11.2015, 18:47  [ТС]
Проверка легитимности электронной цифровой подписи Authenticode у PE EXE/
проверка наличия WHQL подписи у драйвера


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

В сети гуляет множество примеров с дичайшими ошибками. Мною был взят за основу пример на C++ от AD13, автора Rootkit Releaver, затем существенно дополнен и исправлен.

Здесь нет кода для извлечения имени подписанта сертификата и timestamp, но я планирую это сделать в вер. № 2.

Вызывать нужно эту функцию:
Visual Basic
1
Public Function SignVerify(FilePath As String, Flags As FLAGS_SignVerify, SignResult As SignResult_TYPE) As Boolean
Ей передаете полное имя файла, флаги, и структуру, куда будет записан результат проверки ЭЦП.
Простейший пример использования с выводом результата в отладочную консоль:

Visual Basic
1
2
3
4
5
6
7
8
9
Dim SignResult As SignResult_TYPE
SignVerify "c:\windows\system32\calc.exe", 0&, SignResult
with SignResult
    debug.? "подписан?" & .isSigned
    debug.? "ЭЦП легитимна?" & .isLegit
    debug.? "краткое описание результата проверки" & .ShortMessage
    debug.? "полное описание результата проверки" & .FullMessage
    debug.? "код возврата WinVerifyTrust" & .ReturnCode
end with
Небольшой ликбез


Флаги (параметр 2) можно комбинировать через OR:
Visual Basic
1
2
3
4
    ' SV_CheckHoleChain = 1       ' - проверять всю цепочку доверия ( потребуется подключение к сети )
    ' SV_DoNotUseHashChecking = 2 ' - не использовать проверку по хешу
    ' SV_DisableCatalogVerify = 4 ' - не использовать проверку по каталогу безопасности
    ' SV_isDriver = 8             ' - выполнить проверку драйвера на соответствие стандарту WHQL
SV_CheckHoleChain - этот флаг позволит проверять, не был ли отозван сертификат. Может занять весьма длительное время вплоть до ~ 15 секунд. Это полезно для тщательной проверки, на случай подозрений, что сертификат был украден.
SV_DoNotUseHashChecking - по умолчанию происходит проверка по хешу. Если ОС уже проверяла эту подпись, то на второй раз проверка будет проводиться чуть быстрее. Этот флаг отключает такое кеширование.
SV_DisableCatalogVerify - если проверяете только внутреннюю (embedded) подпись, то проверку по каталогу можно отключить.
SV_isDriver - указывайте его, если проверяете драйвер на предмет подписи WHQL.

======================================== ===============

Дополнительные плюшки:

1)
В код проверки заложено доп. кеширование, основанное на Scripting.Dictionary или можно подключить класс хеш-таблиц от Кривоуса Анатолия (на Ваш выбор).
Это означает, что если Вы уже проверяли этой функцией какой-то путь, то функция просто вернет результат прошлой проверки, не вызывая больше никаких API.

2)
Также в отличие от утилит Руссиновича и пр., здесь реализован обход одной из узвимостей, приводящей к фризу всего механизма проверки ЭЦП по каталогу. Если это обнаружено, дальнейшая проверка будет осуществлена только по внутренней (embedded) подписи.

3) Результат проверки определяется по коду возврата функции WinVerifyTrust. По нему же определяется расширенное описание ошибки, наиболее популярные из которых я постарался внести в свою функцию. Способа получить текстовое описание автоматически нет. Заостряю внимание, что это не исчерпывающий список.

======================================== ===============

На счет двух демок.

1) Запускается батником VerifyByList.cmd
Он формирует список путей всех *.exe и *.sys файлов в каталоге %SystemDrive%\*
Затем вызывает для каждого из них функцию проверки ЭЦП.
Результат проверки будет поделен на несколько файлов:
- report_sign_signed.txt
- report_sign_not_signed.txt
- report_sign_bad.txt
- report_sign_error.txt

2) Вторая демка запускается из IDE (form_load), вывод в консоль отладки.
Прежде чем ее запускать, зайдите в папку bin и распакуйте в нее *.exe файлы. (пароль: virus).
Будь осторожны: не запускайте эти exe-файлы. Я не гарантирую их безопасность. Они только для демки (там разные вариации ЭЦП).

Вложения
Тип файла: rar SignVerify.rar (448.1 Кб, 116 просмотров)
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 14
08.11.2015, 21:29
Делюсь кодом. RLE-сжатие двоичных файлов:

Кликните здесь для просмотра всего текста
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
Private Const MAX_SIZE = 60000  '::: максимальный размер буфера
Private Const EXT = 1000        '::: начальный размер и приращение
 
Private Buff() As Byte      '::: буфер
Private ptr    As Long      '::: номер свободного байта
Private Size   As Long      '::: размер буфера
Private finp   As Integer   '::: номер входного файла
Private fout   As Integer   '::: номер выходного файла
 
'::: Поместить с копий байта b в буфер
 
Sub PutInBuff(b As Byte, c As Long)
 
    For i& = 1 To c
    
        '::: Если очередной байт еще умещается в буфере...
    
        If ptr < Size Then
        
           Buff(ptr) = b
           ptr = ptr + 1
           
        Else
        
           '::: Очередной байт уже не умещается
        
           If Size + EXT < MAX_SIZE Then
           
              '::: Если буфер еще можно расширить - расширим
           
              Size = Size + EXT
              
              ReDim Preserve Buff(1 To Size) As Byte
              
              Buff(ptr) = b
              ptr = ptr + 1
              
           Else
           
              Put #fout, , Chr$(255) '::: сигнатура "блок не сжат"
              Put #fout, , Size&     '::: размер буфера
              For j& = 1 To Size&
                  Put #fout, , Buff(i&)
              Next j&
                
              '::: Выделяем память для нового буфера
                
              Size = EXT
                
              ReDim Buff(1 To Size) As Byte
              
              ptr = 1
              
              Buff(ptr) = b
              ptr = ptr + 1
           
           End If
                      
        End If
 
    Next i&
 
End Sub
 
'::: Опустошить буфер
 
Sub FlushBuff()
 
    If ptr > 1 Then '::: если в буфере что-то накоплено...
             
       Put #fout, , Chr$(255) '::: сигнатура "блок не сжат"
       Put #fout, , (ptr - 1) '::: размер буфера
       
       For i& = 1 To (ptr - 1)
           Put #fout, , Buff(i&)
       Next i&
                                 
       ptr = 1
                          
    End If
 
End Sub
 
Sub Action(Count As Long, prev As Byte)
 
    '::: Сейчас Count& содержит количество одинаковых байтов
 
    If Count > 6 Then '::: сжимать имеет смысл
          
       '::: сначала - сброс несжатого блока
          
       FlushBuff
             
       '::: а теперь - сжатые данные
                    
       Put #fout, , Chr$(0)  '::: сигнатура "блок сжат"
       Put #fout, , Count    '::: счетчик
       Put #fout, , prev     '::: символ
             
    Else               '::: сжимать смысла нет
          
       PutInBuff prev, Count  '::: сбросим накопленные в буфер
          
    End If
 
End Sub
 
'::: Упаковка
 
Sub PackRLE()
 
Dim curr   As Byte
Dim prev   As Byte
 
    Size = EXT
 
    ReDim Buff(1 To Size) As Byte
    
    Count& = 1         '::: Счетчик
    
    Get #finp, , prev  '::: читаем первый байт
    
    ptr& = 1
    
    LI& = LOF(finp)    '::: длина исходного файла
    
    Do
           
       If Loc(finp) = LI& Then Exit Do '::: Если вышли за пределы файла...
    
       Get #finp, , curr       '::: Читаем очередной байт
       
       If curr = prev Then     '::: Если прочитан такой же байт
       
          Count& = Count& + 1  '::: копим количество
          
       Else                    '::: Обработаем предыдущий байт
          
          Action Count&, prev
             
          Count& = 1
             
       End If
    
       prev = curr             '::: Предыдущий = Текущему
    
    Loop
    
    '::: Финишные действия
    
    Action Count&, prev
    
    FlushBuff
 
    Close finp
    Close fout
 
End Sub
 
'::: Распаковка файла
 
Sub UnPackRLE()
 
Dim b As Byte
 
    LI& = LOF(finp)  '::: Длина файла
    
    Do
           
       If Loc(finp) = LI& Then Exit Do  '::: Если вышли за файл - выход
    
       Get #finp, , b
       
       If b = 0 Then '::: Сжатый блок
       
          Get #finp, , Count&
          Get #finp, , b
          
          For i& = 1 To Count&
              Put #fout, , b
          Next i&
              
       Else          '::: Несжатый блок
       
          Get #finp, , Sz&
          ReDim Buff(1 To Sz&) As Byte
          Get #finp, , Buff
          Put #fout, , Buff
       
       End If
    
    Loop
 
    Close finp
    Close fout
 
End Sub
 
Sub Main()
 
    HomeDir$ = ThisWorkbook.Path
    
    finp = FreeFile
    
    Open HomeDir$ + "\finp.tst" For Binary Access Read As #finp
    
    fout = FreeFile
    
    Open HomeDir$ + "\fout.pac" For Output As #fout
    
    Close fout
    
    fout = FreeFile
    
    Open HomeDir$ + "\fout.pac" For Binary Access Write As #fout
    
    
    PackRLE
       
       
    finp = FreeFile
    
    Open HomeDir$ + "\fout.pac" For Binary Access Read As #finp
    
    fout = FreeFile
    
    Open HomeDir$ + "\finp.new" For Output As #fout
    
    Close fout
    
    fout = FreeFile
    
    Open HomeDir$ + "\finp.new" For Binary Access Write As #fout
    
    
    UnPackRLE
 
    MsgBox "OK!"
 
End Sub
 
'::: Построение тестового файла
 
Sub MakeTest()
 
    Randomize
    
    HomeDir$ = ThisWorkbook.Path
    
    fo% = FreeFile
    
    Open HomeDir$ + "\finp.tst" For Output As #fo%
    
    Close fo%
    
    fo% = FreeFile
    
    Open HomeDir$ + "\finp.tst" For Binary Access Write As #fo%
    
    For i% = 1 To 20
    
        m% = Rnd * 100
        
        If m% Mod 2 = 0 Then
        
           '::: Повторение
        
           p& = Rnd * 255
           l& = Rnd * 1000
           
           If l& > 0 Then
              Buf$ = String$(l&, Chr$(p&))
              Put #fo%, , Buf$
           End If
        
        Else
        
           '::: Каша
           
           l& = Rnd * 1000
           
           Buf$ = String$(l&, Chr$(0))
           
           For j& = 1 To l&
           
               Mid$(Buf$, j&, 1) = Chr$(Rnd * 255)
               
           Next j&
               
           Put #fo%, , Buf$
                   
        End If
        
    Next i%
    
    Close #fo%
 
End Sub


Код, разумеется, можно улучшить.
4
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.11.2015, 01:19  [ТС]
Windows Scheduled Tasks Enumerator/Killer
(Перечисление задач Планировщика заданий + функция удаления)


Совместимость: Vista+ для VB6/VBScript.
Зависимость: нужна запущенная служба "Планировщик заданий".

Выводит все, в т.ч. задания от Майкрософт (они расположены в подкаталогах).
GUI не писал. Вывод - в окно отладки.

Visual Basic
1
Public Function KillTask(TaskFullPath As String) As Boolean
этой функции передавать путь к заданию в формате: \путь от корня папки Tasks\имя задания,
например: \Adobe Flash Player Updater

На счет создания задач (в т.ч. на VBS) есть много примеров на MSDN, поэтому интереснее было написать
именно перечислитель. Здесь используется много интерфейсов с наследованием одного от другого,
связи между которыми довольно плохо документированы в оф. доках. Достаточно только взглянуть
на этот внушительный список, чтобы испугаться -)).

В планах - совместимость с XP + ручной парсер xml / killer ключей (реестр) для случаев, когда нужно работать с задачами при отключенной службе.
На текущий момент есть 2 версии интерфейсов:
  • Task Scheduler 1.0: Client requires Windows Vista, or Windows XP. Server requires Windows Server 2008 or Windows Server 2003.
  • Task Scheduler 2.0: Client requires Windows Vista. Server requires Windows Server 2008.

Шпаргалка по наследованию и переходам между интерфейсами:

Как удалить задание. ITaskFolder::GetTask(Path) - > DeleteTask(Name)
Остановить задание. if IRegisteredTask::State = 4 (Running) ---- IRegisteredTask::Stop
Общее описание.
Командная строка задания: Task Service -> GetFolder (\) -> ITaskFolder::GetFolders -> GetTasks -> IRegisteredTask:: Definition -> ITaskDefinition::Actions -> IAction -> (by type...), example: IExecAction:: path, Arguments, WorkingDirectory
TypeLib reference to \taskschd.dll

Задачи по своей сути могут подразделяться на такие виды по роду деятельности:
- запуск программы (в т.ч. с аргументами).
- отправка email
- вызов окна (msgbox)
- вызов IComHandlerAction (грубо говоря, разные функции библиотек)

Код

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
Option Explicit
 
' Windows Scheduled Tasks Enumerator/Killer by Alex Dragokas
 
' You must add reference to c:\windows\system32 (SysWow64) \taskschd.dll
' Otherwise, specify variables with Object type instead of exact types of ITask group interfaces.
' Current decision - extracted Microsoft Type Library. You should register it first.
' Type Library registration tool by Steve McMahon may help.
 
Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type
 
' Action type constants
Private Const TASK_ACTION_EXEC          As Long = 0
Private Const TASK_ACTION_COM_HANDLER   As Long = 5&
Private Const TASK_ACTION_SEND_EMAIL    As Long = 6&
Private Const TASK_ACTION_SHOW_MESSAGE  As Long = 7&
 
' Task state
Private Const TASK_STATE_RUNNING        As Long = 4&
Private Const TASK_STATE_QUEUED         As Long = 2&
 
' Include hidden tasks enumeration
Private Const TASK_ENUM_HIDDEN          As Long = 1&
 
Private Const CLSCTX_INPROC_SERVER      As Long = 1&
 
Private Declare Function CLSIDFromString Lib "ole32.dll" (ByVal lpszGuid As Long, pGuid As GUID) As Long
Private Declare Function IIDFromString Lib "ole32" (ByVal lpsz As Long, lpiid As Any) As Long
Private Declare Function CoCreateInstance Lib "ole32.dll" (rclsid As Any, ByVal pUnkOuter As Long, ByVal dwClsContext As Long, riid As Any, pvarResult As Object) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 
Private CLSID_TaskScheduler As GUID
Private IID_ITaskService    As GUID
 
 
Public Sub EnumTasks()
    On Error GoTo ErrorHandler
 
    'Compatibility: Vista+
 
    ' Create the TaskService object.
    Dim Service As Object
    
    'Set Service = CreateObject("Schedule.Service")     '// VBScript
    
    CLSIDFromString StrPtr("{0F87369F-A4E5-4CFC-BD3E-73E6154572DD}"), CLSID_TaskScheduler      'или так (в принципе без разницы)
    IIDFromString StrPtr("{2FABA4C7-4DA9-4013-9697-20CC3FD40F85}"), IID_ITaskService
    CoCreateInstance CLSID_TaskScheduler, 0&, CLSCTX_INPROC_SERVER, IID_ITaskService, Service
    
    Service.Connect
 
    ' Get the root task folder that contains the tasks.
    Dim rootFolder As ITaskFolder
    Set rootFolder = Service.GetFolder("")
    
    ' Recursively call for enumeration of current folder and all subfolders
    EnumTasksInITaskFolder rootFolder
    
    Set rootFolder = Nothing
    Set Service = Nothing
 
    Exit Sub
 
ErrorHandler:
    Debug.Print "EnumTasks. Error: #" & Err.Number & " - " & Err.Description
End Sub
 
Sub EnumTasksInITaskFolder(rootFolder As ITaskFolder)
    On Error GoTo ErrorHandler
    
    Dim taskState   As String
    Dim taskFolder  As ITaskFolder
    
    Debug.Print "Folder Name: " & rootFolder.Name
    Debug.Print "Folder Path: " & rootFolder.Path
 
    Dim taskCollection As Object
    Set taskCollection = rootFolder.GetTasks(TASK_ENUM_HIDDEN)
 
    Dim numberOfTasks As Long
    numberOfTasks = taskCollection.Count
 
    Dim registeredTask  As IRegisteredTask
    Dim taskDefinition  As ITaskDefinition
    Dim taskAction      As IAction
    Dim taskActionExec  As IExecAction
    Dim taskActionEmail As IEmailAction
    Dim taskActionMsg   As IShowMessageAction
    Dim taskActionCOM   As IComHandlerAction
    
    If numberOfTasks = 0 Then
        Debug.Print "No tasks are registered."
    Else
        Debug.Print "Number of tasks registered: " & numberOfTasks
    
        For Each registeredTask In taskCollection
            With registeredTask
                Debug.Print "Task Name: " & .Name
                Debug.Print "Task Path: " & .Path
                
                Set taskDefinition = .Definition
                
                For Each taskAction In taskDefinition.Actions
                    Select Case taskAction.Type
                    
                        Case TASK_ACTION_EXEC
                            Set taskActionExec = taskAction
                            Debug.Print " Type: Executable"
                            Debug.Print "  Exec Path: " & taskActionExec.Path
                            Debug.Print "  Exec Args: " & taskActionExec.Arguments
                            Debug.Print "  Exec Type: " & taskActionExec.Type
                            
                        Case TASK_ACTION_SEND_EMAIL
                            Debug.Print " Type: Email"
                            Set taskActionEmail = taskAction
                            Debug.Print "  Recepient: " & taskActionEmail.To
                            Debug.Print "  Subject:   " & taskActionEmail.Subject
                        
                        Case TASK_ACTION_SHOW_MESSAGE
                            Debug.Print " Type: Message Box"
                            Set taskActionMsg = taskAction
                            Debug.Print "  Title: " & taskActionMsg.Title
                            
                        Case TASK_ACTION_COM_HANDLER
                            Debug.Print " Type: COM Handler"
                            Set taskActionCOM = taskAction
                            Debug.Print "  ClassID: " & taskActionCOM.ClassId
                            Debug.Print "  Data:    " & taskActionCOM.Data
 
                    End Select
                    
                Next
                
            End With
            
            Select Case registeredTask.State
                Case "0"
                    taskState = "Unknown"
                Case "1"
                    taskState = "Disabled"
                Case "2"
                    taskState = "Queued"
                Case "3"
                    taskState = "Ready"
                Case "4"
                    taskState = "Running"
            End Select
            
            If registeredTask.State <> TASK_STATE_DISABLED And registeredTask.Enabled = False Then taskState = taskState & " (Disabled)"
 
            Debug.Print "    Task State: " & taskState
            Stop
        Next
    End If
    
    Set taskActionExec = Nothing
    Set taskActionEmail = Nothing
    Set taskActionMsg = Nothing
    Set taskActionCOM = Nothing
    Set taskAction = Nothing
    Set taskDefinition = Nothing
    Set registeredTask = Nothing
    Set taskCollection = Nothing
    
    Dim taskFolderCollection As ITaskFolderCollection
    Set taskFolderCollection = rootFolder.GetFolders(0&)
 
    For Each taskFolder In taskFolderCollection 'deep to subfolders
        EnumTasksInITaskFolder taskFolder
    Next
    
    Set taskFolder = Nothing
    Set taskFolderCollection = Nothing
    
ErrorHandler:
    Debug.Print "EnumTasksInITaskFolder. Error: #" & Err.Number & " - " & Err.Description
End Sub
 
Public Function KillTask(TaskFullPath As String) As Boolean
    On Error GoTo ErrorHandler
    Dim TaskPath As String
    Dim TaskName As String
    Dim pos As Long
    
    'Compatibility: Vista+
    
    pos = InStrRev(TaskFullPath, "")
    If pos <> 0 Then
        TaskPath = Left$(TaskFullPath, pos)
        If Len(TaskPath) > 1 Then TaskPath = Left$(TaskPath, Len(TaskPath) - 1) 'trim last backslash
        TaskName = Mid$(TaskFullPath, pos + 1)
    Else
        Exit Function
    End If
 
    ' Create the TaskService object.
    Dim Service As Object
    Set Service = CreateObject("Schedule.Service")
    Service.Connect
 
    ' Get the root task folder that contains the tasks.
    Dim rootFolder As ITaskFolder
    Set rootFolder = Service.GetFolder(TaskPath)
    
    Dim registeredTask  As IRegisteredTask
    Set registeredTask = rootFolder.GetTask(TaskName)
    
    'Dim taskCollection As Object
    'Set taskCollection = rootFolder.GetTasks(TASK_ENUM_HIDDEN)
    '
    '    For Each registeredTask In taskCollection
    '        With registeredTask
    '          If InStr(1, .Path, TaskName, 1) <> 0 Then
    '            Debug.Print "Task Name: " & .Name
    '            Debug.Print "Task Path: " & .Path
    '          End If
    '
    '        End With
    '    Next
    'Stop
    
    ' Stop the task
    If registeredTask.State = TASK_STATE_RUNNING Or registeredTask.State = TASK_STATE_QUEUED Then
        registeredTask.Stop 0&
        Sleep 2000&                 ' Async. call. Must wait a little.
                                    ' Maybe it is much better to track for threads
    End If
    
    If registeredTask.Enabled Then registeredTask.Enabled = False
    
    Dim taskDefinition  As ITaskDefinition
    Dim taskAction      As IAction
    Dim taskActionExec  As IExecAction
    
    ' Kill process
    Set taskDefinition = registeredTask.Definition
    
    For Each taskAction In taskDefinition.Actions
        If TASK_ACTION_EXEC = taskAction.Type Then
            Set taskActionExec = taskAction
            Debug.Print taskActionExec.Path
            'If fileexists(taskActionExec.Path) Then
            '    KillProcessByFile taskActionExec.Path
            'End If
        End If
    Next
    
    ' Remove the Job
    rootFolder.DeleteTask TaskName, 0&
    Sleep 1000&
    
    KillTask = True
    
    Set taskActionExec = Nothing
    Set taskAction = Nothing
    Set taskDefinition = Nothing
    Set registeredTask = Nothing
    Set rootFolder = Nothing
    Set Service = Nothing
    Exit Function
ErrorHandler:
    Debug.Print "KillTask. Error: #" & Err.Number & " - " & Err.Description
End Function
Вложения
Тип файла: rar Tasks.rar (73.0 Кб, 114 просмотров)
1
186 / 37 / 3
Регистрация: 28.05.2015
Сообщений: 149
25.12.2015, 10:20
Всем привет!

Написал небольшое приложение, выясняющее насколько случайна случайность. Чисто для исследовательских целей.

Вот ссылка на ролик(http://www.youtube.com/watch?v=O6s-pllW3dc), который сподвиг меня написать эту программу. Там говорится про случайности при создании адреса для ролика на YouTube. В общем вот сам проект на VB6 с программой.

Доработал для эксперимента.
Вложения
Тип файла: rar GenWords.rar (279.2 Кб, 91 просмотров)
Тип файла: rar GenWords.rar (284.1 Кб, 91 просмотров)
2
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
26.12.2015, 22:45
Стеганография в WAVE файлах.
Ссылка.
2
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
11.01.2016, 17:04
Inline assembler.
Всем привет.
Я сделал Add-in который позволяет напрямую использовать ассемблер в VB6. Add-in содержит встроенный редактор ассемблерного кода в котором мы можем переопределять код процедур VB6. Это работает и в IDE и в скомпилированном виде. При компиляции ассемблерный код линкуется к EXE, как будто это стандартные функции, без всяких выделений буфера и копирования опкодов.
Ссылка.
6
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
13.01.2016, 05:54
Разбиение файлов

Программа может разбить любой файл, на любое количество частей
После разбития файла, каждая часть имеет номер и расширение prt (PART)
Имеется возможность собирать всё обратно в один файл
Также файлы можно удалить после сборки
И также родительский файл можно удалить (кроме системных файлов)

К примеру в папке у меня иконка и медийный файл Wav, я им поставил
Атрибут системные, и они удаляться не будут

код для формы:
Кликните здесь для просмотра всего текста
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
Option Explicit
Option Compare Text
'
'Программа для разделения и сборки файлов
'© by the Fever Brain 2016
'
Const r& = 90, gen$ = "prt", stic$ = "cut.ico", jpg = "W.jpg", sl$ = "", t$ = ".", s1$ = "(", s2$ = ")", mxprt& = 100
 
Dim WithEvents cbx1 As ComboBox, WithEvents cbx2 As ComboBox
Dim WithEvents l1 As Label, WithEvents l2 As Label
Dim WithEvents cm1 As CommandButton, WithEvents cm2 As CommandButton
Dim WithEvents ch1 As CheckBox, WithEvents ch2 As CheckBox
Dim WithEvents cm3 As CommandButton, WithEvents ch3 As CheckBox
Dim WithEvents im As Image
Dim m_hMod&, fldr$, oldD$, sz&, ll&, tt&, w&, hh&, i&, v
Dim mfso As Object, mshapp As Object, dic As Object
 
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
 
Private Sub Form_Initialize()
    m_hMod = LoadLibrary("shell32.dll")
    InitCommonControls
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    On Error Resume Next
    'Заходим в первоначальную папку, и сохраняем настройки
    ChDir oldD
    SaveSetting "Divisor", "Check", "1", ch1.Value
    SaveSetting "Divisor", "Check", "2", ch2.Value
    SaveSetting "Divisor", "Check", "3", ch3.Value
    FreeLibrary m_hMod
End Sub
 
 
Private Sub cbx1_Click()
    Dim ge As Boolean, fe As Boolean, sys As Boolean
    On Error Resume Next
    With fso
        cbx2Ref
        fe = .fileexists(cbx1.Text)
        ge = .GetExtensionName(cbx1.Text) = gen
        sys = .GetFile(cbx1.Text).Attributes And 4 'Если системный
        cm2.Enabled = fe And ge
        cm3.Enabled = fe And (Not cm2.Enabled) And cbx2.ListCount > 0
        cbx2.Enabled = Not (cm2.Enabled)
        ch1.Enabled = fe And (Not ge) And (Not sys)
        ch2.Enabled = fe And ge
    End With
End Sub
 
Private Sub cm3_Click()
    Dim del&, s$, part&, os&, b() As Byte, i&, n&
    'Разбиение
    s = Split(cbx2.Text)(0): If IsNumeric(s) Then del = s
    
    s = ""
    part = sz \ del
    os = sz Mod del
    For i = 1 To sz Step part
        b = ReadBytes(cbx1.Text, (i), part)
        n = n + 1: WriteBytes cbx1.Text & s1 & n & ").prt", b, , 1
    Next
    If i <= sz Then
         b = ReadBytes(cbx1.Text, (i), os)
        n = n + 1: WriteBytes cbx1.Text & s1 & n & ").prt", b, , 1
    End If
    For n = n + 1 To mxprt + 1
        'Удаление частей с высшей нумерацией
        s = cbx1.Text & s1 & n & s2 & t & gen
        If fso.fileexists(s) Then fso.DeleteFile s, 1
    Next
    If ch1.Value > 0 And ch1.Enabled = True Then
         'Удаление родительского файла
         On Error Resume Next
         fso.DeleteFile cbx1.Text, 1
    End If
    s = cbx1.Text & s1 & 1 & s2 & t & gen
    If fso.fileexists(s) Then cbx1.Text = s
    fldrRef
    If ch3.Value > 0 Then PlaySound "Windows Vista Notify.wav", 0, &H1 Or &H20000
End Sub
 
 
Private Sub cm2_Click()
    'Сборка
    Dim s$(4), ss$, j$(), i&, ii&, start&, b() As Byte
    dic.RemoveAll
    With fso
        s(0) = sss(cbx1.Text, s(1), s(2), s(3), s(4))
        ss = s(4)
        For i = 0 To cbx1.ListCount - 1
            On Error Resume Next
            Erase s
            s(0) = sss(cbx1.List(i), s(1), s(2), s(3), s(4))
            If s(4) = ss And IsNumeric(s(3)) Then dic.Add i, s(0)
        Next
        ii = dic.Count - 1: ReDim j(ii)
        For i = mxprt + 1 To 1 Step -1
            s(0) = ss & s1 & i & s2 & "." & gen
            If .fileexists(s(0)) Then j(ii) = s(0): ii = ii - 1
        Next
    End With
 
    For i = 0 To UBound(j)
        b = ReadBytes(j(i))
        start = WriteBytes(ss, b, (start), i = 0)
         'Удаление
        If ch2.Value = 1 And ch2.Enabled = True Then
            fso.DeleteFile j(i), 1
        End If
    Next
 
    cbx1.Text = ss
    fldrRef
    If ch3.Value > 0 Then PlaySound "Windows Vista Notify.wav", 0, &H1 Or &H20000
End Sub
 
Function sss(ss0$, ss1$, ss2$, ss3$, ss4$) As String
    'Фильтрация
    With fso
        sss = ss0
        ss1 = .GetExtensionName(ss0)
        ss2 = StrReverse(.GetBaseName(ss0))
        ss3 = Split(Split(ss2, s1, 2)(0), s2, 2)(1)
        ss4 = StrReverse(Split(ss2, s1, 2)(1))
    End With
End Function
 
Sub cbx2Ref()
    With cbx2
        On Error GoTo er:
        sz = fso.GetFile(cbx1.Text).Size
        cbx1.ToolTipText = "Файл: " & fso.GetAbsolutePathName(cbx1.Text) & "    Размер: " & sz
er:
        .Clear
        For i = mxprt To 2 Step -1
            If (sz \ i) > 0 Then .AddItem i & IIf(i > 4, " Частей", " Части"), 0
        Next
        If .ListCount Then
            .ListIndex = 0
        Else
            .Text = "Разбить нельзя"
        End If
    End With
End Sub
 
Private Sub Form_Resize()
    Me.WindowState = 0
    Me.Width = cm3.Left + cm3.Width + (Me.Width - Me.ScaleWidth) + r * 2
    Me.Height = cm3.Top + cm3.Height + (Me.Height - Me.ScaleHeight) + r * 2
End Sub
 
Private Sub cm1_Click()
    On Error GoTo ext
    sz = 0: cbx1.ToolTipText = ""
    fldr = shapp.BrowseForFolder(0, "Текущая, установленная  папка " & vbLf & fldr, 100, "").self.Path
    fldrRef
ext:
    cbx1_Click
End Sub
 
 
Sub fldrRef()
    'Обновление папки
    Dim v, s$
    ChDir fldr
    s = cbx1.Text
    With fso.GetFolder(fldr)
        cbx1.Clear
        For Each v In .Files
            cbx1.AddItem v.Name
        Next
        If fso.fileexists(s) Then cbx1.Text = s: cbx1_Click Else cbx1.ListIndex = 0
    End With
End Sub
 
 
Private Property Get shapp() As Object
    If mshapp Is Nothing Then Set mshapp = CreateObject("Shell.Application")
    Set shapp = mshapp
End Property
 
Private Property Get fso() As Object
    If mfso Is Nothing Then Set mfso = CreateObject("scripting.filesystemobject")
    Set fso = mfso
End Property
 
Private Sub cbx1_KeyPress(KeyAscii As Integer): KeyAscii = 0: End Sub
Private Sub cbx2_KeyPress(KeyAscii As Integer): KeyAscii = 0: End Sub
 
Private Sub Form_Load()
    ll = r: tt = r: w = r * 10: hh = r * 2
    oldD = CurDir$
    ChDir App.Path
    
    For Each v In Controls: v.Visible = 0: Next
    If fso.fileexists(jpg) Then
        Set im = Controls.Add("vb.image", "im")
        With im
            .Move ll, tt, w, r * 23
            .Stretch = 1
            .Picture = LoadPicture(jpg)
            .Visible = 1
        End With
        ll = ll + w + r
    End If
    Set l1 = Controls.Add("vb.Label", "l1")
    With l1
        .Move ll, tt, w, hh
        .Caption = "Файл:"
        .Visible = 1
    End With
    Set cbx1 = Controls.Add("vb.ComboBox", "cbx1")
    With cbx1
        .Move ll + l1.Width + r, tt, r * 30 ', hh
        .Visible = 1
    End With
    tt = tt + l1.Height + r * 2
    Set l2 = Controls.Add("vb.Label", "l2")
    With l2
        .Move ll, tt, w, hh
        .Caption = "Разбить на:"
        .Visible = 1
    End With
    Set cbx2 = Controls.Add("vb.ComboBox", "cbx2")
    With cbx2
        .Move ll + l1.Width + r, tt, r * 30 ', hh
        .ToolTipText = "Максимум на сколько частей можно разбить этот файл"
        .Visible = 1
    End With
    tt = tt + l2.Height + r * 2
    
    Set ch1 = Controls.Add("vb.CheckBox", "ch1")
    With ch1
        .Move ll, tt, r * 40, r * 3
        .Caption = "Удалить родительский файл"
        .Visible = 1
    End With
    tt = tt + l2.Height + r * 2
    Set ch2 = Controls.Add("vb.CheckBox", "ch2")
    With ch2
        .Move ll, tt, r * 40, r * 3
        .Caption = "Удалить части"
        .Visible = 1
    End With
    tt = tt + l2.Height + r * 2
    Set ch3 = Controls.Add("vb.CheckBox", "ch3")
    With ch3
        .Move ll, tt, r * 40, r * 3
        .Caption = "Звуки"
        .Visible = 1
    End With
    tt = tt + l2.Height + r * 2
    Set cm1 = Controls.Add("vb.CommandButton", "cm1")
    With cm1
        .Move ll, tt, r * 13, r * 3
        .Caption = "Папка .."
        .Visible = 1
    End With
    Set cm2 = Controls.Add("vb.CommandButton", "cm2")
    With cm2
        .Move ll + r * 14, tt, r * 13, r * 3
        .Caption = "Собрать"
        .Visible = 1
    End With
    Set cm3 = Controls.Add("vb.CommandButton", "cm3")
    With cm3
        .Move ll + r * 28, tt, r * 13, r * 3
        .Caption = "Разбить"
        .Visible = 1
    End With
    Set dic = CreateObject("scripting.dictionary")
    dic.CompareMode = 1
    ch1.Value = GetSetting("Divisor", "Check", "1", 0)
    ch2.Value = GetSetting("Divisor", "Check", "2", 0)
    ch3.Value = GetSetting("Divisor", "Check", "3", 1)
    fldr = App.Path
    fldrRef
    cbx1_Click
    On Error Resume Next
    With Me
        .Icon = LoadPicture(stic)
        .Caption = "Разбиение файлов"
        Me.Left = (Screen.Width - Me.Left) / 3
        Me.Top = (Screen.Height - Me.Top) / 3
    End With
End Sub
 
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
    start = start + UBound(ReadBytes) + 1
End Function
 
Private Function WriteBytes(FileName$, Bytes() As Byte, Optional ByRef 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 'Копируем !
    WriteBytes = start + UBound(Bytes) + 1
End Function




Архив с исходниками (162 кб.)
3
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.01.2016, 12:08
Компьютер сочиняет музыку.



Всем привет. Как-то давно я делал виртуального композитора для создания 8-бит музыки, но в итоге забросил это дело. Я даже писал об этом и выкладывал демки. На днях я немного доработал его + добавил свои синтезаторы (вот и вот) в него + банки пресетов к ним.
Кстати там же можете добавлять новые пресеты и сохранять их.
Конечно музыкой это назвать нельзя (из-за кривого алгоритма, который я разработал давно, когда еще и музыку толком сам не умел делать и программировать не умел), но поиграться можно.
Для создания нового трека нужно придумать имя трека и ввести его в поле Name, если поле ничего не содержит оно заполнится произвольным числом. На основе имени создается трек (вычисляется хэш и это значение используется в качестве зерна псевдослучайного генератора), т.е. имя будет однозначно идентифицировать трек. Поле Tempo задает темп. Правой кнопкой мыши по треку - открывает окно синтезатора трека, можно менять параметры тем самым изменяя звучание. Левой кнопкой по паттерну - просмотреть паттерн. Никаких поверок нет, так что не нужно туда вводить неправильные значения иначе программа "рухнет".
Также программа может зависнуть (опять-таки из-за кривого алгоритма) при создании трека.
Удачи!

Скачать.
7
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.01.2016, 12:08

Готовые решения и полезные коды на Visual Basic .NET (Часть-1)
Предлагаю в этой теме размещать ответы на часто задаваемые вопросы и просто делиться полезными кодами. Обращаю внимание на некоторые...

Готовые коды для решения лабораторных работ
Доброго времени суток всем! Очень срочно нужны готовые коды для решения лабораторных работ в С# по учебнику Павловской!!! Вариант 16, нужны...

Написать программу решения квадратного уравнения. В Office Visual Basic
Написать программу решения квадратного уравнения. В Office Visual Basic

Полезные коды и проекты на VBA
В этой теме предлагаю выкладывать различные коды и готовые проекты VBA, которые, на Ваш взгляд, могут помочь новичкам в разработке как...

Полезные коды для PascalABC.NET
В этой теме размещаются полезные исходники программ, различные процедуры и функции, а так же готовые решения на часто задаваемые вопросы,...


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru