2011-08-09 15 views
6

के तहत विफल रहता है मैं विंडोज 7 में विंडोज़ XP से विरासत कोड संकलित करने की कोशिश कर रहा हूं। यह संकलित करता है लेकिन रनटाइम पर विफल रहता है।CreateProcess विंडोज 7

CreateProcess() रिटर्न 0 और GetLastError() रिटर्न 2, जो अब विषमताएं के लिए CreateProcess

STARTUPINFO StartInfo; 
memset(&StartInfo, 0, sizeof(StartInfo)); 

wcsncpy(astrCommandLine, L"TFTP", MAX_OSCOMMANDLINE_SZ-1); 
BOOL bFuncRetn = CreateProcess(NULL, 
       astrCommandLine,  // command line 
       NULL,   // process security attributes 
       NULL,   // primary thread security attributes 
       NULL,   // handles are inherited 
       0,    // creation flags 
       NULL,   // use parent's environment 
       NULL,   // use parent's current directory 
       &StartInfo,   // STARTUPINFO pointer 
       &m_ProcInfo); // receives PROCESS_INFORMATION 

करने के लिए अपने कॉल ERROR_FILE_NOT_FOUND

के लिए खड़ा है यहाँ है: जब TFTP के बजाय मैं calc चलाने के लिए, कैल्क पॉप अप मैं कमांड प्रॉम्प्ट में कहीं से भी अपनी कमांड लाइन पर जो कुछ भी कर सकता हूं उसे निष्पादित कर सकता हूं, इसलिए यह मुझे बताता है कि% PATH% c: \ windows \ system32 को जाना जाता है और सही तरीके से काम करता है।

मैंने Ansi तारों के साथ CreateProcessA को मजबूर करने की कोशिश की लेकिन मुझे एक ही परिणाम मिला। मैंने डीबग और कॉन्फ़िगरेशन और कमांड लाइन से भी रिलीज़ करने की कोशिश की।

कोई विचार?

संपादित करें: दोनों calc.exe और tftp.exe c: \ windows \ system32 में स्थित हैं जो सिस्टम पथ में हैं।
चल रहा है "सी: \ विंडोज \ system32 \ tftp" काम नहीं करता

+0

क्या सिस्टम पथ की बजाय ऐप पथ द्वारा tftp पाया जा रहा है? यह समझा सकता है कि क्यों कैल्क पाया जाता है लेकिन tftp नहीं है। CreateProcess ऐप पथ का उपयोग नहीं करता है। मुझे लगता है कि आप कहीं भी StartInfo.cb सेट कर रहे हैं। –

+0

बहुत कम उम्मीद है कि यह काम करेगा। निश्चित रूप से tftp.exe आपके प्रोग्राम की डिफ़ॉल्ट कार्य निर्देशिका में स्थित नहीं है। Calc.exe कोई समस्या नहीं है, यह पथ पर है। .exe के * पूर्ण * पथनाम को पास करें, जैसे c: \ foo \ bar \ tfpt.exe। –

+0

मैंने StartInfo.cb – Eric

उत्तर

9

समस्या यह है कि आपके पास 64 बिट विंडोज कमांड निष्पादित करने का प्रयास करने वाला 32 बिट एप्लिकेशन है। समस्या को हल करने के लिए आपको 64 बिट के रूप में अपने एप्लिकेशन को पुन: संकलित करने की आवश्यकता नहीं है। आपको बस सी: \ windows \ system32 की सभी घटनाओं को c: \ windows \ SysNative में बदलना है।

विंडोज 7 x64 में, 32 बिट प्रोग्राम्स से c: \ windows \ system32 के संदर्भ स्वचालित रूप से c: \ windows \ syswow64 पर रीडायरेक्ट किए जाते हैं। विशेष उपनाम सी का उपयोग करना: \ windows \ SysNative विंडोज 7 को रीडायरेक्ट नहीं करने का कारण बनता है।