Что не так в этом коде?
История вопроса:
Данный код представляет собой функцию в DLL-плагине. Функции на вход передаётся имя файла, она должна сконвертировать его из формата плагина в общеизвестный стандартный формат и вернуть имя нового файла. Или пустую строчку, если этого сделать не удалось.
В данном случае вместо прямой конвертации используется конвертация в два шага. Дело в том, что имеется отдельная программка конвертер из нескольких известных ей форматов в желаемый формат. Поэтому сперва файл конвертируется в промежуточный формат, понятный конвертеру, затем запускается конвертер и конвертирует промежуточный файл в нужный формат.
Код:
var
Converter: String; // полное имя exe-файла конвертора. Настройка, глобальная переменная.
// .... какой-то код
// Экспортируемая из плагина функция
function OnPreviewPostProcess(const AFileName: WideString; const AModel: Pointer; AReserved: Pointer): WideString; stdcall;
var
SI: TStartupInfo;
PI: TProcessInformation;
SrcFile: String;
// .... другие переменные
begin
Result := AFileName;
try
// .... Конвертация в промежуточный формат. Временный файл сохранён в SrcFile.
if not FileExists(SrcFile) then
raise Exception.Create('Файл предпросмотра "' + SrcFile + '" не найден');
if (Converter <> '') and FileExists(Converter) then
begin
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);
SI.dwFlags := STARTF_FORCEOFFFEEDBACK;
FillChar(PI, SizeOf(PI), 0);
if not CreateProcess(PChar(Converter), PChar('"' + Converter + '" "' + SrcFile + '" "' + Result + '" /storefile'), nil, nil, False, 0, nil, nil, SI, PI) then
RaiseLastOSError;
// .... Обработка завершения процесса
end;
if not FileExists(Result) then
Result := '';
except
// .... Обработка исключения
end;
end;
Данный код является нерабочим. Ваша задача - объяснить почему, какие косяки в нём есть. Может это и простая задача, когда проблемный кусок кода выделен и перед глазами, но я потратил 15 минут времени на поиск причины, причём в совершенно ошалелом состоянии (поясню почему, когда буду писать ответ на задачу).
Ответ на задачку будет выложен где-то через месяц.
ну а что понимать под нерабочий? первое, что в глаза бросается - это то, что в случае исключения Result не станет пустой строкой. вот так вот дописать
ОтветитьУдалитьexcept
Result := '';
// .... Обработка исключения
end;
или еще что-то есть?
хы. Уж год прошел, а ответ так и не написали)
ОтветитьУдалитьЕсли это компилируется на юникод-версии дельфей, то проблема скорее всего с AV при вызове креатпроцесс. Так как ео эникод версия может изменить переменную переданую как командную строку.
ОтветитьУдалить