2009-09-14 8 views
7

सी # में PInvoke का उपयोग करना सीखने के प्रयास में, मुझे थोड़ा सा अनिश्चितता है कि विभिन्न मूल्यों को सरल मूल्य प्रकारों वाले पॉइंटर्स के साथ कैसे संभालना है।पॉइंटर्स शामिल होने पर P/Invoke कैसे करें

मैं एक अप्रबंधित DLL से निम्नलिखित दो कार्यों का आयात कर रहा हूँ:

public int USB4_Initialize(short* device); 
public int USB4_GetCount(short device, short encoder, unsigned long* value); 

पहले समारोह एक इनपुट, एक आउटपुट के रूप में दूसरे के रूप में सूचक का उपयोग करता है। उनके उपयोग सी में काफी सरल है ++:

// Pointer as an input 
short device = 0; // Always using device 0. 
USB4_Initialize(&device); 

// Pointer as an output 
unsigned long count; 
USB4_GetCount(0,0,&count); // count is output 

मेरे निम्नलिखित पी/में सी # परिणामों में पहला प्रयास का आह्वान:

[DllImport("USB4.dll")] 
public static extern int USB4_Initialize(IntPtr deviceCount); //short* 

[DllImport("USB4.dll")] 
public static extern int USB4_GetCount(short deviceNumber, short encoder, IntPtr value); //ulong* 

मैं कैसे के रूप में एक ही तरह से सी # में इन कार्यों का उपयोग करते हैं ऊपर + सी + कोड? क्या इन प्रकारों को घोषित करने का कोई बेहतर तरीका है, शायद MarshalAs का उपयोग कर?

+0

अरे, यूएसबी 4 पहले से ही? मैं अभी भी 3.0 –

+1

की प्रतीक्षा कर रहा हूं। इसका यूएसबी 4 के साथ कुछ लेना देना नहीं है। यह सिर्फ एक यूएसबी डिवाइस है जो कंपनी को एन्कोडर से कनेक्ट करने के लिए है, और चूंकि यह उनके उत्पाद का चौथा संशोधन है, इसलिए उन्होंने बेवकूफ उत्पाद यूएसबी 4 नाम दिया। –

उत्तर

12

सूचक एक भी आदिम प्रकार और नहीं एक सरणी है, तो इन उदाहरणों बाहर में पैरामीटर

[DllImport("USB4.dll")] 
public static extern int USB4_Initialize(ref short deviceCount); 

[DllImport("USB4.dll")] 
public static extern int USB4_GetCount(short deviceNumber, short encoder, ref uint32 value) 

वर्णन करने के लिए रेफरी/बाहर का उपयोग शायद अधिक उपयुक्त है लेकिन या तो काम करेंगे।

+0

तो गेटकाउंट() में मैं रेफरी के बजाय उपयोग कर सकता हूं? –

+0

मैं देखता हूं, यह वही है जो मैं उम्मीद कर रहा था। धन्यवाद। –

+0

हाँ एक ही बात कहने वाला था USB4_GetCount परिभाषा में बाहर निकलने के अलावा – zebrabox

0

.NET रनटाइम आपके लिए बहुत सारे रूपांतरण (जिसे "मार्शलिंग" कहा जाता है) कर सकता है। जबकि एक स्पष्ट IntPtr हमेशा आप जो कुछ भी बताते हैं, वह हमेशा करेंगे, आप संभावित रूप से ref कीवर्ड को उस पॉइंटर के लिए प्रतिस्थापित कर सकते हैं।

[DllImport("USB4.dll")] 
public static extern int USB4_Initialize(ref short deviceCount); //short* 

[DllImport("USB4.dll")] 
public static extern int USB4_GetCount(short deviceNumber, short encoder, ref short value); //ulong* 

फिर आप इस तरह से उन्हें फोन कर सकते हैं:

short count = 0; 

USB4_Initialize(ref count); 

// use the count variable now. 
संबंधित मुद्दे