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

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

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

Сообщение arvitaly » 25.05.2009 (Пн) 1:18

Код: Выделить всё
D:\Program Files\WinRAR\rar.exe a D:\temp @d:\file.lst


так тоже работает, в чем проблема не понимаю, app.path указать проблема?

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

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

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

Но, ведь при ByRef тоже ошибка!

Ох. Что значит тоже? В приведённом тобою примере и есть ByRef. В приведённом мною примере — ByVal, но там нет ошибки. Слово «ByRef» и слово «тоже» заставляют читателя думать о том, что есть случай не с ByRef, а с чем-то другим, при котором тоже возникает ошибка. Что это за случай, можно узнать?

Да, указатель на разные типы данных просто указатель, и он проходит. Но ведь это ошибка, т.к. процедура ожидает Long, а ей суют Double. И, если бы целая часть в Double не занимала младшие биты, фиг бы вам тут прошло! Ой... :)

Чушь.

Когда параметр ByVal-ный и типы не совпадают, исходное значение просто приводится к нужному типу. Это можно сделать, и это делается.
Когда параметр ByRef-ный и типы не совпадают, исходное значение тоже можно привести к нужному типу, но что толку с него будет, если функция ждёт не само значение (нужного типа), а ссылку на значение нужного типа? Передать ссылку на сконвертированное значение? Тогда функция, совершая операции с ByRef-аргументом, будет фактически модифицировать временное приведённое значение, а не значение оригинальной переменной, на которую была дана ссылка.

Т.е.
Код: Выделить всё
Function First()
    Dim aaa As Long
    Dim bbb As Double

    aaa = 777
    bbb = 888

    Second aaa, bbb

    ' aaa по прежнему будет 777, а не 0
    ' bbb будет 0
End Function

Function Second(ByRef x As Double, ByRef y As Double)
     x = 0
     y = 0
End Function


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

Но другое дело, когда ByRef-параметр, и передаётся либо возврат функции, либо константа. Тогда значение будет приведено к нужному типу и положено на стек, а в функцию будет передана ссылка на это мгновенное on-stack значение. В этом случае ничего опасного произойти не может. Потому что в отличие от предыдущего примера, где есть оригинальная переменная, изменение которой программист ожидает, но которая на деле не изменяется, здесь ничего схожего нет. Поэтому нет смысла запрещать компиляцию такого кода. Такой код не породит неоднозначностей.

Это же всё очевидно. Должно быть...
—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:45

я думал, что по умолчанию идёт ByVal - читал где-то про это в книжке. Или по давности и отсутствия применения на практике я всё попутал.
Когда параметр ByVal-ный и типы не совпадают, исходное значение просто приводится к нужному типу. Это можно сделать, и это делается.
Ну и возникают потом переполнения. Вообще, не нужно было бы делать преобразований, а строго следить за типами!

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

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

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

D:\Program Files\WinRAR\rar.exe a D:\temp @d:\file.lst
Да чё это я должен в параметрах rar-у указывать полные пути? Должно и так работать. Rar должон смотреть файло из своей папки запуска! Хакер, если ты такой умный, и для тебя всё так прозрачно, расколдуй принцип действия Shell :)

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

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

Сообщение arvitaly » 25.05.2009 (Пн) 2:30

Думаю когда ты запускаешь rar через shell его рабочей папкой становится рабочая папка твоего проекта

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

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

Сообщение Space » 25.05.2009 (Пн) 2:36

тоже так думаю. Но с какой радости? А при автозагрузке какая рабочая папка?

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

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

Сообщение arvitaly » 25.05.2009 (Пн) 2:38

Та, где находится твой exe надо полагать

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

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

Сообщение arvitaly » 25.05.2009 (Пн) 2:47

Используй
Код: Выделить всё
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
, там все можно задать и он сразу возвращает дескриптор запущенного процесса для твоего процесса.

Пред.

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

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

Сейчас этот форум просматривают: Google-бот и гости: 66

    TopList