कृपया मेरे साथ भालू क्योंकि मैं marshalling के लिए नया हूँ। मैं एक सी संरचना और समारोह निम्नलिखित के रूप में घोषित किया है:सी संरचना के मार्शलिंग को सी #
typedef struct
{
char* name;
BT_ADDR address;
} DeviceList;
extern "C" _declspec(dllexport)DeviceList* PerformQuery();
BT_ADDR संरचना में समान संरचना विन सीई SDK में wsbth2.h में परिभाषित किया गया है। PerformQuery डिवाइसलिस्ट की एक सरणी में एक सूचक देता है।
मेरी सी # प्रोग्राम में, मैं के रूप में
[StructLayout(LayoutKind.Sequential)]
struct DeviceList
{
public string name;
public ulong address;
}
[DllImport("BT_Conn.dll")]
public extern static DeviceList[] PerformQuery();
पीछा सी # कार्यक्रम चलाने के बाद निम्नलिखित PInvoke घोषणा करते हैं, एक NotSupportedException दिया जाता है। क्या आप कृपया मुझे सलाह दे सकते हैं कि मेरे मार्शलिंग में क्या गलत है?
हाय सैक्सन, PerformQuery() एपीआई वास्तव में एक से अधिक आइटम लौटाएगा। सरणी की लंबाई निर्धारित करने के लिए, मैं सी ++ में आकार (* devList)/sizeof (DeviceList) का उपयोग करूंगा, लेकिन मैं अपने एपीआई को लौटाए गए सरणी में आइटम्स की संख्या पर मार्शलर को सूचित करने के लिए कैसे घोषित करूं? –
@CK: सी ++ 'आकार (* devList) में' आकार (डिवाइसलिस्ट) ', यानी एक आइटम का आकार वापस कर देगा। यदि आपके पास 'डिवाइसलिस्ट *' पॉइंटर है, तो कंपाइलर यह नहीं बता सकता कि कितने आइटम हैं। यह केवल तभी होता है जब आपके पास 'डिवाइसलिस्ट []' सरणी (एक निश्चित संख्या के आइटम के साथ) है जो आकार सरणी के पूर्ण आकार को वापस कर सकता है। –
@CK: वैसे, PerformQuery() एक फ़ंक्शन है जिसे आप लिख रहे हैं, या यह मौजूदा DLL में एक फ़ंक्शन है जिसे आपको इंटरफ़ेस करना है? –