Как правильно запустить exe? WinExec не получается сделать

Тема в разделе "WASM.BEGINNERS", создана пользователем Qpwoe, 16 июн 2006.

  1. Qpwoe

    Qpwoe New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2006
    Сообщения:
    10
    Пытаюсь выполнить следующий код - ошибка приложения, наивный вопрос, что не так?

    Приведите плз ктонить рабочий пример запускающий dat.exe из тойже директории где и наш файл

    format PE GUI

    entry __main

    include 'INCLUDE\win32a.inc'

    include 'INCLUDE\APIA\kernel32.inc'

    __main

    push _dat

    push $05

    call WinExec

    ret

    _dat: db 'dat.exe',0
     
  2. Qpwoe

    Qpwoe New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2006
    Сообщения:
    10
    Компилятор fasm 1.66, компилирует нормально, но не работает =)
     
  3. Klajnor_666

    Klajnor_666 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    22
    Адрес:
    Russia
    Хм... Если в _dat лежит строка, которую надо выполнить - то поменяй местами push'ы

    Т.е.

    push $05

    push _dat



    Хотя точно не уверен, т.к. я щас ещё пьян
     
  4. jecxz

    jecxz New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2006
    Сообщения:
    75
    Адрес:
    Brazil
    Код (Text):
    1.  
    2. UINT WinExec(
    3.   LPCSTR lpCmdLine, // address of command line
    4.   UINT uCmdShow     // window style for new application
    5. );
    6.  




    push uCmdShow

    push lpCmdLine

    call WinExec



    или



    invoke WinExec,lpCmdLine,uCmdShow
     
  5. Qpwoe

    Qpwoe New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2006
    Сообщения:
    10
    Тож ошибку вызывает, видимо ему не годиться _dat за адресс, или еще чтото такое

    ПОмогите плз ктонить, что не так

    Вот как сейчас пробовал



    format PE GUI

    entry __main



    include 'INCLUDE\win32a.inc'

    include 'INCLUDE\APIA\kernel32.inc'



    ;push SW_SHOW

    ;push _dat

    ;call WinExec



    __main:

    invoke WinExec,_dat,SW_SHOW

    ret

    _dat: db "dat.exe",0
     
  6. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    незаработало чтоли?

    посмотри с какой ошибкой выполняется WinExec (в ольке кпримеру можно посмотреть)
     
  7. Klajnor_666

    Klajnor_666 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    22
    Адрес:
    Russia
    Note This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function.





    [​IMG] 246116721__TestWinExec.rar
     
  8. Qpwoe

    Qpwoe New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2006
    Сообщения:
    10
    Спасибо всем, понял



    Klajnor_666 отдельное спасибо за рабочий пример =)
     
  9. jecxz

    jecxz New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2006
    Сообщения:
    75
    Адрес:
    Brazil


    предполагаю, что не работает не из-за этого, а из-за того, что нужно указывать полный путь к файлу (?)
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    jecxz



    Конечно, не из-за этого. WinExec вызывает CreateProcess с командной строкой и переменными окружения родительского процесса, потом ждёт пока новый процесс не создаст стек сообщений или не завершится.





    Не нужно.



    Чтобы не гадать, лучше посмотреть в оле, предварительно почитав msdn.
     
  11. Klajnor_666

    Klajnor_666 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    22
    Адрес:
    Russia
    Просто в примерах Qpwoe не правильно компилировался импорт.



    Переделал свой пример так:



    format PE GUI 4.0

    entry start

    include 'win32a.inc'



    dat db 'beer.exe',0

    _StartUpInfo STARTUPINFO ?

    _ProcessInformation PROCESS_INFORMATION ?



    start:

    ; invoke CreateProcess,dat,0,0,0,0,0,0,0,_StartUpInfo,_ProcessInformation

    invoke WinExec,dat,SW_NORMAL

    invoke ExitProcess,1

    data import



    library kernel32,'KERNEL32.DLL'



    import kernel32,\

    CreateProcess,'CreateProcessA',\

    WinExec,'WinExec',\

    ExitProcess,'ExitProcess'



    end data



    И всё нормально заработало.