2010-08-30 15 views
9

मैं सी # में this जैसे कुछ करने की कोशिश कर रहा हूं। मुझे पता चला कि P/Invoke from this link का उपयोग कर सी # से Win32 विधियों को कैसे कॉल करें। हालांकि मैं पी/Invoke लागू करने में कुछ कठिनाइयों से मुलाकात की।पी/Invoke का उपयोग करते समय Win32 प्रकार से C# प्रकारों को कैसे मानचित्र करें?

उदाहरण के लिए, तरीकों कि मैं का उपयोग करना चाहते हैं में से एक, PdhOpenQuery है हस्ताक्षर:

PDH_STATUS PdhOpenQuery(
    __in LPCTSTR szDataSource, 
    __in DWORD_PTR dwUserData, 
    __out PDH_HQUERY *phQuery 
); 

मैं समझ इसी सी # घोषणा इस

[DllImport("Pdh.dll")] 
    static extern PDH_STATUS PdhOpenQuery(LPCTSTR szDataSource, 
     DWORD_PTR dwUserData, out PDH_HQUERY *phQuery); 

मेरे सवालों की तरह कुछ किया जाना चाहिए :

एलपीसीटीआरटी क्या है, और सी # में किस डेटा प्रकार का मानचित्र है?
एक सूचक प्रकार DWORD_PTR कैसे मानचित्र करें? पिनवोक आलेख बताता है कि DWORD नक्शे UInt32 पर है, लेकिन पॉइंटर्स के बारे में कैसे?
मुझे लगता है कि पीडीएच_STATUS और PDH_HQUERY पुस्तकालय के लिए विशिष्ट संरचना हैं (मुझे अभी तक यकीन नहीं है)। मैं इन्हें कैसे मैप करूं?

सही विधि घोषणा क्या है, और आप इसे सही तरीके से कैसे कॉल करते हैं?

उत्तर

17

एलपीसीटीआरटी क्या है, और किस डेटा प्रकार पर यह सी # में मानचित्र करता है?

LPCTSTRconst TCHAR* के लिए एक टाइपपीफ है।

TCHAR तथ्य यह है कि Windows API दोनों "एएनएसआई" में मौजूद है सार करने की कोशिश दूर (एक भाषा-विशिष्ट एन्कोडिंग में char तार) और "यूनिकोड" (UTF-16) संस्करणों है। कोई वास्तविक PdhOpenQuery फ़ंक्शन नहीं है; एक PdhOpenQueryA फ़ंक्शन है जो एक एएनएसआई स्ट्रिंग और PdhOpenQueryW फ़ंक्शन लेता है जो यूटीएफ -16 स्ट्रिंग लेता है।

सी # यूटीएफ -16 स्ट्रिंग का उपयोग करता है, इसलिए आप इन कार्यों के "डब्ल्यू" संस्करण को प्राथमिकता देना चाहेंगे। PdhOpenQueryW का उपयोग करें। फिर पहले पैरामीटर में सी ++ प्रकार const wchar_t* है।सी # प्रकार [MarshalAs(UnmanagedType.LPWStr)] string है।

एक सूचक प्रकार DWORD_PTR कैसे मानचित्र करें? पिनवोक आलेख कहता है कि DWORD नक्शे UInt32 पर है, लेकिन पॉइंटर्स के बारे में कैसे?

DWORD_PTR कोई सूचक नहीं है। यह एक हस्ताक्षर पूर्णांकपर पर्याप्त एक सूचक है। समकक्ष सी # प्रकार System.UIntPtr है।

मुझे लगता है कि PDH_STATUS और PDH_HQUERY पुस्तकालय के लिए विशिष्ट struct कर रहे हैं (मैं अभी तक यकीन नहीं है)। मैं इन्हें कैसे मैप करूं?

PDH_STATUS केवल int प्रतीत होता है।

PDH_HQUERY एक हैंडल (एक और सूचक) के लिए एक सूचक है, लेकिन आप इसे केवल एक पूर्णांक दिखा सकते हैं और IntPtr का उपयोग कर सकते हैं।

यह सब एक साथ रखें, अपने घोषणा किया जाना चाहिए:

[DllImport("Pdh.dll")] 
static extern int PdhOpenQueryW(
    [MarshalAs(UnmanagedType.LPWStr)] string szDataSource, 
    UIntPtr dwUserData, 
    out IntPtr phQuery); 
+0

सुधार: 'UIntPtr'' UIntPtr dwUserData' होना चाहिए? एक और सवाल, एक विधि को कैसे कॉल करना चाहिए? –

+0

क्या वैसे भी एलपीसीटीआरटी इंटप्राट पर मैप कर सकता है? SHGetFileInfo API (ref: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762179%28v=vs.85%29.aspx) "_In_ LPCTSTR pszPath" का पहला param है, और सबसे अधिक जब तक मैं इसे "स्ट्रिंग" के रूप में उपयोग करने वाले लोगों को देखता हूं। लेकिन एक उदाहरण में मैंने पाया कि मुझे लगता है कि किसी ने इसे इंटिप्टर के रूप में इस्तेमाल किया है ..? (रेफरी: http://stackoverflow.com/a/14293350/1039753) –

+0

@ArvoBowen: हां, आप पैरामीटर को 'IntPtr' के रूप में घोषित कर सकते हैं और फिर' सिस्टम में 'PtrToStringAnsi' या' PtrToStringUni' फ़ंक्शंस 'का उपयोग कर सकते हैं। रनटाइम .teropServices.Marshal' वर्ग स्ट्रिंग के लिए। – dan04

0
 
[DllImport("Pdh.dll")] 
    static extern Int32 PdhOpenQuery(string szDataSource, 
     IntPtr dwUserData, ref IntPtr phQuery); 
+0

यह अभी भी संकलन नहीं करेगा क्योंकि PDH_STATUS मान्यता प्राप्त नहीं है। क्या आप स्ट्रिंग और इंटिप्रेट क्यों समझा सकते हैं? –

+0

ओह, क्षमा करें, वापसी मूल्य IntPtr होना चाहिए। IntPtr अप्रबंधित सूचक के लिए .NET wrapper है। चूंकि हैंडल आमतौर पर पॉइंटर होता है, या कुछ संख्या जो पॉइंटर के समान आकार के होते हैं, इंटिप्टर का उपयोग हैंडल के लिए भी किया जाता है। स्ट्रिंग क्यों? खैर, क्योंकि एलपीसीटीस्ट्र एक स्ट्रिंग है। –

+0

अच्छा, वास्तव में PDH_STATUS केवल एक संख्या है, इसलिए इसे Int32 के रूप में परिभाषित करना बेहतर है। –

0

iirc LPCTSTR लिए टूट जाती है: एल.पी. == लांग सूचक // 16 को 32-बिट thunking

सी से अवशेष == लगातार

TSTR == TStr // TString, विभिन्न सी हेडर और # डिफाइन

के आधार पर विभिन्न प्रकार के तारों के लिए प्रतिस्थापन प्राप्त किया जाएगा, यह आपके लिए क्या मायने रखता है: यह एक स्ट्रिंग के लिए सूचक है, सी # केवल स्ट्रिंग का उपयोग करें और आप ठीक होंगे ।

PDH_STATUS DH_STATUS संरचना के लिए एक सूचक है, इसलिए आपको मिलान करने के लिए सी # संरचना को परिभाषित करने की आवश्यकता होगी।

मानक विंडोज हेडर, संरचनाओं और कार्यों पर पी/इनवॉक का उपयोग करने के कुछ उदाहरणों के लिए P/Invoke.Net देखें। वेबसाइट एक प्रकार का क्लंकी है, आपको बस बाएं कॉलम में आइटम क्लिक करना और विस्तार करना है।

पी/आमंत्रण अच्छी तरह से प्रलेखित नहीं है, लेकिन एक बार जब आप संरचना और बाहरी फ़ंक्शन कॉल को मैप करते हैं तो आपको व्यवसाय में होना चाहिए।

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

  • कोई संबंधित समस्या नहीं^_^