2009-02-06 11 views
8

इस सी एपीआई घोषणा को देखते हुए इसे सी # में कैसे आयात किया जाएगा?सी # में शून्य * सी एपीआई कैसे आयात करें?

int _stdcall z4ctyget(CITY_REC *, void *); 

मैं इतनी दूर प्राप्त करने में सक्षम किया गया है:

[DllImport(@"zip4_w32.dll", 
     CallingConvention = CallingConvention.StdCall, 
     EntryPoint = "z4ctygetSTD", 
     ExactSpelling = false)] 
    private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr); 

स्वाभाविक सी # में "शून्य *" संकलन नहीं है।

कुछ गूगलिंग इंगित करता है कि इसे "ऑब्जेक्ट" के रूप में अनुवादित किया जाना चाहिए। ऐसा लगता है कि इसे काम करना चाहिए। लेकिन अन्य संकेत देते हैं कि "शून्य * को सी/सी ++ शर्तों में फ़ंक्शन पॉइंटर कहा जाता है, जिसमें सी # शब्द एक प्रतिनिधि होता है"। यह यहां पूरी तरह से समझ में नहीं आता है कि यह किसके लिए प्रतिनिधि होगा? गूगलिंग के माध्यम से पाए गए अन्य एपीआई के लिए कुछ समान कॉल संबंधित एपीआई में अन्य कार्यों का उपयोग करते हैं। लेकिन इस एपीआई में कोई अन्य कॉल समझ में नहीं आएगा।

z4ctyget(&city, “00000”); 

पता चलता है कि यहां तक ​​कि एक स्थिर मान भी भेजी जा सकती लगता है कौन सा:

कॉल के लिए प्रलेखन एक उदाहरण दिखाता है।

यह शून्य * के स्थान पर ऑब्जेक्ट के साथ संकलित करेगा। मुझे नहीं पता कि यह सही है या नहीं और मुझे इसका परीक्षण करने का मौका नहीं मिला है (लाइसेंस जारी करना)।

+0

मेरा अनुमान है IntPtr –

+0

है क्या आप सूचक के साथ क्या करना एक बार आप इसे मिल गया है करना चाहते हैं? मुझे लगता है कि आपको CITY_REC संरचना की आवश्यकता है, और आप 'पीटीआर' को अनदेखा करना चाहते हैं? –

+0

@Erik - ठीक है, मुझे यकीन नहीं है। उपलब्ध दस्तावेज परम के उद्देश्य पर स्पष्ट नहीं है। –

उत्तर

13

शून्य के लिए * पैरामीटर तुम सिर्फ एक IntPtr

[DllImport(@"zip4_w32.dll", 
     CallingConvention = CallingConvention.StdCall, 
     EntryPoint = "z4ctygetSTD", 
     ExactSpelling = false)] 
    private extern static int z4ctygetSTD(ref CITY_REC args, IntPtr ptr); 
+0

डार आप जेरेड, 30 सेकंड! आप सीधे बिल्ली के लिए डर्न! - = पी –

+0

@Erick :) आज कुछ त्वरित ड्रॉ जीत चुके हैं – JaredPar

1

उपयोग कर सकते हैं तुम भी शून्य * उपयोग कर सकते हैं अगर आप असुरक्षित के रूप में अपनी कक्षा में चिह्नित करें।

यह वास्तव में इस पैरामीटर में एपीआई की तलाश में निर्भर करता है।

आप पिछले कंपाइलर प्राप्त करने के लिए IntPtr या ऑब्जेक्ट * जोड़ सकते हैं, लेकिन जब भी आप इसे कॉल करते हैं तो आपको इसे सही डेटा पास करने की आवश्यकता होगी।

0

जहां तक ​​मेरा z4ctyget की सी घोषणा बता सकते है:

int z4ctyget(CITY_REC *cityrec, char *zipcode); 

दूसरा पैरामीटर एक 5 चरित्र एएनएसआई जिप कोड, जिस पर आप अपने खोज या "00000" शुरू करना चाहते का प्रतिनिधित्व स्ट्रिंग है फ़ाइल की शुरुआत में शुरू करें। तो अपने घोषणा किया जाना चाहिए:

[DllImport(@"zip4_w32.dll", CharSet = CharSet.Ansi)] 
private extern static int z4ctygetSTD(ref CITY_REC args, string zipcode); 
+0

सी घोषणा जो मैंने दिखाया वह सीधे यूएसपीएस द्वारा प्रदान की गई .h फ़ाइल से खींचा गया था। –

+0

2007 से प्रलेखन मेरी घोषणा दिखाता है। किसी भी मामले में, "00000" उदाहरण से पता चलता है कि अपेक्षित इनपुट एक स्ट्रिंग है (लगभग निश्चित रूप से एएनएसआई)। तो मेरी सी # घोषणा वह होनी चाहिए जो आप खोज रहे हैं। –

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