Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does CreateProcess give error 193 (%1 is not a valid Win32 app)

The code below fails to start documents. I get error 193 (%1 is not a valid Win32 app). Starting executables work fine. The files are properly associated, they start the corresponding app when double clicked. I have searched SO and elsewhere for the error message, createprocess stuff etc. (E.g. Why is CreateProcess failing in Windows Server 2003 64-bit? I know about quoting the command line.

  • This is a Delphi XE2 (Update 4) Win32 app in a Win7 64bit VMWare VM.

  • The code also fails on the host machine (Win7 64 bit) and in a Virtual PC VM with 32bit XP.

  • The apps that should start in the Win7 VM (Excel 2003 and Crimson Editor) are 32 bit.

  • The failure occurs both when starting from the IDE or when running the test app standalone

  • It used to be Delphi2007 code, the compiled D2007 app where this code comes from works fine everywhere.

What's wrong with the code? It's almost as if I'm overlooking something very obvious....

Thanks in advance,

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/questions/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; 
like image 780
Jan Doggen Avatar asked Sep 28 '12 09:09

Jan Doggen


People also ask

How do I fix error 193 1 is not a valid Win32 application?

Resolving The Problem This issue can occur if a file or folder with name 'Program' exists on the same drive where the Cognos products are installed.To resolve this, either rename the file/folder or delete it. Confirm that the path to ppserver.exe is correct.

Is not a valid Win32 application error code 193?

Error 193: %1 is not a valid Win32 application." This issue may occur if the path of the executable file for the service contains spaces. When Windows starts a service, it parses the path of the service from left to right.

What is 1 is not a valid Win32 application?

In most cases, the “1 is not a valid Win32 application” occurs due to the incompatibility between the Windows version/type and program. Please make sure you have downloaded the right version of the installer file. Press Windows key + R to call out the Run box.


1 Answers

The most likely explanations for that error are:

  1. The file you are attempting to load is not an executable file. CreateProcess requires you to provide an executable file. If you wish to be able to open any file with its associated application then you need ShellExecute rather than CreateProcess.
  2. There is a problem loading one of the dependencies of the executable, i.e. the DLLs that are linked to the executable. The most common reason for that is a mismatch between a 32 bit executable and a 64 bit DLL, or vice versa. To investigate, use Dependency Walker's profile mode to check exactly what is going wrong.

Reading down to the bottom of the code, I can see that the problem is number 1.

like image 124
David Heffernan Avatar answered Sep 21 '22 15:09

David Heffernan