Подтвердить что ты не робот

Почему CreateProcess дает ошибку 193 (% 1 не является допустимым приложением Win32)

В приведенном ниже коде не удается запустить документы. Я получаю ошибку 193 (% 1 не является допустимым приложением Win32). Запуск исполняемых файлов отлично работает. Файлы правильно связаны, они запускают соответствующее приложение при двойном щелчке. Я искал SO и в других местах для сообщения об ошибке, создания материала процесса и т.д. (Например, Почему сбой в CreateProcess в 64-разрядной версии Windows Server 2003? Я знаю о цитировании командной строки.

  • Это приложение Win32 для Delphi XE2 (обновление 4) в виртуальной VMWare Win7 64-бит.

  • Код также терпит неудачу на главном компьютере (бит Win7 64 бит) и в виртуальной виртуальной машине ПК с 32-разрядным XP.

  • Приложения, которые должны запускаться в Win7 VM (Excel 2003 и Crimson Editor), являются 32-разрядными.

  • Сбой происходит как при запуске с IDE, так и при автономном выполнении тестового приложения

  • Раньше это был код Delphi2007, скомпилированное приложение D2007, в котором этот код исходит из работы отлично.

Что не так с кодом? Это почти так, как будто я пропускаю что-то очень очевидное....

Спасибо заранее,

Jan

procedure StartProcess(WorkDir, Filename: string; Arguments : string = '');
var
  StartupInfo  : TStartupInfo;
  ProcessInfo  : TProcessInformation;
  lCmd         : string;
  lOK          : Boolean;
  LastErrorCode: Integer;
begin
  FillChar( StartupInfo, SizeOf( TStartupInfo ), 0 );
  StartupInfo.cb := SizeOf( TStartupInfo );
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := sw_Normal;

  FillChar( ProcessInfo, SizeOf( TProcessInformation ), 0 );

  lCmd := '"' +  WorkDir + FileName + '"';     // Quotes are needed https://stackoverflow.com/info/265650/paths-and-createprocess
  if Arguments <> '' then lCmd := lCmd + ' ' + Arguments;

  lOk := CreateProcess(nil,
                       PChar(lCmd),
                       nil,
                       nil,
                       FALSE,  // TRUE makes no difference
                       0,      // e.g. CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS makes no difference
                       nil,
                       nil,    // PChar(WorkDir) makes no difference
                       StartupInfo,
                       ProcessInfo);

  if lOk then
  begin
    try
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    finally
      CloseHandle( ProcessInfo.hThread );
      CloseHandle( ProcessInfo.hProcess );
    end;
  end
  else
  begin
    LastErrorCode := GetLastError;
    ShowMessage(IntToStr(LastErrorCode) + ': ' + SysErrorMessage(LastErrorCode));
  end;
end;

procedure TFrmStartProcess.Button1Click(Sender: TObject);
begin
   StartProcess('c:\program files (x86)\axe3\','axe.exe');    // Works
end;

procedure TFrmStartProcess.Button2Click(Sender: TObject);
begin
   StartProcess('d:\','klad.xls');                            // Fails
end;

procedure TFrmStartProcess.Button3Click(Sender: TObject);
begin
   StartProcess('d:\','smimime.txt');                         // Fails
end;
4b9b3361

Ответ 1

Наиболее вероятными объяснениями этой ошибки являются:

  • Файл, который вы пытаетесь загрузить, не является исполняемым файлом. CreateProcess требуется предоставить исполняемый файл. Если вы хотите открыть любой файл с соответствующим приложением, вам понадобится ShellExecute, а не CreateProcess.
  • Возникает проблема загрузки одной из зависимостей исполняемого файла, то есть библиотек DLL, связанных с исполняемым файлом. Наиболее распространенной причиной этого является несоответствие между 32-разрядным исполняемым и 64-разрядным DLL или наоборот. Чтобы исследовать, используйте режим профиля Dependency Walker, чтобы точно проверить, что происходит.

Считывая нижнюю часть кода, я вижу, что проблема - номер 1.

Ответ 2

Функции Button2Click и Button3Click проходят klad.xls и smimime.txt. Эти файлы скорее всего не являются фактическими исполняемыми файлами.

Чтобы открыть произвольные файлы с помощью связанного с ними приложения, используйте ShellExecute