पर कनवर्ट करें मैं एक इंटिप्ट में आरईसीटी संरचना (नीचे दिया गया) की एक सरणी को कन्वर्ट करने की कोशिश कर रहा हूं, इसलिए मैं पोस्टमेसेज का उपयोग किसी अन्य एप्लिकेशन पर पॉइंटर भेज सकता हूं।structs को intPtr
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
// lots of functions snipped here
}
// so we have something to send, in reality I have real data here
// also, the length of the array is not constant
RECT[] foo = new RECT[4];
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(foo[0]) * 4);
Marshal.StructureToPtr(foo, ptr, true); // -- FAILS
यह अंतिम पंक्ति पर एक ArgumentException देता है ("निर्दिष्ट संरचना blittable होना चाहिए या लेआउट जानकारी नहीं है।")। मुझे PostMessage का उपयोग करके किसी अन्य एप्लिकेशन पर RECTs की इस सरणी को किसी भी तरह से प्राप्त करने की आवश्यकता है, इसलिए मुझे वास्तव में इस डेटा के लिए एक पॉइंटर चाहिए।
यहां मेरे विकल्प क्या हैं?
अद्यतन: यह काम करने के लिए लगता है:
IntPtr result = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Win32.RECT)) * foo.Length);
IntPtr c = new IntPtr(result.ToInt32());
for (i = 0; i < foo.Length; i++)
{
Marshal.StructureToPtr(foo[i], c, true);
c = new IntPtr(c.ToInt32() + Marshal.SizeOf(typeof(Win32.RECT)));
}
UPDATED फिर ठीक करने के लिए क्या मध्यस्थ पर टिप्पणी की।
क्या संदेश आपको लगता है कि स्वचालित रूप से पोस्ट कर रहे हैं 4 rects की एक सरणी का करता पार प्रक्रिया marshaling? –
मैं स्क्रीन के कुछ क्षेत्रों को अनदेखा करने के लिए एक डीएलएल (जिसे दूसरी प्रक्रिया में होस्ट किया गया है क्योंकि यह 64-बिट है) बताने का प्रयास कर रहा हूं। यह आवश्यक 4 आरईसीटी नहीं है। –
आपके अपडेट के अनुसार, आप पर्याप्त स्थान आवंटित नहीं करते हैं (मार्शल.SizeOf (टाइपऑफ (आरईसीटी) के बजाय intptr.size)। और आप पॉइंटर अंकगणित x64 मशीनों पर असफल हो सकते हैं, मेरा जवाब देखें। – arbiter