2012-09-28 98 views
17

Aşağıdaki kod, belgeleri başlatılamıyor. 193 hatası alıyorum (% 1 geçerli bir Win32 uygulaması değil). Çalıştırılabilir başlatılıyor iyi çalışıyor. Dosyalar düzgün bir şekilde ilişkilendirilmiş, çift tıklandığında karşılık gelen uygulamayı başlatırlar. Ben komut satırını alıntı hakkında bilmek hata mesajı, CreateProcess şeyler vb (Örn Why is CreateProcess failing in Windows Server 2003 64-bit? için SO ve başka yerlerde aradık.Neden CreateProcess 193 hatası veriyor (% 1 geçerli bir Win32 uygulaması değil)

  • Bu bir Delphi XE2 (a Win7 64 bit Güncelleme 4) Win32 uygulaması VMWare VM.

    kodu da ana makinede başarısız
  • (Win7 64 bit) ve 32 bit XP ile bir sanal PC VM içinde.

  • Win7 VM (Excel 2003 ve Crimson başlamalıdır uygulamalar Editör) 32 bit

  • hata oluşursa hem IDE başlatırken veya test uygulaması

  • O Delphi2007 kodunu bu kod her yerde ince işler gelir derlenmiş D2007 uygulamasını eskiden standalone çalıştırırken.

Kodun nesi var? 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; 
+0

kullanmak için

? – BugFinder

+9

Ben Delphi aşina değilim, ancak WINAPI 'CreateProcess()' sadece 'exe's başlatmak için kullanılabilir. Diğer dosya türlerini _run_ istiyorsanız, ['ShellExecute()'] 'ı kullanmanız gerekir (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153 (v = vs.85) .aspx). – hmjd

+0

@hjmd Bu kod, önceki kod sürümünde, .XLS dosyalarını çağırarak çalışırdı. –

cevap

23

.... önceden

Teşekkür,

çok belirgin bir şey bakan ediyorum neredeyse sanki o hatanın en olası açıklamalar verilmiştir:

  1. Yüklemeye çalıştığınız dosya yürütülebilir bir dosya değil. CreateProcess, yürütülebilir bir dosya sağlamanızı gerektirir. Herhangi bir dosyayı ilişkili uygulamasıyla açabilmek isterseniz, CreateProcess yerine ShellExecute'a ihtiyacınız vardır.
  2. Yürütülebilir dosyanın bağımlılıkları, yani yürütülebilir dosyaya bağlı DLL'lerden biri yüklenirken bir sorun var. Bunun en yaygın nedeni, 32 bitlik bir yürütülebilir dosya ve 64 bit DLL arasındaki bir uyumsuzluk veya tersi. Araştırmak için, tam olarak neyin yanlış gittiğini kontrol etmek için Dependency Walker's profil modunu kullanın. kodun dibine Okuma

, ben sorun senin Button2Click ve Button3Click fonksiyonları klad.xls ve smimime.txt geçmesi 1 numaralı

+1

Aman Tanrım. Kodumuzu D2007'den XE2'ye ve bazı dış kütüphanelerle uzaklaşma sürecine yeniden yazıyoruz. Bu süreçte, ShellExecute kullanan bir üçüncü taraf 'Launcher' bileşenini attık ve sadece çalıştırılabilir için uygun olan ve CreateProcess'i kullanan kendi 'Launcher' bileşenimizle değiştirdik. Ne kadar kafa karıştırıcı olabilir. Üzgünüm beyler. –

+1

# 2 dün beni ısırdı. Delphi, aynı global yola hem 32 bit BPL hem de 64 bit BPL yollarını ekler, bu yüzden DLL isimleri farklılık göstermeli, dün öğrendim, bazı acılardan sonra. Bu soru kendi başına faydalıdır. Sakla. –

+0

Tam yollar belirtmedikçe, 32 ve 64 bit DLL'lerin aynı adı kullanabilmesinin yalnızca iki yolu vardır. Onlar system32'ye yerleştirilirler, ancak sadece MS bunu yapmak içindir ya da yürütülebilir dosya ile aynı direkte yaşıyorlar. –

6

olduğunu görebilirsiniz. Bu dosyalar büyük olasılıkla gerçek yürütücüler değildir. , Bunlarla ilişkili uygulamayı kullanarak keyfi dosyaları açmak Özellikle metin dosyasını not defteri çağırırsanız sonuncusu söylemek için ne olur ShellExecute

+1

Anlatımları seviyorum! :) –

İlgili konular