Ассемблер.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DooD, 14 Feb 2011.

  1. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Вопрос,как сделать что бы через определенные промежутки времени(скажем 15 сек.)запускался файл?делал settimer а в процедуре таймера писал shellexecute но файл запустился один раз через 15 сек.после запуска проги,и все.Прошу помощи.
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    1) После первого запуска, основная прога продолжала работать или нет?
    2) shellexecute с какими параметрами запускаешь и ты уверен что shellexecute не ожидает пока прога запущенная сдохнет? проверь через отладчик
    3) как вариант Цикл+Пауза помогут тебе.
     
  3. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    получается я запускаю прогу,она работает столько сколько таймер установлен,выполняется shellexecute и прога закрывается
    вот как примерно выглядит:
    invoke SetTimer,0,0,15000,offset TIMER
    ...
    TIMER PROC
    invoke ShellExecute,0,addr open,addr File_name,0,0,SW_SHOW
    TIMER endp
    а вот если вместо shellexecute в процедуру поставить MessageBox то он будет вызываться каждые 15 сек.а shellexecute только раз,не пойму в чем дело.
    да кстати делал jmp сразу после выполнения процедуры на таймер,получается файл запускается бесконечность раз пока не загрузит комп полностью.
     
  4. bad_boy

    bad_boy Elder - Старейшина

    Joined:
    30 Dec 2004
    Messages:
    187
    Likes Received:
    33
    Reputations:
    3
    @@:
    invoke ShellExecute,0,addr open,addr File_name,0,0,SW_SHOW
    invoke Sleep, 15*1000
    jmp @B
     
  5. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    хмхм,в принципе да,ну а если именно через settimer надо?Если допустим у меня должны быть еще функции CreateFile и WriteFile их нужно помещать в эту метку?
     
    #5 DooD, 15 Feb 2011
    Last edited: 15 Feb 2011
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    попробуй прототип функции таймера описать правильно (с учетом параметров которые система передает)
    Code:
    VOID CALLBACK TimerProc(
      __in  HWND hwnd,
      __in  UINT uMsg,
      __in  UINT_PTR idEvent,
      __in  DWORD dwTime
    );
    
    А то получается у тебя стек не правильно будет чиститься.
    К тому же проверь в отладчике более подробно что происходит после вызова ShellExecute. Ну и может там параметры ты какиенить не правильно её задаешь.
     
  7. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    в отладчике видно что после вызова shellexecute идет ret что походу и вызывает закрытия программы,тогда получается что таймер вобще не задействуется...что то не так..какойто бред,если вызывается ret после shellexecute то должно совершатся возвращение в главную программу,где стоит таймер,а вместо етого прога тупо вылетает...
     
    #7 DooD, 15 Feb 2011
    Last edited: 15 Feb 2011
  8. SVLCH

    SVLCH New Member

    Joined:
    6 Feb 2011
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Функция SetTimer настраивает таймер на генерацию сообщений
    WM_TIMER через указанный промежуток времени.


    Code:
    .386
        .model flat, stdcall
        option casemap :none
        WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
        WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
      .data
        ... 
        .code
        start:
            invoke GetModuleHandle, NULL
            mov hInstance, eax
            invoke GetCommandLine
            mov CommandLine, eax
            invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
            invoke ExitProcess,eax
    WinMain proc hInst     :DWORD,
                 hPrevInst :DWORD,
                 CmdLine   :DWORD,
                 CmdShow   :DWORD
     
  9. SVLCH

    SVLCH New Member

    Joined:
    6 Feb 2011
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Code:
    StartLoop:
          invoke GetMessage,ADDR msg,NULL,0,0
          cmp eax, 0
          je ExitLoop
          invoke TranslateMessage, ADDR msg
          invoke DispatchMessage,  ADDR msg
          jmp StartLoop
        ExitLoop:
          return msg.wParam
    WinMain endp
    WndProc proc hWin   :DWORD,
                 uMsg   :DWORD,
                 wParam :DWORD,
                 lParam :DWORD
        .if uMsg == WM_COMMAND
        ... 
        .elseif uMsg == WM_CREATE
            invoke SetTimer, 0, 0, 15 * 100, 0
        .elseif uMsg == WM_TIMER
            invoke ShellExecute,0,addr open,addr File_name,0,0,SW_SHOW
    WndProc endp
    Где-то так.
     
  10. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вообще вся фигня в том, что для SetTimer (независимо от реализации оповещения (калбек или сообщение)), требуется чтобы была прокачка сообщений через
    GetMessage + DispatchMessage. В противном случае он отказывается работать.

    Как вариант замены может быть запуск потока в котором какраз и делается всё в цикле с паузой
     
    #10 slesh, 15 Feb 2011
    Last edited: 15 Feb 2011
  11. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    у меня прога без интерфейса
     
  12. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    через CreateThread запускай поток, а в нем цикл с ShellExecute и Sleep
     
  13. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    Code:
    BOOL WINAPI CreateTimerQueueTimer(
      __out         PHANDLE phNewTimer,
      __in          HANDLE TimerQueue,
      __in          WAITORTIMERCALLBACK Callback,
      __in          PVOID Parameter,
      __in          DWORD DueTime,
      __in          DWORD Period,
      __in          ULONG Flags
    );
    
     
    1 person likes this.
  14. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    всё.все получилось,спасибо тебе slesh, плюсанул бы но репутации нет:)
     
  15. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    а еще такой вопрос,поток занял файл,как сделать чтоб и другие проги могли обратиться к файлу?Может просто копировать в другое место?
     
    #15 DooD, 15 Feb 2011
    Last edited: 15 Feb 2011
  16. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    при открытии файла устанавливать атрибуты расшаривания.
    т.е. если открывал через CreateFile то должен быть 3-й параметр =
    FILE_SHARE_READ или FILE_SHARE_WRITE смотря что тебе надо делать.
     
  17. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    ну ситуация такая,есть vbs скрипт который должен upload-дить файл на серв,когда он обращается к файлу выпадает ошибка типа файл занят другим приложением,вот я и думаю,может тупо скопировать файл в другое место(копирование почемуто не лочится)и все.криво конечно но не так гемморно,а вобще спасибо за помощь в асме.про vbs это уже кропаль оффтоп в принципе все что хотел узнать-узнал,так что можно закрывать:)