2012-01-09 10 views
8

मैं एक डीएलएल से कार्यों को कॉल करने की कोशिश कर रहा हूं जो डेल्फी में बनाया जाने लगता है। DLL द्वारा समर्थित एक कुछ कार्यों का एक उदाहरण हैं:क्या पाइथन डीएलएलआई में डेल्फी कार्यों को कॉल कर सकता है?

function oziDeleteWpByName(var name:pansichar):integer;stdcall 

पायथन कोड मैं लिखा है ऊपर कार्यों काम नहीं कर रहा उपयोग करने के लिए।

from ctypes import * 
libc = cdll.OziAPI 
name ='test' 

pi = pointer(name) 

delname = libc.oziDeleteWpByName 

delname(name) 

ऐसा लगता है कि मैं फ़ंक्शन में गलत डेटा प्रकार गुजर रहा हूं। इसे सही तरीके से करने के बारे में कोई विचार?

धन्यवाद यह काम करता है। अब कृपया इस फ़ंक्शन के साथ सहायता करें:

फ़ंक्शन oziGetOziVersion (var संस्करण: pansichar; var डेटा लम्बाई: पूर्णांक): पूर्णांक; stdcall; OziExplorer का संस्करण संस्करण चर में वापस किया गया है।

अब मैं 'var संस्करण' कैसे पास करूं, जब इसे वापस किया जाएगा।

+0

'var name: pansichar' का तात्पर्य है कि' name' पैरामीटर को संशोधित किया जा सकता है और कॉलर पर वापस कर दिया जा सकता है। क्या समारोह वास्तव में ऐसा करता है? क्या आप फंक्शन रिटर्न के बाद 'name' की सामग्री को पढ़ने की योजना बना रहे हैं? –

+0

इसके अलावा, आप पाइथन का किस संस्करण का उपयोग कर रहे हैं? स्ट्रिंग एन्कोडिंग में कोई फर्क पड़ सकता है। –

+0

हाँ, कि 'var' घोषणा फिश है। यदि आप, उपयोगकर्ता 1138 ... ने लिखा कि डीएलएल, आपने ऐसा क्यों किया? –

उत्तर

1

डेल्फी में, var पैरामीटर संदर्भ द्वारा पारित किया गया है। तो आपके पास PAnsiChar (उर्फ सी-स्टाइल स्ट्रिंग पॉइंटर) के लिए पॉइंटर है। यदि आप एक स्ट्रिंग पॉइंटर को पॉइंटर के बजाय स्ट्रिंग पॉइंटर पास कर रहे हैं, तो यह काम नहीं करेगा।

+0

मैं उस पायथन कोड में कुछ भी नहीं देखता जो आपको सुझाव देता है कि आप 'stdcall' कॉलिंग सम्मेलन निर्दिष्ट कर रहे हैं। पाइथन में 'cdcl' को 'cdecl'' में डिफ़ॉल्ट नहीं है? यदि ऐसा है, तो इससे आपको समस्याएं भी मिलेंगी! – LaKraven

+0

मुझे पूरा यकीन है कि आप किसी भी डीएल के माध्यम से जो कुछ भी कहते हैं और जिसे अजगर रनटाइम लाइब्रेरी लोड करता है और आमंत्रित करता है, हमेशा विंडोज मानक कॉलिंग सम्मेलनों का उपयोग करेगा। –

+2

@ वॉरेन नो, लाक्रैवन सही है। 'cdll' बनाम' windll' कॉलिंग सम्मेलनों को निर्दिष्ट करने का तरीका है। इसके अलावा, कम से कम x86 पर सम्मेलन को कॉल करने के लिए कोई विंडोज मानक नहीं है। कुछ पुस्तकालय 'stdcall' का उपयोग करते हैं और कुछ' cdecl' का उपयोग करते हैं। उदाहरण के लिए msvcrt के बारे में सोचो। यह सब 'cdecl' है। –

11
from ctypes import * 

# Not strictly needed but it's good to be explicit. 
windll.OziAPI.oziDeleteWpByName.argtypes = [POINTER(c_char_p)] 
windll.OziAPI.oziDeleteWpByName.restype = c_int 

p = c_char_p('test') 
retval = windll.OziAPI.oziDeleteWpByName(byref(p)) 
+0

अच्छा बिंदु। फिक्स्ड। – yak

+0

'argtypes' और' restype' के साथ अपडेट किया गया। – yak

+0

अच्छा, अब आप मेरा अपवोट प्राप्त कर चुके हैं –

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