|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Может лучше поделить процедуру? Часть кода вынести в таймер или "нить"?
А здесь: Код:
if not FileExists(FlacName+'t.flac') then Exit; while not RenameFile(FlacName+'t.flac',FlacName+'.flac') do Application.ProcessMessages Код:
if FileExists(FlacName+'t.flac') then while not RenameFile(FlacName+'t.flac',FlacName+'.flac') do Application.ProcessMessages Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 08.02.2012 в 23:59. |
#17
|
|||
|
|||
Пробывал так получается файла еще нету или он занят и все время процедура завершается функцией Exit;
Во втором примере почти тоже самое , в итоге нужного файла нету Последний раз редактировалось Siropchik, 09.02.2012 в 00:10. |
#18
|
||||
|
||||
Ну всё верно, в зависимости от занятости ОС и длины файла, ShellExecute не успевает отрабатывать, а уже идёт попытка переименования.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#19
|
|||
|
|||
А выход есть?
Пробую вот так Цитата:
Последний раз редактировалось Siropchik, 09.02.2012 в 00:24. |
#20
|
||||
|
||||
Смотри в сторону CreateProcess.
Код:
function WinExecAndWait32(FileName:String; Visibility : integer):integer; var zAppName : array[0..512] of Char; zCurDir : array[0..255] of Char; WorkDir : String; StartupInfo : TStartupInfo; ProcessInfo : TProcessInformation; begin StrPCopy(zAppName, FileName); GetDir(0, WorkDir); StrPCopy(zCurDir, WorkDir); FillChar(StartupInfo, SizeOf(StartupInfo), 0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := Visibility; if not CreateProcess(nil, zAppName, { указатель на строку с командной строкой } nil, { указатель на атрибуты безопасности процесса } nil, { указатель на атрибуты безопасности потока } False, { флаг дескриптора предка } CREATE_NEW_CONSOLE or { флаги создания } NORMAL_PRIORITY_CLASS, nil, { указатель на новый блок среды } nil, { указатель на имя текущего каталога } StartupInfo, { указатель на STARTUPINFO } ProcessInfo) then Result := -1 { указатель на PROCESS_INF } else begin WaitforSingleObject(ProcessInfo.hProcess, INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, Result); end; end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 09.02.2012 в 00:29. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Siropchik (09.02.2012)
|
#21
|
|||
|
|||
Спасибо.
Буду изучать |
#22
|
|||
|
|||
При компиляции вылетает вот такая ошибка , может нужно какой нибудь копмонент то в Uses прописать?
[Error] SoundRecog.pas(308): Types of actual and formal var parameters must be identical Ошибка вылетает в строке GetExitCodeProcess(ProcessInfo.hProcess, Result); Вот что у меня в USes Цитата:
Последний раз редактировалось Siropchik, 09.02.2012 в 10:53. |
#23
|
|||
|
|||
Закоментировал строку
// GetExitCodeProcess(ProcessInfo.hProcess, Result); И все заработало. Только о результате не будет известно Спасибо за помощь Последний раз редактировалось Siropchik, 09.02.2012 в 13:34. |
#24
|
|||
|
|||
Оказалось функция GetExitCodeProcess возвращает тип DWORD , а не Int
|
#25
|
||||
|
||||
вообще-то:
Код:
BOOL GetExitCodeProcess( HANDLE hProcess, // handle to the process LPDWORD lpExitCode // address to receive termination status ); Пишу программы за еду. __________________ |
#26
|
||||
|
||||
sizeof(BOOL) = sizeof(DWORD) = sizeof(Cardinal) = sizeof(Integer) = 4.
А вот LPDWORD (указатель на DWORD) стоило бы и выделить красным. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |