2012-09-28 15 views
17

नीचे दिया गया कोड दस्तावेज़ प्रारंभ करने में विफल रहता है। मुझे त्रुटि मिलती है 1 9 3 (% 1 वैध Win32 ऐप नहीं है)। निष्पादन योग्य शुरू करना ठीक काम करता है। फ़ाइलें ठीक से जुड़े हुए हैं, डबल क्लिक होने पर वे संबंधित ऐप शुरू करते हैं। मैं इतना और कहीं त्रुटि संदेश, CreateProcess सामान आदि (जैसे Why is CreateProcess failing in Windows Server 2003 64-bit? मैं कमांड लाइन के हवाले से अवगत कराने के लिए खोज की है।CreateProcess त्रुटि क्यों देता है 1 9 3 (% 1 मान्य Win32 ऐप नहीं है)

  • यह एक डेल्फी XE2 (अपडेट 4) एक Win7 64 बिट में Win32 अनुप्रयोग VMWare वी एम।

  • कोड भी मेजबान मशीन पर विफल रहता है (Win7 64 बिट) और 32 बिट XP के साथ एक वर्चुअल पीसी वी एम में।

  • क्षुधा है कि Win7 वी एम (Excel 2003 और क्रिमसन में शुरू कर देना चाहिए

    संपादक) 32 बिट हैं।

  • विफलता होता है दोनों जब आईडीई से शुरू या जब चल परीक्षण ऐप स्वसंपूर्ण

  • यह 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

मैं डेल्फी से परिचित नहीं हूं, लेकिन 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. निष्पादन योग्य की निर्भरताओं में से एक को लोड करने में समस्या है, यानी डीएलएल जो निष्पादन योग्य से जुड़े हुए हैं। इसके लिए सबसे आम कारण 32 बिट निष्पादन योग्य और 64 बिट डीएलएल, या इसके विपरीत के बीच एक मेल नहीं है। जांच करने के लिए, क्या गलत हो रहा है यह जांचने के लिए Dependency Walker's प्रोफ़ाइल मोड का उपयोग करें।

कोड के निचले भाग तक पढ़ना, मैं देख सकता हूँ कि इस समस्या नंबर 1.

+1

हे मेरी भलाई। हम डी 2007 से XE2 तक और हमारे बाहरी पुस्तकालयों से दूर होने वाली प्रक्रिया में हमारे कोड को फिर से लिख रहे हैं। उस प्रक्रिया में हमने एक तीसरे पक्ष के 'लॉन्चर' घटक को फेंक दिया जिसने शैलएक्सक्यूट का उपयोग किया, और इसे अपने 'लॉन्चर' घटक के साथ बदल दिया जो निष्पादन योग्य के लिए उपयुक्त था और इसलिए CreateProcess का उपयोग किया गया था। यह कितना भ्रमित हो सकता है। क्षमा करें दोस्तों। –

+1

# 2 मुझे कल थोड़ा सा। डेल्फी 32 बिट बीपीएल और 64 बिट बीपीएल पथ दोनों को एक ही वैश्विक पथ में जोड़ता है, इसलिए कुछ दर्द के बाद कल डीएलएल नामों को अलग करना चाहिए, मैंने कल सीखा। यह सवाल अपने आप पर उपयोगी है। इसे रखें। –

+0

जब तक आप पूर्ण पथ निर्दिष्ट नहीं करते हैं, उसी नाम का उपयोग करने के लिए 32 और 64 बिट डीएलएल के लिए केवल दो तरीके हैं। उन्हें system32 में रखा गया है, लेकिन केवल एमएस ऐसा करने के लिए हैं, या वे निष्पादन योग्य के रूप में एक ही डीआईआर में रहते हैं। –

6

आपका Button2Click और Button3Click कार्यों पारित klad.xls और smimime.txt है। ये फ़ाइलें वास्तव में वास्तविक निष्पादन योग्य नहीं हैं।

, उन लोगों के साथ संबद्ध अनुप्रयोग का उपयोग मनमाना फ़ाइलों को खोलने ShellExecute

+1

मुझे कमियों से प्यार है! :) –

संबंधित मुद्दे