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

Как программно узнать закончил ли ZIP свою работу?

25.02.2014, 11:19. Показов 13541. Ответов 90
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тот класс переделал, только не могу понять
как всётаки получить ответ что ZIP закончил свою работу ?

класс переделал ! по рекомендации проффесионала под ником Dragokas
выкладываю все версии в блоге

ниже фрагмент с коментарием где необходим этот код

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
Public Function UnZipFile(ByVal DestPath$, ParamArray Files())
    '
    'Извлечение из архива
    'Аргументы:
    'DestPath - полный путь к папке для распаковки архива
    'Files - Без параметра все файлы, либо по индексу либо имени в архиве
    'Примечание: Имена файлов в архиве, должны быть полными !
    '
    Dim DestDir As Object, s$, f&, j$(), v As Variant
 
    If Not FolderExists(DestPath) Then 'Проверяем есть ли папка
        MkDir (DestPath) 'Создаём папку для перемещаемых туда объектов
    End If
    Set DestDir = Shell.NameSpace((DestPath))
 
    If IsMissing(Files) Then
        DestDir.CopyHere mArchive.Items 'Перемещаем все ...
        '
        '
        '===== Здесь нужен правильный код окончания операции ! ! !
        '
        '
    Else
 
        For Each v In Files 'Подготавливаем список для перемещения
 
            If IsNumeric(v) Then
                s = s & " " & mArchive.Items().Item((v)).Name
            Else
 
                For f = 0 To mArchive.Items.Count - 1
                    If v = mArchive.Items().Item((f)).Name Then s = s & " " & f
                Next
            End If
        Next
        j = Split(Mid$(s, 2)) 'Cписок для перемещения
 
        For f = 0 To mArchive.Items.Count - 1
            s = mArchive.Items().Item(CLng(j(f))).Name
            s = DestPath & "\" & s
            DestDir.CopyHere mArchive.Items.Item(CLng(j(f))) 'Перемещаем указнные инексы
 
            Do 'Ждём пока в папке назначения не появится файл
                Sleep 100 '1/10 доля секунды
            Loop While Len(Dir(s)) = 0
        Next
    End If
End Function
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.02.2014, 11:19
Ответы с готовыми решениями:

Как в VBA узнать когда процесс закончил работу?
Как в VBA узнать когда процесс закончил работу? И существует работа с процессами в VBA

Как уведомить первый поток о том, что второй закончил свою работу
Добрый день. Проблема такая. Есть 2 класса. Первый MyLogic - отвечает за логику приложения, второй MyApplication - отвечает за его...

Как узнать закончил ли поток работу?
Для создания потоков использую ThreadPool.QueueUserWorkItem Как узнать когда, потоки закончат работу, к результату не привязать...

90
 Аватар для Апострофф
9908 / 3923 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
28.02.2014, 22:21
Студворк — интернет-сервис помощи студентам
FelixMacintosh, с юбилеем!!!

Не по теме:

И озарением, держи себя в руках, ё моё

Миниатюры
Как программно узнать закончил ли ZIP свою работу?  
1
Модератор
10047 / 3893 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
28.02.2014, 23:56
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
The Trick еще давал совет
Я тебе дал 2 совета, а твой способ, который ты используешь - неправильный.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
01.03.2014, 20:45  [ТС]
Внес изменения ! ищите в готовых решниях, или читайте в моём блоге

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

Добавлено через 8 минут
Вот как там производится копирование

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
Private Function CopyHere(Parent As Object, vItem, Optional vOptions) As Boolean
    '
    'Функция копирования
    'Аргументы: Папка (Zip-папка) // Копируемый объект
    '
    Dim Count, Cancel As Boolean, ParD As Date, ParC&
    Count = dicWnd.Count
    ParD = Shell.NameSpace((Parent.Self.Path)).Self.ModifyDate
    ParC = Parent.Items().Count
    On Error Resume Next
    Call Parent.CopyHere((vItem))
    If vItem.Count > 0 Then If Err.Number = 0 Then GoTo 1
    Err.Clear
 
    Do
        DoEvents
        Sleep 1000
        RaiseEvent CopyWait(Cancel, Parent)
        If Cancel Then Exit Do
    Loop While dicWnd.Count > Count
1
    CopyHere = (ParD <> Shell.NameSpace((Parent.Self.Path)).Self.ModifyDate) Or Parent.Items.Count _
    > ParC
End Function
Добавлено через 5 часов 47 минут
Я конечно-же не до конца воплотил идею Dragokas
там у меня простой подсчёт найденных окон,
хотя если немного доработать (3-4 строчки...) можно будет отследить
конкретное окно относящееся к данному процессу, я решил
пока не усложнять, тем более The Trick настойчиво меня уверяет
что я делаю чтото не правильно,( а в его компетентности я не сомневаюсь...)
что-ж я сторонник того, чтоб не ломать то что работает
вот увижу я код более правильный, в контексте этой задачи,
найду как его вставить, тогда и поменяю
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
01.03.2014, 23:22
Здесь вопрос больше не в компетентности, а в простоте реализации и стабильности кода.
Задачу можно решить несколькими способами.
Найденный Trick код наиболее удачен в силу прямого обращения к библиотеке.
Но и его реализация требует некоторых дополнительных усилий.
FelixMacintosh, приведенное Вами решение довольно интересное. Неплохо бы теперь добраться до конкретного окна.
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
01.03.2014, 23:28  [ТС]
Спасибо что это заметили, ну хорошо, я напрягусь, доработаю, потому-что и мне не хорошо от этого, что в коде есть дыры....

Добавлено через 3 минуты
Зато простенько )
0
Модератор
10047 / 3893 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
01.03.2014, 23:42
Это ненадежный код и неправильный в корне. Попробуй во время архивации открыть какое-нибудь окно, и цикл у тебя не закончится, или закрыть открытое окно. Я не понимаю чем тебе не устраивает отслеживание тредов? Я понимаю что ты не хочешь связываться с COM и C++, выбирай более простое решение значит, а не неправильное. Если ты пишешь на VB6 и это StandartEXE, то ты можешь быть уверен что параллельных тредов не будет. Ты можешь узнать количество тредов до копирования, и во время и в разнице найти TID' нужных тредов, сделав WaitForMultipleObject ты дождешься корректного завершения.
2
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
01.03.2014, 23:58  [ТС]
Мне кажется проще будет в том коде
реализовать 2-мя циклами
==========
перед копировинием запомнить состояние окон:
запуск копирования !
1) следить не появилось ли новое(новые)
2) если появилось выявить его и следить, что именно оно (или его группа) должно закрыться

всё просто, и уже ошибки точно не будет, уж в крайнем случае я предусмотрел аварийную Cancel
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
02.03.2014, 00:03
FelixMacintosh, черед треды/через окна - главное, чтобы идентификатор был уникальным.
Собственно то, что ты написал, я страницей ранее и предлагал.
0
Модератор
10047 / 3893 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
02.03.2014, 01:10
Лучший ответ Сообщение было отмечено Антихакер32 как решение

Решение

Цитата Сообщение от FelixMacintosh Посмотреть сообщение
Мне кажется проще будет в том коде
реализовать 2-мя циклами
Нет, проще, правильней и надежней я уже написал тебе как.

Добавлено через 1 час 6 минут
Решил тебе немного помочь, как я и говорил - отслеживая тред (по идее нужно отслеживать все новые треды, но у меня создается только один и я отслеживал один). Все корректно ожидает и завершается функция только после копирования.
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
Option Explicit
 
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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () 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 Const INFINITE = -1&
Private Const SYNCHRONIZE = &H100000
Private Const TH32CS_SNAPTHREAD = &H4
 
....
 
Private Function CopyHere(Parent As Object, vItem, Optional vOptions) As Boolean
    Dim bTrd As Collection, aTrd As Collection, tid As Long, hTrd As Long
    
    ....
    
    ' Получаем список потоков
    GetThreadsList bTrd
    Call Parent.CopyHere((vItem))
    GetThreadsList aTrd
 
    ' Находим новый поток.
    ' (перечислять нужно все потоки, я для примера делаю 1 последний,
    ' на других системах может создаваться несколько потоков, поэтому
    ' не стоит так оставлять)
    If bTrd.Count < aTrd.Count Then
        tid = aTrd.Item(aTrd.Count)
        hTrd = OpenThread(SYNCHRONIZE, False, tid)
        WaitForSingleObject hTrd, INFINITE
        CloseHandle hTrd
    End If
    
    ....
    
End Function
' Получить список потоков
Private Sub GetThreadsList(List As Collection)
    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
        Loop While Thread32Next(hSnap, TE)
    End If
    CloseHandle hSnap
End Sub
Отслеживание окон - т.к. возможно уничтожение окон и вполне возможно рождение другого окна с таким же хендлом, так что этот вариант отметается. Но я бы все-таки воспользовался тем кодом что я тебе дал (работа напрямую с zipfldr.dll)
2
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
02.03.2014, 09:16  [ТС]
Спасибо, прикрутил, на моей системе WaitForSingleObject действительно
правильно дожидаеться hTrd
но смущает коментарий:
(перечислять нужно все потоки, я для примера делаю 1 последний,
на других системах может создаваться несколько потоков, поэтому
не стоит так оставлять)


Добавлено через 33 минуты
Тоесть я даже не могу вопрос сформулировать, спрошу так...
как перечислить все потоки, и нужно ли их перечислять все ?

Добавлено через 3 минуты
и как определить что этот тот самый поток
0
Модератор
10047 / 3893 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
02.03.2014, 10:00
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
Тоесть я даже не могу вопрос сформулировать, спрошу так...
как перечислить все потоки, и нужно ли их перечислять все ?
Ты код смотрел? Там перечисляются все потоки, но ожидается только один.
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
и как определить что этот тот самый поток
Это очевидно, поток порождается после вызова Parent.CopyHere и просматривается список потоков до и после вызова. Соответственно в разнице найдем список потоков, создавшихся при вызове.
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
02.03.2014, 10:18  [ТС]
Дошло!, ну это примерно то-же о чем я и Dragokas уже писал, только я говорил о разнице окон а не потоков, нужно проследить добавленный поток верно ?

Добавлено через 8 минут
The Trick спасибо еще раз!, твой код способен уже работать в классе а не отдельном модуле так как не используется AddressOf, я очень рад полученным знаниям !
а ведь ещё неделб назад в интернете днём .. с огнём нельзя было найти адекватный ответ на этот вопрос, только здесь, и сейчас ответ найден ! ✰
0
Модератор
10047 / 3893 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
02.03.2014, 10:30
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
Дошло!, ну это примерно то-же о чем я и Dragokas уже писал, только я говорил о разнице окон а не потоков, нужно проследить добавленный поток верно ?
Да, но окна - ненадежный вариант я уже написал почему. Мой код будет делать в точности что надо - программно узнавать закончил ли работу архиватор или нет, и останавливать выполнение на этот срок. Ты можешь сделать с таймаутом и делать свое событие CopyWait, передавая вторым параметром в WaitForSingle(Multiple)Object значение

Добавлено через 10 минут
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
так как не используется AddressOf
Для справки - ты мог не использовать отдельный модуль, если бы не использовал EnumWindows, а использовал GetWindow. Посмотри мой пример где я внедрял код в чужой процесс на VB6, как я там перебирал окна.
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.03.2014, 09:25  [ТС]
Отметил лучшим ✰ ответом !

Добавлено через 1 минуту
Цитата Сообщение от The trick Посмотреть сообщение
Посмотри мой пример где я внедрял код в чужой процесс на VB6, как я там перебирал окна.
Учту, обязательно гляну

Добавлено через 22 часа 44 минуты
Очень не рекомендую проводить необдуманные эксперементы
с библиотеками Shell.32 и zipfldr.dll

после моих эксперементов, мне пришлось пере-устанавливать Windows
(хорошо что я запасся загодя, необходимым софтом, установил поверх старой
2-дня настройки из старой перетаскивал )
моя Shell32 сначало выдовала странности, а потом и вовсе слетела ...
а ведь она отвечает за многие эфекты в Windows Exploere
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.03.2014, 09:34  [ТС]
...и еще не все шрифты восстановил
Миниатюры
Как программно узнать закончил ли ZIP свою работу?  
0
Модератор
10047 / 3893 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
03.03.2014, 09:59
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
zipfldr.dll
Каким образом ты экспериментировал с ней?
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.03.2014, 10:23  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Каким образом ты экспериментировал с ней?
Кликните здесь для просмотра всего текста
Shell - достаточно полное представление о наиболее важных вызовов с использованием RUNDLL32 окон.


Это довольно полный список вызовов с использованием Rundell32 например, доступ к диалоговом окне "Свойства экрана" Панель управления ", и т.д. ..
Доступность
Общие сведения: Shell "rundll32.exe shell32.dll, Control_RunDLL access.cpl,, 3"
Клавиатура: Shell "rundll32.exe shell32.dll, Control_RunDLL access.cpl,, 3"
Мышь: Shell "rundll32.exe shell32.dll, Control_RunDLL access.cpl,, 3"
Звук: Shell "rundll32.exe shell32.dll, Control_RunDLL access.cpl,, 3"
Дисплей: Shell "rundll32.exe shell32.dll, Control_RunDLL access.cpl,, 3"

Добавить / Удалить Программы
Установка и удаление программ: Shell "rundll32.exe shell32.dll, Control_RunDLL команду appwiz.cpl, 0"
Установка / Удаление программ: Shell "rundll32.exe shell32.dll, Control_RunDLL команду appwiz.cpl, 1"
Выбор программ по умолчанию: Shell "rundll32.exe shell32.dll, Control_RunDLL команду appwiz.cpl, 3"
Добавить программу с CD или дискеты: Shell "rundll32.exe shell32.dll, Control_RunDLL команду appwiz.cpl, 3"
Установка / удаление компонентов Windows: Shell "rundll32.exe shell32.dll, Control_RunDLL команду appwiz.cpl, 2"
Применение
Настройка Windows Портфель: Shell "rundll32.exe syncui.dll, Briefcase_Intro"
Сжатие
Показать содержимое Zip: Shell "rundll32.exe Zipfldr.dll, RouteTheCall C: \ a.zip"
Советник по содержимому
Shell "rundll32.exe msrating.dll, RatingSetupUI"

Панель управления
Часы работы: Shell "rundll32.exe shell32.dll, Control_RunDLL"

Удалить ярлыки рабочего стола
Shell "rundll32.exe Fldrclnr.dll, Wizard_RunDLL"

Диалоги
Печатная: Shell "rundll32.exe DISKCOPY.DLL, DiskCopyRunDll"
Диск Формат: Shell "rundll32.exe shell32.dll, SHFormatDrive"

Настройки дисплея
Wallpaper: Shell "rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 0"
Заставка: Shell "rundll32.exe shell32.dll, Control_RunDLL desk.cpl,, 1"
Настройки: Shell "rundll32.exe shell32.dll, Control_RunDLL desk.cpl,, 3"
Темы: Shell "rundll32.exe shell32.dll, Control_RunDLL desk.cpl,, -1"
Заставка Tab: Shell "rundll32.exe desk.cpl, InstallScreenSaver% 1"
Внешний вид: Shell "rundll32.exe shell32.dll, Control_RunDLL desk.cpl,, 2"

Диалоги
Быстрый поиск: Shell "rundll32.exe shell32.dll, Control_RunDLL findfast.cpl"
Открыть файл с ... : Shell "rundll32.exe shell32.dll, OpenAs_RunDLL FileName"
Открыть папку, в которой шрифты установлены: Shell "rundll32.exe shell32.dll, SHHelpShortcuts_RunDLL FontsFolder"
Открытый диалог - Game Device: Shell "rundll32.exe shell32.dll, Control_RunDLL joy.cpl"

Аппаратные средства
Добавить новый мастер оборудования: Shell "rundll32.exe shell32.dll, Control_RunDLL экрана Hdwwiz.cpl Параметры"
Откройте диспетчер устройств: Shell "rundll32.exe devmgr.dll DeviceManager_Execute"
Безопасное извлечение устройства: Shell "rundll32.exe shell32.dll, Control_RunDLL hotplug.dll"
Мастер установки сканеров и камер безопасности: Shell "rundll32.exe wiashext.dll, AddDeviceWasChosen"
Internet Explorer
Упорядочить избранное: Shell "rundll32.exe Shdocvw.dll, DoOrganizeFavDlg"
Ограничение доступа - пароль: "Шелл" rundll32.exe msrating.dll, ClickedOnRAT% 1 "
Свойства обозревателя - вкладка - Общие сведения: Shell "rundll32.exe shell32.dll, Control_RunDLL inetcpl.cpl,, #"
Интернет
Открыть Telnet: Shell "rundll32.exe Url.dll, TelnetProtocolHandler www.yahoo.com.ar"
Печать HTML документа: Shell "rundll32.exe mshtml.dll, PrintHTML" NombreArchivoyPath ""
Клавиатура
Клавиатура Свойства - вкладка Оборудование: Shell "rundll32.exe shell32.dll, Control_RunDLL main.cpl @ 1,1"
Клавиатура Properties - вкладке "Скорость": Shell "rundll32.exe shell32.dll, Control_RunDLL main.cpl @ 1"
Microsoft Java Virtual Machine - удалить: Shell "rundll32.exe advpack.dll, LaunchINFSection java.inf, удаление"

Модем
Установка модема Wizard: Shell "rundll32.exe modemui.dll, InvokeControlPanel"
Мышь
Свойства: Мышь - Настройка кнопки: Shell "rundll32.exe shell32.dll, Control_RunDLL main.cpl @ 0,0"
Свойства: Мышь - Оборудование: Shell "rundll32.exe shell32.dll, Control_RunDLL main.cpl @ 0,4"
Свойства: Мышь - Pointer Set: Shell "rundll32.exe shell32.dll, Control_RunDLL main.cpl @ 0,2"
Свойства: Мышь - Установить колесо мыши: Shell "rundll32.exe shell32.dll, Control_RunDLL main.cpl @ 0,3"
MSN Messenger
Удалите в системном трее Msn: Shell "rundll32.exe advpack.dll, LaunchINFSection% WINDIR% \ INF \ msmsgs.inf, BLC.Remove"
Мультимедиа
NetMeeting: - инициировать вызов: Shell "rundll32.exe msconf.dll, CallToProtocolHandler% L"

NetWork
Мастер веб-сайтов: Shell "rundll32.exe netplwiz.dll, AddNetPlaceRunDll"
Отключить сетевой диск: Shell "rundll32.exe shell32.dll, SHHelpShortcuts_RunDLL Отключить"
Откройте Сетевые соединения: Shell "rundll32.exe shell32.dll, Control_RunDLL ncpa.cpl"
Мастер настройки сети: Shell "rundll32.exe hnetwiz.dll, HomeNetWizardRunDll"
ODBC
Открытие источника данных Администратор: Shell "rundll32.exe shell32.dll, Control_RunDLL Odbccp32.cpl"
Пароль
Мастер забытых паролей: Shell "rundll32.exe keymgr.dll, PRShowSaveWizardExW"
Мастер сброса паролей: Shell "rundll32.exe keymgr.dll, PRShowRestoreWizardExW"
Модем и телефон
Параметры настройки телефона и модема: Shell "rundll32.exe shell32.dll, Control_RunDLL modem.cpl"
Свойства: Электропитание: Shell "rundll32.exe shell32.dll, Control_RunDLL powercfg.cpl"
Принтеры
Добавить принтера: Shell "rundll32.exe shell32.dll, SHHelpShortcuts_RunDLL AddPrinter"
Диалог - подключение к принтеру: Shell "rundll32.exe Winspool.drv, ConnectToPrinterDlg"
Открыть принтера папки: Shell "rundll32.exe shell32.dll, SHHelpShortcuts_RunDLL PrintersFolder"
Распечатать эту страницу для проверки: Shell "rundll32.exe shell32.dll, SHHelpShortcuts_RunDLL PrintTestPage"
Открыть принятых методов установить принтер по умолчанию: Shell "rundll32.exe printui.dll, PrintUIEntry / Y / N" [Версия Отображаемое имя] ""
Язык и региональные стандарты - Диалог
Вкладка Дополнительно: Shell "rundll32.exe shell32.dll, Control_RunDLL intl.cpl,, 2"
Лоскут Языки: Shell "rundll32.exe shell32.dll, Control_RunDLL intl.cpl,, 1"
Региональные стандарты Tab: Shell "rundll32.exe shell32.dll, Control_RunDLL intl.cpl,, 0"

Общие папки
Открыть диалоговое окно общих папок: Shell "rundll32.exe NTLANUI.DLL, ShareManage"
Свойства Звуки и аудиоустройства
Лоскут Объем: Shell "rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl @ 1"
Аудио Tab: Shell "rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl,, 2"
Оборудование Tab: Shell "rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl,, 4"
Лоскут Голос: Shell "rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl,, 3"
Свойства системы
Генеральный Tab: Shell "rundll32.exe shell32.dll, Control_RunDLL команду sysdm.cpl, #"
Автоматическое обновление Tab: Shell "rundll32.exe shell32.dll, Control_RunDLL команду sysdm.cpl, 5"
Лоскут Имя компьютера: Shell "rundll32.exe shell32.dll, Control_RunDLL команду sysdm.cpl, 1"
Оборудование Tab: Shell "rundll32.exe shell32.dll, Control_RunDLL команду sysdm.cpl, 2"
Удаленная Tab: Shell "rundll32.exe shell32.dll, Control_RunDLL команду sysdm.cpl 6"
"Восстановление системы" Tab: Shell "rundll32.exe shell32.dll, Control_RunDLL команду sysdm.cpl, 4"
Вкладка "Дополнительно": Shell "rundll32.exe shell32.dll, Control_RunDLL команду sysdm.cpl, 3"
Панели задач
Свойства панели задач: Shell "rundll32.exe shell32.dll, Options_RunDLL 1"
Установите часы и дата: Shell "rundll32.exe shell32.dll, Control_RunDLL timedate.cpl"
Windows
Windows Firewall: Shell "rundll32.exe shell32.dll, Control_RunDLL firewall.cpl"
Изображения и факсы:. Exe shimgvw.dll, ImageView_PrintTo / р "% 1"% 2 ""% 3 ""% 4 "
Блокировка компьютера: Shell "rundll32.exe User32.dll, LockWorkStation"
Выход: Shell "rundll32.exe shell32.dll, SHExitWindowsEx 0"
Приостановка и спящий: Shell "rundll32.exe Powrprof.dll, SetSuspendState"
0
Модератор
10047 / 3893 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
03.03.2014, 10:27
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
Показать содержимое Zip: Shell "rundll32.exe Zipfldr.dll, RouteTheCall C: \ a.zip"
Это не то направление. И это не может повредить систему.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.03.2014, 22:10  [ТС]
плюс чтение потоков
Цитата Сообщение от The trick Посмотреть сообщение
это не может повредить систему.
я и говорю, сначало начались странности, потом полез ремонтировать ...
и как итог полная пере-установка ...

Добавлено через 11 часов 32 минуты
ну это всё лирика, а вот главное !
Цитата Сообщение от The trick Посмотреть сообщение
Ты код смотрел? Там перечисляются все потоки, но ожидается только один.
Обновил свой блог ✰

Кликните здесь для просмотра всего текста
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
Option Explicit
'
'    © FelixMacintosh 2014
'
Private Shell As Object '
Private Fso As Object '
Private mArchive As Object
'
Public Event CopyWait(Cancel As Boolean, Parent 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () 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 Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 
 
Private Const INFINITE = -1&
Private Const SYNCHRONIZE = &H100000
Private Const TH32CS_SNAPTHREAD = &H4
 
 
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
Private Function GetParentDate(Parent) As Date
    '
    '   Возврат даты папки назначения
    '
    On Error Resume Next
    If IsObject(Parent) Then
        GetParentDate = Parent.self.ModifyDate
    Else
        GetParentDate = Shell.NameSpace((Parent.self.Path)).ModifyDate
    End If
End Function
 
Private Function GetItemDate(Parent, vItem) As Date
    '
    '   Возврат даты объекта, в папке назначения
    '
    Dim ParentName$, ItemName$
    On Error Resume Next
    If IsObject(Parent) Then
        ParentName = Parent.self.Path
    Else
        ParentName = Fso.GetAbsolutePathName(Parent)
    End If
    '-------------------
    If IsObject(vItem) Then
        If TypeName(vItem) = "FolderItems3" Then
            ItemName = NameArchiveFiles(0)
        Else
            ItemName = vItem.Name
        End If
    Else
        ItemName = Right$(CStr(vItem), Len(vItem) - InStrRev(vItem, "\"))
    End If
    GetItemDate = Shell.NameSpace((ParentName)).ParseName((ItemName)).ModifyDate
 
End Function
Private Function ParentCount(Parent) As Long
    '
    '   Возврат количества объектов в корневой папке
    '
'    On Error Resume Next
   If IsObject(Parent) Then
        ParentCount = Shell.NameSpace((Parent.self.Path)).items().Count
    Else
        ParentCount = Shell.NameSpace((Parent)).items().Count
    End If
End Function
 
Private Function CopyHere(Parent, vItem) As Boolean
    '
    'Функция копирования
    'Аргументы: Папка (Zip-папка) // Копируемый объект
 
    Dim f&, Key$, hnd&, ParD As Date, ItemD As Date, PCount&
    Dim aTrd As Collection, bTrd As Collection, cTrd As Collection, tid As Long, hTrd As Long
    On Error Resume Next
 
    ParD = GetParentDate(Parent)
    ItemD = GetItemDate(Parent, vItem)
    PCount = ParentCount(Parent)
    'Получаем список потоков !
    GetThreadsList aTrd 'Запомнить старые потоки
    Call Parent.CopyHere((vItem)) 'Копирование >>>>>>>>>>>>
    
    GetThreadsList bTrd 'Запомнить новые потоки
    If vItem.Count > 0 Then If Err.Number = 0 Then GoTo 1 'В этом случае ждать не нужно
    Err.Clear 'Сброс всех ошибок
 
    Set cTrd = New Collection
    For f = bTrd.Count To 1 Step -1
        Key = "C" & bTrd.Item(f)
        hnd = aTrd(Key)
        If hnd = 0 Then cTrd.Add CLng(Mid$(Key, 2))
    Next
 
    For f = 1 To cTrd.Count 'Ожидание открытых потоков
        tid = cTrd.Item(f)
        hTrd = OpenThread(SYNCHRONIZE, False, tid)
        WaitForSingleObject hTrd, INFINITE
        CloseHandle hTrd
    Next
1
    CopyHere = (ItemD <> GetItemDate(Parent, vItem))
    CopyHere = CopyHere Or (ParD <> GetParentDate(Parent))
    CopyHere = CopyHere Or (PCount <> ParentCount(Parent))
End Function
 
 
Public Function UnZipFile(ByVal DestPath$, ParamArray Files()) As Boolean
    '
    'Извлечение из архива
    'Аргументы:
    'DestPath - полный путь к папке для распаковки архива
    'Files - Без параметра все файлы, либо по индексу либо имени в архиве
    'Примечание: Имена файлов в архиве, должны быть полными !
    '
    Dim DestDir As Object, f&, v As Variant, ind&
    If (mArchive Is Nothing) Then Exit Function 'Проверяем указан ли архив ?
    ReDim Obj(mArchive.items.Count - 1) As Object
 
    If Not Fso.FolderExists(DestPath) Then 'Проверяем есть ли папка
        Fso.CreateFolder (DestPath) 'Создаём папку для перемещаемых туда объектов
    End If
    Set DestDir = Shell.NameSpace((DestPath))
 
    If IsMissing(Files) Then
        'DestDir.CopyHere mArchive.Items
        UnZipFile = CopyHere(DestDir, mArchive.items)
    Else
 
        For Each v In Files 'Подготавливаем список для перемещения
 
            If IsNumeric(v) Then
                'Если это индексы
                Set Obj(ind) = mArchive.items().Item(CLng(v))
                If Not (Obj(ind) Is Nothing) Then ind = ind + 1
            Else
                'Если это имена
                Set Obj(ind) = mArchive.ParseName(CStr(v))
                If Not (Obj(ind) Is Nothing) Then ind = ind + 1
            End If
        Next
 
        For f = 0 To ind - 1 'Перемещаем выбранные объекты
            'DestDir.CopyHere Obj(f)
            UnZipFile = CopyHere(DestDir, Obj(f))
        Next
    End If
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 CopyFileToArchive(ByVal FilePath$) As Boolean
    '
    'Копирует файл / папку в архив
    '
    If (mArchive Is Nothing) Then Exit Function 'Проверяем указан ли архив ?
 
    If Len(Dir(FilePath, vbDirectory)) > 0 And Len(Dir(FilePath)) = 0 Then
 
        If Shell.NameSpace((FilePath)).items.Count = 0 Then
            MsgBox ("Нельзя добавить пустую папку")
            Exit Function
        End If
    End If
    'mArchive.CopyHere (FilePath)
    CopyFileToArchive = CopyHere(mArchive, FilePath) 'Копируем в архив
End Function
 
Public Function CreateArchive(ByVal Рath$) As Boolean
    '
    'Создаёт новый архив
    'Возврат утверждения о создании
    '
    If LCase(Fso.GetExtensionName(Рath)) <> "zip" Then Exit Function
    If Fso.FileExists(Рath) Then Kill Рath
    Fso.CreateTextFile(Рath, True).Write "PK" & Chr(5) & Chr(6) & String(18, 0)
    Set mArchive = Shell.NameSpace((Рath))
    CreateArchive = Not (mArchive Is Nothing) 'Возврат утверждения о создании
End Function
 
Private Sub Class_Initialize()
    Set Shell = CreateObject("Shell.Application")
    Set Fso = CreateObject("Scripting.FileSystemObject")
End Sub
 
Private Sub Class_Terminate()
    Set Shell = Nothing
    Set Fso = Nothing
End Sub
 
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 = Shell.NameSpace((vNewValue))
    End If
End Property
 
Public Property Set Archive(ByVal vNewValue As Variant)
    '
    'Свойство: Archive = Cсылка на файловый объект архива
    '
    On Error Resume Next
    Set Archive = vNewValue
End Property
 
Public Property Get Count() As Long
    If (mArchive Is Nothing) Then Exit Property
    Count = mArchive.items().Count
End Property
0
Модератор
10047 / 3893 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
03.03.2014, 22:21
Для ожидания нескольких потоков есть функция WaitForMultipleObjects.
Способ поиска потоков - мягко говоря, кривой (через обработчик ошибок). Я чисто для примера делал, чтобы не заморачиваться, делай в массиве лонгов и сразу передавай в Wait-функцию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.03.2014, 22:21
Помогаю со студенческими работами здесь

Закончил ли свою работу animate, toggle
Вот к примеру есть код спойлера: var Spoiler = { showClass: 'plus', hideClass: 'minus', toggle: function(el) { var...

Как определить закончил ли работу поток?
Здравствуйте, как определить закончил ли работу поток? begin Potok1 := ParallelObj.Create(true); Potok2 :=...

Как узнать что WinSock закончил загрузку файла?
Здравствуйте! Наверняка, все кто начинали работать с winsock спрашивали о том-же, что и я сейчас хочу спросить. 1. Моя программа...

Как узнать, что клиет закончил отсылать пакеты?
Забиндил локалхост, посылаю на него пакеты последовательно одной секцией sequence number, после чего на стороне клиента завершаю...

Как сделать, чтобы один поток не закончил работу, пока второй работает?
Подскажите, есть например 2 потока, которые ну например отсчитывают в цикле до 100. Как сделать чтоб один не закончил работу пока второй...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru