Перезагрузка или закрытие и открытие чужого exe

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Перезагрузка или закрытие и открытие чужого exe

Сообщение Belkin » 29.07.2008 (Вт) 16:35

Есть чужой exe файл.
Написал колд, который меняет поля и кликает по кнопке. Все реализовал. Но вот засада в конце. Оказывается этот exe цепляте файлик (который я и подменяю) при загрузке, а не при щелчке.
Так вот теперь мне нужно либо как-то обновлять эту чужую форму, чтобы она цепляла мой файлик либо закрыть и открыть этот exe.
Вызываю exe с помощью ShellExecute
Закрываю Call SendMessage(UtilHwnd, WM_CLOSE, 0, 0)
либо Call SendMessage(UtilHwnd, WM_DESTROY , 0, 0)
Форма, то пропадает, но при следующем запеске через ShellExecute она появляется, но ни програмно ни просто мышкой клик по кнопке не приводи к выполнению действий (скрытых в том exe)
Подскажите как сделать перезапрос или закрытие и новое открытие, чтобы программно можно было послать клик

Заранее благодарен.
Андрей.

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

Сообщение Хакер » 29.07.2008 (Вт) 16:50

Если ты считаешь такое описание понятным, то мы — нет.

Написал колд, который меняет поля и кликает по кнопке.

Колд... Какие поля, какая кнопка?

Оказывается этот exe цепляте файлик (который я и подменяю) при загрузке, а не при щелчке.

Какой файлик? Что значит "цепляет(е)"?

Форма, то пропадает, но при следующем запеске через ShellExecute она появляется, но ни програмно ни просто мышкой клик по кнопке не приводи к выполнению действий (скрытых в том exe)
Подскажите как сделать перезапрос или закрытие и новое открытие, чтобы программно можно было послать клик

Вообще не смог понять. Какая форма? Форма — это такой подвид класса в VB. Это такой блочный элемент в HTML. Это, возможно, что-то ещё. У тебя — что?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

it.egor
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 29.07.2008 (Вт) 13:51

Сообщение it.egor » 30.07.2008 (Ср) 10:05

можно попробовать
call shell (......)
запускать

и уже с помощью
sendkeys(....)
управлять прогой

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 30.07.2008 (Ср) 10:05

Хакер
Чужой проект (exe) представляет из себя форму с 2 полями и 2 кнопками.
А написал свою прогу которая меняет значения этих полей и кликает на одну из кнопок.
А чужая программа выполняет свой, неизвестный мне алгоритм на основе xml файла-шаблона.
Так вот:
Моя програмулька все делалет (меняет значения полей и кликает по кнопке), только засада оказалась в самый последний момент. Чужая программа цепляет этот xml файл-шаблон при запуске. Поэтому если я хочу подсунуть сначало один xml а потом другой, то эту чужую программу нужно перезапускать, чтобы она работала с новым xml.
Может сейчас станет понятнее.
Так вот: как мне после запуска (ShellExecute), завершить чужую прогу чтобы потом ее заново запустить (ShellExecute).
Сейчас я пытался ее заквершить Call SendMessage(UtilHwnd, WM_CLOSE, 0, 0)
либо Call SendMessage(UtilHwnd, WM_DESTROY , 0, 0)
Но после очередного запуска ее кнопка не выполняет своих действий.
Андрей.

it.egor
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 29.07.2008 (Вт) 13:51

Сообщение it.egor » 30.07.2008 (Ср) 10:59

вопрос заключается в том, почему кнопка становится бездейственной... пробуй руками запускать и убить прогу и еще раз запустить... что станет???

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 30.07.2008 (Ср) 11:26

it.egor
Если прогу закрыть по крестику и заново открыть, то все работает.
А если закрыть Call SendMessage(UtilHwnd, WM_CLOSE, 0, 0)
либо Call SendMessage(UtilHwnd, WM_DESTROY , 0, 0) то кнопка визуально нажимается как програмно так и мышкой, но выполнение кода, связаного с ней не происходит
Андрей.

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

Сообщение Хакер » 30.07.2008 (Ср) 11:37

Код в студию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 30.07.2008 (Ср) 12:03

Хакер
Вот та часть

Код: Выделить всё
'====== Запускаем утилиту и ищем ее хэндл
      pr = ShellExecute(Form1.hwnd, "Open", "TBColEmulator.exe", vbNullString, vbNullString, 1)
      k = 0
      Do
          FipsHwnd = FindWindow(vbNullString, "TBColEmulator")
          DoEvents
          Call Sleep(100)
          k = k + 1
      Loop While FipsHwnd = 0 And k < 10
      '============
      If FipsHwnd <> 0 Then
        RetVal = EnumChildWindows(FipsHwnd, AddressOf ChildWinProc, 0)
        If Form1.Option_credit.Value = True Then
            Call file_credit(account, sum)
        Else
            Call file_debit(account, sum) '("236301112733", "2813,2374")
        End If
        iCl = 0
        Do
            Rez_num_msg = SendMessage(Num_of_msg_hwnd, &HC, 0, ByVal "1") ' Устанавливаем 1 для колличества обработок
            Rez_activ_win1 = ShowWindow(FipsHwnd, SW_SHOWNORMAL) 'Работает если прога свернута в трей
            Rez_activ_win2 = SetForegroundWindow(FipsHwnd) ' Активирует окно если не в трее
            DoEvents
            Call Sleep(100) ' Делаем задержку чтобы гарантировано активировать утилиту перед кликом
            Rez_click = PostMessage(Start_hwnd, &HF5, 0, 0) 'Посылаем клик по Start
            iCl = iCl + 1
        Loop While Rez_click <> 1 And iCl < 10
       
        i = 0
        bOper = False
        msg_value_old = Contrl_Value(Msg_sent_hwnd)
        Do
            DoEvents
            Call Sleep(500)
            i = i + 1
            msg_value = Contrl_Value(Msg_sent_hwnd)
            If CInt(msg_value) = CInt(msg_value_old) + 1 Then
                bOper = True
            Else
                bOper = False
            End If
        Loop While (CInt(msg_value) = CInt(msg_value_old)) And i < 20 ' Тоесть ждать не более 10 секунд или пока не выполнится
       
        If bOper = True Then
            'MsgBox "Операция выполнена!", vbInformation, "Операция прошла успешно."
            Print #4, filestring & ";OK"
        Else
            'MsgBox "Операция НЕ выполнена...", vbCritical, "Операция НЕ прошла..."
            Print #4, filestring & ";Fail"
        End If
        '+++ Закрываем утилиту и удаляем xml файлы
        Call SendMessage(FipsHwnd, WM_CLOSE, 0, 0)  ' Закрытие утилиты WM_DESTROY
        'CloseWindow
        '------- удаляем все xml файлы
        MyName = Dir("*.xml", vbNormal)
        Do While MyName <> ""
            Kill MyName
            MyName = Dir
        Loop
        '--------------
        '++++++
      Else
        Print #4, filestring & ";Fail Utility is not started"
      End If
Андрей.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Сообщение awl100Alex » 30.07.2008 (Ср) 12:08

Belkin
Если прогу закрыть по крестику и заново открыть, то все работает.


Когда ты нажимаешь по крестику... это почти все равно, что вызывать "Закрыть" в системном меню окна, которое есть у каждого стандартного окна.

Вот и сымитируй этот вызов... Таким кодом...

Код: Выделить всё
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd _
As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Const WM_SYSCOMMAND = &H112
Const SC_CLOSE = &HF060

Private Sub Command2_Click()
'Посылаем окну сообщение закрыться...
SendMessage Me.hWnd, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&
End Sub

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 30.07.2008 (Ср) 13:26

awl100Alex
Твой SendMessage возвращает 0
Я имею ввиду в моем случае. Хотя так все верно.
Что-то не доганяю в чем разница.
Андрей.

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 30.07.2008 (Ср) 13:50

Появилась мысль!
Данна (чужая) программа использует dll. может весь косяк в этом, при закрытии Call SendMessage(FipsHwnd, WM_CLOSE, 0, 0) форма пробадает с экрана, а dll как-то используется и потом возникают проблемы при последующем запуске.
Андрей.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Сообщение awl100Alex » 30.07.2008 (Ср) 13:57

Разница в том, что через...
SendMessage(FipsHwnd, WM_CLOSE, 0, 0)
ты обращаешься к оконной процедуре твоей формы, а используя WM_SYSCOMMAND ты обращаешься к ее системному меню и имитируешь нажатие "Закрыть"...
Вообщем-то ты прав... должны работать оба варианта.
Попробуй сделать форму активной и нажми Alt+пробел... долно появиться системное меню окна... если есть, то все должно работать.

Данна (чужая) программа использует dll.

Закроешь форму она закроет и dll...

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 30.07.2008 (Ср) 14:52

Написал код
Код: Выделить всё
Option Explicit


Private Sub Command2_Click()

Dim pr As Long

pr = Shell("c:\Work\Visual Basic\TBColEmulator.exe", 1)

End Sub

Програмулька запускается, но при щелканье по ее кнопке, никаких действий не происходит.
Что может быть???
Вставил в Пуск-> Выполнить строку "c:\Work\Visual Basic\TBColEmulator.exe"
Програмулька запустилась и при щелчке на ее кнопке выполняются действия.

У кого какие идеи?
Андрей.

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 30.07.2008 (Ср) 15:33

Судя всего прога не работает из под DOS!!!
Запустил cmd.exe а в ней "c:\Work\Visual Basic\TBColEmulator.exe"
Програмулька запустилась, но так же как и через VB не работает кнопка.

Какие предложения?
Андрей.

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

Сообщение Хакер » 30.07.2008 (Ср) 15:35

Belkin
Ну и чушь. cmd в твоём понимании это DOS?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 30.07.2008 (Ср) 16:07

Хакер
В моем понимании это имулчтор DOS
А разве не так?
Что-то я весь запутался...
Если в моем коде закометнировать строку
Call SendMessage(FipsHwnd, WM_CLOSE, 0, 0) ' Закрытие утилиты WM_DESTROY
тоесть не закрывать программульки а просто вызывать еще, то только у первой не работает кнопка у последующих все работает???
Вобщем я в полном стопоре.
Подскажите!!! HELP!!!
Андрей.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 30.07.2008 (Ср) 16:19

Belkin писал(а):В моем понимании это имулчтор DOS
А разве не так?
Это интерпретатор командных строк Windows. Эмуляция DOS это несколько иное.
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.07.2008 (Чт) 7:23

Belkin писал(а):В моем понимании это имулчтор DOS
А разве не так?

Разумеется нет.
Это приложение Windows, как Проводник, Блокнот или Microsoft Word.
Lasciate ogni speranza, voi ch'entrate.

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 31.07.2008 (Чт) 8:25

Прога то запускается, но кнопка не выполняет действий.
Вторая кнопка "STOP" которая судя по всему выполняет какие-то обычные команды, на немного подвешивает прогу (судя по всему она работает)
А вот кнопка "Start" скорей всего использует какую-то функцию или процедуру из dll. Вот она не работает.
Я открыл dll блокнотом и вот что я увидел среди иероглифов

LÍ!This program cannot be run in DOS mode.

$



Какие идеи???
Андрей.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Сообщение Alprog » 31.07.2008 (Чт) 8:51

и вот что я увидел среди иероглифов

Удивительно, но точно такую надпись среди иероглифов ты увидишь, даже если сам сделаешь exe файл на vb, пусть даже пустого проекта, и откроешь его через блокнот :)

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

Сообщение Хакер » 31.07.2008 (Чт) 8:53

Какие идеи???

Идея одна — отправить читать матчасть.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Сообщение Alprog » 31.07.2008 (Чт) 8:57

Belkin
Тебе же уже выше говорили про SendKeys.

1. Передаёшь фокус окну программы.
2. Посылаешь комбинацию клавиш Alt+F4
Программа в этом случае не отличает такого обмана от реального нажатия клавиш, то есть эффект равен закрытию на крестик.

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 31.07.2008 (Чт) 9:07

Хакер
Может я чего и не доганяю..
Но если посетителям этого форума понятно почему данная кнопка не функцианирует, то подскажите.
Андрей.

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 31.07.2008 (Чт) 9:10

Alprog
Эксперименты показали что косяк не в закрытии проги, а именно в программном открытии.
Если ручками запустить прогу все работает, а вот если через shell то данная кнопка не функционирует (судя по всему использует процедуру или функцию из dll) вот в этом проблема.
Андрей.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Сообщение Alprog » 31.07.2008 (Чт) 9:59

Belkin
А что будет, если открыть ручками сразу 2 копии проги? Обе работают?
А если открыть обе через ShellExecute?

Может попробовать выдержать паузу между закрытием-открытием проги хотя бы в секунду (вдруг он не успевает в какой-нибудь файл записать данные)?

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

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

Сообщение Хакер » 31.07.2008 (Чт) 10:07

Belkin
Что с правами доступа?
Ты точно открываешь программу, а не ярлык?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 31.07.2008 (Чт) 12:36

Хакер
Все, я разобрался!
СПАСИБО ВСЕМ ЗА ПОМОЩЬ!
Косяк мой.
Как я уже и говорил прога цепляет файлик при запуске, а у меня в конечном коде я формирую файл после запуска этой утилиты. От сюда и неработает кнопка.
Оправдание одно: часто и много менял код, вот и до перестовлялся кусками (первоначальный вариант без всяких проверок и т.д. работал)
Зато сколько много полезного и интересного узнал.

Всем кто помогал мне ОГРОМНОЕ СПАСИБО!!!
:D
Андрей.


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

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

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

    TopList