2013-02-07 39 views
7

मैं जो एक साझा स्मृति क्षेत्र CreateFileMapping के साथ परिभाषित है एक आवेदन पत्र है और मैं किसी अन्य अनुप्रयोग से कि स्मृति को पढ़ने के लिए कोशिश कर रहा हूँ।CreateFileMapping वापसी क्यों "फ़ाइल पहले से मौजूद है"?

मैं इस कोशिश की:

handle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 
      0,$3200, pchar('FileMappingZone')); 

लेकिन मैं मिलता है:

जब कि फ़ाइल पहले से मौजूद

क्या समस्या हो सकती है एक फ़ाइल बनाने नहीं कर सकते?

+2

अपने आवरण के आसपास WINAPI कॉल जाँच 'GetLastError' बिना शर्त प्रत्येक कॉल के बाद करता है? 'CreateFileMapping' के लिए' EROR_ALREADY_EXISTS' 'लौटने के लिए निम्नलिखित' GetLastError' 'के लिए वैध हैंडल ** और ** वापस करने के लिए अपेक्षित है (जो वास्तव में एक त्रुटि नहीं है यदि आप अपेक्षा करते हैं)। –

+0

मैं सिर्फ CreateFileMapping पर कॉल के बाद GetLastError कहते हैं, अगर मैं उस फ़ाइल मानचित्रण पैदा कर दी है इससे पहले कि यह कहना है अनुप्रयोग बंद: @ opc0de कि ऐसा मत करो ऑपरेशन succesefully – opc0de

+0

पूरा किया। जब दस्तावेज ऐसा करने के लिए कहता है तो केवल 'GetLastError' को कॉल करें। और वह तब होता है जब 'CreateFileMapping' 'NULL' देता है। –

उत्तर

15

नहीं सब कुछ जो गैर सफलता के लिए GetLastError() मूल्य सेट एक त्रुटि है। यह पहली बार त्रुटियों फ़ंक्शन द्वारा दिया गया मान द्वारा भेद, और GetLastError() जांच त्रुटि कि क्या हुआ की तरह के बारे में अधिक जानकारी प्राप्त करने के लिए महत्वपूर्ण है।

मैपिंग कि पहले से ही मौजूद लिए, CreateFileMapping एक वैध संभाल वापस जाने के लिए औरERROR_ALREADY_EXISTS को GetLastError() मान सेट करने से प्रलेखित है। इस मामले में, त्रुटि मान सूचना के है: यह यह जांच करने के लिए यदि आप रुचि रखते हैं कि क्या मानचित्रण इससे पहले कि आप इसे खोला मौजूदा किया गया था रहे हैं वैध है, लेकिन यह एक त्रुटि नहीं है। NULL होने के लिए वापसी मान का परीक्षण करके आप विफलता का पता लगाते हैं। अन्यथा आप आगे बढ़ें और हैंडल का उपयोग करें।

पीएस यदि आप यह सुनिश्चित करना चाहते हैं कि अनुभाग खोलने से पहले मौजूद है, तो आप OpenFileMapping का उपयोग कर सकते हैं जो एक नया निर्माण करने के बजाय गैर-मौजूदा अनुभागों में विफल हो जाएगा।

+0

इस मामले में, साझाकरण ऐप डेटा साझा करने के लिए 'CreateFileMapping() 'को कॉल करेगा और रीडिंग ऐप को साझा डेटा पढ़ने के लिए' CreateFileMapping()' के बजाय 'OpenFileMapping() 'का उपयोग करना चाहिए। यदि 'OpenFileMapping()' विफल रहता है तो साझाकरण ऐप किसी भी डेटा को साझा नहीं कर रहा है (जब तक कोई अन्य त्रुटि न हो, जैसे रीडिंग ऐप को साझाकरण ऐप के मैपिंग तक पहुंचने की अनुमति नहीं है)। मेरे पास रीडिंग ऐप मैपिंग नहीं बनायेगा यदि यह पहले से मौजूद नहीं है, जब तक कि वह अपने डेटा को साझा नहीं करना चाहता। –

+0

मेरे पास एक रीडिंग ऐप मैपिंग बना देगा यदि मैं चाहता हूं कि वे किसी भी क्रम में शुरू करने में सक्षम हों (और संभव दौड़ के साथ प्रतीक्षा/पुनः प्रयास न करें), जो कभी-कभी महत्वपूर्ण होता है। ओपी का उदाहरण फाइल मैपिंग के लिए एक आकार प्रदान करता है, इसलिए वह स्पष्ट रूप से जानता है कि निर्णय लेने के लिए पर्याप्त रूप से अन्य एप्लिकेशन पर्याप्त है। –