2012-09-28 18 views
17

以下のコードでは文書を開けません。エラー193が発生します(%1は有効なWin32アプリケーションではありません)。実行ファイルを起動すると正常に動作します。 ファイルは適切に関連付けられており、ダブルクリックすると対応するアプリが起動します。 私は、コマンドラインを引用について知っているエラーメッセージ、のCreateProcessものなど(例:Why is CreateProcess failing in Windows Server 2003 64-bit? 用SOおよび他の場所で検索しました。CreateProcessでエラー193が発生するのはなぜですか(%1は有効なWin32アプリケーションではありません)

  • これはデルファイXE2(Win7の64ビット版での更新4)のWin32アプリVMWareのVM。

    コードは、ホストマシン上で失敗し
  • (Win7の64ビット)および32ビットのXPで仮想PC VMインチ

  • Win7のVM(エクセル2003とクリムゾンで開始する必要がありますアプリをエディタ)は32ビットです

  • 障害が発生し、両方のIDEから起動するときや、テストアプリは

  • それはDelphi2007コード、このコードはどこにでも罰金作品から来てコンパイルD2007アプリを使用するスタンドアロン実行している場合。

コードには何が問題なのですか?それは私が....非常に明白な何かを見下ろすよほとんどかのようだ、事前に

おかげで、

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; 
+0

を使うのか? – BugFinder

+9

私はDelphiに慣れていませんが、WINAPIの 'CreateProcess()'を使って '.exe'のみを起動することができます。他の種類のファイルを_run_したい場合は、['ShellExecute()'](http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx)を使用する必要があります。 )。 – hmjd

+0

@hjmdそのコードは以前のコードバージョンで動作し、.XLSファイルを呼び出していました。 –

答えて

23

そのエラーの最も可能性の高い説明は以下のとおりです。

  1. ロードしようとしているファイルは実行可能ファイルではありません。 CreateProcessには、実行可能ファイルを提供する必要があります。関連するアプリケーションでファイルを開くには、CreateProcessではなくShellExecuteが必要です。
  2. 実行ファイルの依存関係の1つ、つまり実行可能ファイルにリンクされているDLLを読み込む際に問題があります。その最も一般的な理由は、32ビットの実行可能ファイルと64ビットのDLLの間の不一致、あるいはその逆です。調べるには、Dependency Walker'sプロファイルモードを使用して、何がうまくいかないかを正確に確認してください。ダウンコードの下に読ん

、私はこの問題は、あなたのButton2ClickButton3Click機能がklad.xlssmimime.txtを渡す番号1

+1

O私の良さ。私たちはD2007からXE2へのコードを書き直しています。このプロセスでは、ShellExecuteを使用するサードパーティのLauncherコンポーネントを投棄し、実行可能ファイルのみに適した独自のLauncherコンポーネントに置き換えてCreateProcessを使用しました。どのように混乱することができます。申し訳ありません。 –

+1

#2ビット私は昨日です。 Delphiは32ビットのBPLと64ビットのBPLパスを同じグローバルパスに追加するので、DLLの名前は異なるはずです。この質問はそれ自身で役に立ちます。それを保つ。 –

+0

フルパスを指定しない限り、32ビットと64ビットのDLLで同じ名前を使用するには2通りしかありません。それらはsystem32に置かれていますが、MSだけがそれを行うことを意図しているか、実行可能ファイルと同じディレクトリにあります。 –

6

であることがわかります。これらのファイルは実際には実際の実行ファイルではありません。

それらに関連付けられているアプリケーションを使用して任意のファイルを開くためには、あなたが特にテキストファイルにメモ帳を呼び出した場合、最後の1と言うために何が起こるShellExecute

+1

私は控えめな表現が大好きです! :) –

関連する問題