![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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Последний раз редактировалось angvelem, 08.02.2012 в 23:59. |
|
#17
|
|||
|
|||
|
Пробывал так получается файла еще нету или он занят и все время процедура завершается функцией Exit;
Во втором примере почти тоже самое , в итоге нужного файла нету Последний раз редактировалось Siropchik, 09.02.2012 в 00:10. |
|
#18
|
||||
|
||||
|
Ну всё верно, в зависимости от занятости ОС и длины файла, ShellExecute не успевает отрабатывать, а уже идёт попытка переименования.
|
|
#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;Последний раз редактировалось 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) стоило бы и выделить красным. |