Получить код возврата консольного rar.exe

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Получить код возврата консольного rar.exe

Сообщение Space » 23.05.2009 (Сб) 20:23

Вызываю rar.exe через ShellExecute, как получить код, который возвращает rar.exe после выполнения?

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Получить код возврата консольного rar.exe

Сообщение Space » 23.05.2009 (Сб) 21:07

GetExitCodeProcess(ShellExecute(), nCode)?

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Получить код возврата консольного rar.exe

Сообщение Space » 23.05.2009 (Сб) 22:40

ёпс, ShellExecute не дожидается выполнения rar.exe, а просто запускает. Чё делать?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получить код возврата консольного rar.exe

Сообщение iGrok » 23.05.2009 (Сб) 22:41

Space писал(а):ёпс, ShellExecute не дожидается выполнения rar.exe, а просто запускает. Чё делать?

"Waiter" ?
label:
cli
jmp label

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Получить код возврата консольного rar.exe

Сообщение Space » 23.05.2009 (Сб) 22:58

у, кажись нашёл viewtopic.php?p=6594960#p6594960 . 2002 год :)

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Получить код возврата консольного rar.exe

Сообщение arvitaly » 23.05.2009 (Сб) 23:29

WaitForSingleObject недавно совсем обсуждалась

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить код возврата консольного rar.exe

Сообщение Хакер » 23.05.2009 (Сб) 23:54

С чего вы все взяли, что ShellExecute возвращает хендл процесса?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Получить код возврата консольного rar.exe

Сообщение arvitaly » 23.05.2009 (Сб) 23:58

И для чего он нужен, чтобы запустить EXE

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить код возврата консольного rar.exe

Сообщение Хакер » 23.05.2009 (Сб) 23:59

Это вопрос? Или это ответ?

Кому? Мне?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Получить код возврата консольного rar.exe

Сообщение arvitaly » 24.05.2009 (Вс) 0:03

Дополнение)))

Код: Выделить всё
Dim pid As Long
pid = Shell("d:\test.exe", vbMaximizedFocus)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить код возврата консольного rar.exe

Сообщение Хакер » 24.05.2009 (Вс) 0:08

Ещё раз, специально для тебя, суть претензии: почему никто сразу же не сказал автору, что используя ShellExecute он задуманного никогда не сделает?

Когда он указал ShellExecute() в качестве первого параметра GetExitCodeProcess, почему в этот раз никто не сказал, что это чушь, а вместо того, стали говорить о WaitForSingleObject?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Получить код возврата консольного rar.exe

Сообщение arvitaly » 24.05.2009 (Вс) 0:13

Да, как бы, предполагалось, что он сам увидит это, когда запустит код на исполнение.
Будем стараться, Сэр! :D

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Re: Получить код возврата консольного rar.exe

Сообщение BION » 24.05.2009 (Вс) 8:43

Хакер писал(а):Ещё раз, специально для тебя, суть претензии: почему никто сразу же не сказал автору, что используя ShellExecute он задуманного никогда не сделает?

Когда он указал ShellExecute() в качестве первого параметра GetExitCodeProcess, почему в этот раз никто не сказал, что это чушь, а вместо того, стали говорить о WaitForSingleObject?


"А потом пришел лесник и всех разогнал" ©

Space
Посмотри: http://wasm.ru/forum/viewtopic.php?pid=125737 , там есть предложения и примерчик, но правда на дэлфе.
Буээ!

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Получить код возврата консольного rar.exe

Сообщение Space » 24.05.2009 (Вс) 13:57

ну, ёшкин кот!
Shell возвращает 0, OpenProcess от 0 возвращает 872 (успешно!) и rar возвращает код 6 - "Произошла ошибка открытия файла.", архив не создаётся. Что интересно, Shell возвращает Double, OpenProcess его спокойно принимает.
ShellExecute возвращает 42 (удача!), OpenProcess ..., 42 возвращает 0! Архив создаётся, всё гуд, только процесс не ловится :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить код возврата консольного rar.exe

Сообщение Хакер » 24.05.2009 (Вс) 14:08

PID-маньяк.

Хочешь сказать, что Shell вместо корректного pid-а возвращает 0?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Получить код возврата консольного rar.exe

Сообщение Space » 24.05.2009 (Вс) 15:25

у, нашёл ошибку. Так Shell и ShellExecute возвращают разные значения? Shell делает разбор строки, передаваемой ей в параметре PathName? Может, нуно спец. формат? Передаю так: "C:\Rar.exe a D:\temp @file.lst"

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить код возврата консольного rar.exe

Сообщение Хакер » 24.05.2009 (Вс) 16:06

Space писал(а):у, нашёл ошибку. Так Shell и ShellExecute возвращают разные значения?

Shell возвращает идентификатор (не хендл!) процесса. ShellExecute возвращает бессмысленное число, с котороым единственное что можно сделать, так это сравнить его с 32 для опередения удачности/неудачности выполнения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Получить код возврата консольного rar.exe

Сообщение Space » 24.05.2009 (Вс) 16:51

почему это просто число?
If the function succeeds, the return value is the instance handle of the application that was run, or the handle of a dynamic data exchange (DDE) server application.

1. Почему Shell возвращает Double?
2. Почему OpenProcess спокойно принимает Double где указано Long?
3. Почему Rar не может сработать нормально, в конце-то концов!

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Получить код возврата консольного rar.exe

Сообщение arvitaly » 24.05.2009 (Вс) 17:02

Не знаю, что у тебя там не получается, проверь где у тебя файл file.lst лежит, скомпилируй exe и в ту же папку file.lst, к rar.exe укажи полный путь

Код: Выделить всё
Dim hProcess As Long, ReturnCode As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or SYNCHRONIZE, 0, Shell("D:\Program Files\WinRAR\rar.exe a D:\temp @file.lst"))
WaitForSingleObject hProcess, -1
Debug.Assert GetExitCodeProcess(hProcess, ReturnCode)
CloseHandle hProcess
MsgBox ReturnCode, , "Код возврата"

При нормальном архивирование ReturnCode=0, если файл file.lst не найден вроде вернет 6

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Получить код возврата консольного rar.exe

Сообщение Space » 24.05.2009 (Вс) 17:20

хе, хе... Из exe работает, из IDE никак :) Ещё вопрос про Double остаётся.

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Получить код возврата консольного rar.exe

Сообщение arvitaly » 24.05.2009 (Вс) 17:24

из IDE никак


Положи туда где проект или "Microsoft Visual Studio/vb98"

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Получить код возврата консольного rar.exe

Сообщение Space » 24.05.2009 (Вс) 18:21

а какое отношение имеет путь к IDE для данной задачи? ShellExecute нормально срабатывает. Только Shell чудит :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить код возврата консольного rar.exe

Сообщение Хакер » 24.05.2009 (Вс) 18:44

Space писал(а):почему это просто число?
If the function succeeds, the return value is the instance handle of the application that was run, or the handle of a dynamic data exchange (DDE) server application.


Потому что MSDN:
Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.


Возвращает значение, большее 32 в случае успеха, или же код ошибки, который меньше или равен 32. В следующей таблице перечислены коды ошибок. Возвращаемое значение кастуется как HISTANCE для обратной совместимости с 16-битными приложениями Windows. Однак в действительности это не HISNTANCE. Единственное, что можно сделать с возвращённым HISNTACNE, так это скастовать его к типу int и сравнить его с числом 32 или с одним из нижеследующих кодов ошибок.




1. Почему Shell возвращает Double?

ХЗ.
2. Почему OpenProcess спокойно принимает Double где указано Long?

Потому что в VB типы автоматически приводятся к тому, к чему нужно, если это возможно.

3. Почему Rar не может сработать нормально, в конце-то концов!

ХЗ.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Получить код возврата консольного rar.exe

Сообщение arvitaly » 24.05.2009 (Вс) 20:34

С чего ты вообще взял что она возвращает Double???

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Получить код возврата консольного rar.exe

Сообщение Space » 24.05.2009 (Вс) 23:22

Код: Выделить всё
С чего ты вообще взял что она возвращает Double???
Ctrl+I на Shell
Ну а если Shell вернёт нечто 10^20, значит, надо пробивать RetShell с &HFFFFFFFF?
Потому что в VB типы автоматически приводятся к тому, к чему нужно, если это возможно

Что ж тогда VB кричит, если передавать в нашу процедуру не тот тип, а с API молчит (ведь там указаны типы параметров)?
Хе, exe на автозагрузке выдал опять ошибку 6, млять! Ручной запуск успешен. Сейчас попробую поставить задержку от автостарта ...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить код возврата консольного rar.exe

Сообщение Хакер » 24.05.2009 (Вс) 23:28

Space писал(а):если Shell вернёт нечто 10^20

Не вернёт.

Space писал(а):VB кричит

Ложь.
Код: Выделить всё
Public Function A() As Double
   
End Function

Public Sub B(ByVal x As Long)

End Sub

Public Sub Main()
    B A
End Sub

Что где кричит и на что?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Получить код возврата консольного rar.exe

Сообщение Space » 24.05.2009 (Вс) 23:43

Код: Выделить всё
Private Sub Form_Load()
Dim b As Double
    A b
End Sub

Private Sub A(x As Long)

End Sub

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Получить код возврата консольного rar.exe

Сообщение arvitaly » 25.05.2009 (Пн) 0:17

ппц ну он не может преобразовать более длинное число и нифига shell не возвращает double

А такое количество процессов вообще невозможно (лет 20 еще мб)), в NET вообще Shell имеет формат Integer

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить код возврата консольного rar.exe

Сообщение Хакер » 25.05.2009 (Пн) 0:55

Space писал(а):
Код: Выделить всё
Private Sub Form_Load()
Dim b As Double
    A b
End Sub

Private Sub A(x As Long)

End Sub

И?

Вообще, мне сейчас кажется, что всем очевидна огромная разница, ну и уж ни для кого не загадка, почему в одном случае нет ошибки, а в другом есть. Но с тобой в голову проникает ужасное подозрение: Ой! Может быть дело в том, что ему эта разница неочевидна? И следом, ещё более ужасное: Ой!!! Может он не знает смысла ByRef/ByVal и разницы между ними?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Получить код возврата консольного rar.exe

Сообщение Space » 25.05.2009 (Пн) 1:00

блин, ну на автозагрузке тоже ничего не пашет. Почему Shell отказывается считать текущей папку, в которой запускается прога и в этой же папке лежит rar.exe! Или я чего-то недопонимаю - rar запускается из папки, где лежит также @file.lst, почему rar смотрит по другому пути? Что Shell там делает?
Хакер, вот только не надо, не надо... Вообще, я не задумывался о таких вещах, но сейчас, я вижу. Но, ведь при ByRef тоже ошибка! Да, указатель на разные типы данных просто указатель, и он проходит. Но ведь это ошибка, т.к. процедура ожидает Long, а ей суют Double. И, если бы целая часть в Double не занимала младшие биты, фиг бы вам тут прошло! Ой... :)

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

    TopList  
cron