2012-02-08 11 views
6

पर सीटीपीएस के माध्यम से एक सी लाइब्रेरी फ़ंक्शन में फ़ाइल डिस्क्रिप्टर पास करने के लिए मैं सीटीपीएस के माध्यम से एक फ़ाइल डिस्क्रिप्टर पास करने की कोशिश कर रहा हूं, सी समारोह में जहां एफडी पर लिखते हैं। लिनक्स पर यह काम करता है। खिड़कियों पर ऐसा नहीं होता है और मुझे समझ नहीं आता क्यों (मैं खिड़कियों पर एक डेवलपर के रूप कोई अनुभव नहीं है)विंडोज

//C func signature: 
void fun(struct bah *opaque, int fd) 

अजगर से (विवरण ommited) है:

mylib.fun.argtypes = [POINTER(bah), c_int] 
fh = open(filename,'wb') 
#doesn't work on windows, works on linux/unix 
mylib.fun(some_ctypes_struct, fh.fileno()) 
#doesn't work on windows 
mylib.fun(bah_struct, ctypes.cdll.msvcrt._open(filename,_O_FLAGS_MASK, ACCMASK) 
#doesn't work 
mylib.fun(bah_struct, os.open(...)) 

कार्यक्रम लिखने पर मर जाता है () रों एक असफल अभिकथन _osfile साथ (एफ एच) & fopen

cl.exe: x86 के लिए 16.00.40219.01 अजगर 2.7.2 एमएससी v.1500 32 बिट

हो क्या मुझे यह करना है? नहीं, मैं lib को ओपन() को ऑफ़लोड नहीं करना चाहता हूं। मैं पहले से ही एक खुले फ़ाइल डिस्क्रिप्टर को एक सुरक्षित तरीके से प्लेटफॉर्म स्वतंत्र करना चाहता हूं।


में अतिरिक्त जानकारी के लिए, बस के मामले में: पुस्तकालय tinycdb है, मैं इसे जल्दी से खिड़कियों के लिए एक छोटी cmake कल्पना और कुछ गंदे धब्बे के साथ getopt और dll निर्यात काम करने के लिए भेजा। पुस्तकालय और exe उपकरण अपेक्षित (परीक्षण) के रूप में काम करता है। tinycdb के लिए पायथन ctypes wrappers के रूप में लिनक्स पर काम करता है। खिड़कियां मुझे आँखों देता है। वह स्वीकार नहीं करेगा कि एफडी एक वैध वर्णनकर्ता है, भले ही मैं इसे अपने स्वयं के (एमएसवीसीआरटी) _open libcall के साथ खोलने के बाद इसे पास कर रहा हूं।


बेशक, सब कुछ काम करता है अगर मैं() आईएनजी/बंद() पुस्तकालय के भीतर फ़ाइल ing खुला रहा हूँ, लेकिन मैं एपीआई बदलने के लिए खर्च नहीं उठा सकते।

+1

क्या सी सी लाइब्रेरी (msvcrt) दोनों पायथन और आपके डीएलएल द्वारा उपयोग किया जा रहा है? (http://www.dependencywalker.com/ जांचने का एक तरीका है।) – jdigital

उत्तर

4

विंडोज़ यूनिक्स की तरह फ़ाइल विवरणों का उपयोग नहीं करता है, इसलिए मैं अनुमान लगा रहा हूं कि फाइल डिस्क्रिप्टर सी रनटाइम द्वारा अनुकरण किए जाते हैं। यदि आप दो अलग-अलग सी रनटाइम्स का उपयोग कर रहे हैं (उदाहरण के लिए, यदि आपका EXE और DLL अलग-अलग कंपाइलर्स द्वारा संकलित किया गया है, या एक ही कंपाइलर के साथ लेकिन विभिन्न विकल्पों के साथ), तो प्रत्येक रनटाइम का अपना "फ़ाइल डिस्क्रिप्टर इम्यूलेशन" होगा और आप ' एक से दूसरे से एक वर्णक पास टी।

+0

पायथन 9.0 के साथ संकलित प्रतीत होता है, मेरा डीएल 10.0 का उपयोग करता है। हालांकि, मैं अभी भी ओएस फाइल हैंडल और सी रनटाइम फ़ाइल डिस्क्रिप्टर को विभिन्न जानवरों के रूप में पच रहा हूं। या तो मैं एक साथ 9.0 और 10.0 रनटाइम्स का उपयोग कर रहा हूं, क्या मेरे एफडी "एमुलेटर" मानचित्र को एक ही ओएस फ़ाइल हैंडल में नहीं होना चाहिए? – user237419

+0

या यह है कि प्रत्येक रनटाइम में ओएस फाइल हैंडल के लिए एफडीएस मैपिंग की अपनी "डिस्क्रिप्टर टेबल" है? इस मामले में त्रुटि समझ में आएगी क्योंकि मेरा एफडी crt90 की तालिका में है और मैं इसे crt10 की तालिका में खोज रहा हूं। क्या यह काम करता है? धन्यवाद jdigital! – user237419

+0

मुझे लगता है कि आपने पहले से ही मेरे प्रश्न का उत्तर दिया है लेकिन "परिकल्पना" सजावटी मुझे और अधिक क्षमा करने के लिए कहता है। – user237419