Вопрос,как сделать что бы через определенные промежутки времени(скажем 15 сек.)запускался файл?делал settimer а в процедуре таймера писал shellexecute но файл запустился один раз через 15 сек.после запуска проги,и все.Прошу помощи.
1) После первого запуска, основная прога продолжала работать или нет? 2) shellexecute с какими параметрами запускаешь и ты уверен что shellexecute не ожидает пока прога запущенная сдохнет? проверь через отладчик 3) как вариант Цикл+Пауза помогут тебе.
получается я запускаю прогу,она работает столько сколько таймер установлен,выполняется 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 сразу после выполнения процедуры на таймер,получается файл запускается бесконечность раз пока не загрузит комп полностью.
хмхм,в принципе да,ну а если именно через settimer надо?Если допустим у меня должны быть еще функции CreateFile и WriteFile их нужно помещать в эту метку?
попробуй прототип функции таймера описать правильно (с учетом параметров которые система передает) Code: VOID CALLBACK TimerProc( __in HWND hwnd, __in UINT uMsg, __in UINT_PTR idEvent, __in DWORD dwTime ); А то получается у тебя стек не правильно будет чиститься. К тому же проверь в отладчике более подробно что происходит после вызова ShellExecute. Ну и может там параметры ты какиенить не правильно её задаешь.
в отладчике видно что после вызова shellexecute идет ret что походу и вызывает закрытия программы,тогда получается что таймер вобще не задействуется...что то не так..какойто бред,если вызывается ret после shellexecute то должно совершатся возвращение в главную программу,где стоит таймер,а вместо етого прога тупо вылетает...
Функция 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
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 Где-то так.
Вообще вся фигня в том, что для SetTimer (независимо от реализации оповещения (калбек или сообщение)), требуется чтобы была прокачка сообщений через GetMessage + DispatchMessage. В противном случае он отказывается работать. Как вариант замены может быть запуск потока в котором какраз и делается всё в цикле с паузой
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 );
а еще такой вопрос,поток занял файл,как сделать чтоб и другие проги могли обратиться к файлу?Может просто копировать в другое место?
при открытии файла устанавливать атрибуты расшаривания. т.е. если открывал через CreateFile то должен быть 3-й параметр = FILE_SHARE_READ или FILE_SHARE_WRITE смотря что тебе надо делать.
ну ситуация такая,есть vbs скрипт который должен upload-дить файл на серв,когда он обращается к файлу выпадает ошибка типа файл занят другим приложением,вот я и думаю,может тупо скопировать файл в другое место(копирование почемуто не лочится)и все.криво конечно но не так гемморно,а вобще спасибо за помощь в асме.про vbs это уже кропаль оффтоп в принципе все что хотел узнать-узнал,так что можно закрывать