2017-03-28 7 views
5

मैं unmaged COM ऑब्जेक्ट में एक तरीका है जिसके मैं मार्शल कोशिश कर रहा हूँ है:.NET में LPSTR ** marshall कैसे करें?

STDMETHOD(SomeMethod)(LPSTR** items, INT* numOfItems) = 0; 

लेकिन मैं आइटम ** LPSTR बाहर मार्शल करने के लिए सही तरीके से समझ नहीं कर सकते हैं। यह वस्तुओं की एक सूची माना जाता है। लेकिन अगर कुछ इस तरह से करने की कोशिश:

[PreserveSig] 
int SomeMethod([MarshalAs(UnmanagedType.LPStr)]ref StringBuilder items, ref uint numOfItems); 

मैं केवल बहुत पहले आइटम और कुछ नहीं के पहले पत्र मिलता है।

मैं एलपीआरटी ** परिवर्तनीय तरीके से मार्शल कैसे कर सकता हूं?

+1

यह और अधिक की तरह 'StringBuilder []' होना चाहिए। आप उस पैरामीटर को मैन्युअल रूप से मार्शल कर सकते हैं, उदाहरण देखें [यह प्रश्न] (http://stackoverflow.com/q/16857034/1997232)। – Sinatr

+0

@Sinatr, मैंने स्ट्रिंगबिल्डर [] का उपयोग करने की कोशिश की लेकिन इस मामले में मुझे यह त्रुटि मिल रही है: "प्रबंधित डिबगिंग सहायक 'ContextSwitchDeadlock' हुआ"। हालांकि आपके द्वारा प्रदान किए गए लिंक पर एक नज़र डालेंगे। – user208478

+0

मार्शलिंग दिशा क्या है? अंदर, बाहर, दोनों? – arbiter

उत्तर

0

मैं अभी जांच कर सकते हैं नहीं है, लेकिन हस्ताक्षर इस तरह दिखना चाहिए:

[PreserveSig] 
int SomeMethod(
    [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 1)] out string[] items, 
    out int numOfItems); 
बेशक

, यह मदद नहीं करता है, तो आप हमेशा Marshal वर्ग के माध्यम से मार्गदर्शन मार्शलिंग प्रदर्शन कर सकते हैं (जैसा कि Sinatr सुझाव दिया)।

0

इस प्रयास करें:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication49 
{ 
    class Program 
    { 
     [StructLayout(LayoutKind.Sequential)] 
     public struct UnmanagedStruct 
     { 
      [MarshalAs(UnmanagedType.ByValArray)] 
      public IntPtr[] listOfStrings; 
     } 


     static void Main(string[] args) 
     { 
      UnmanagedStruct uStruct = new UnmanagedStruct(); 
      IntPtr strPtr = uStruct.listOfStrings[0]; 

      List<string> data = new List<string>(); 
      while (strPtr != IntPtr.Zero) 
      { 
       string readStr = Marshal.PtrToStringAnsi(strPtr); 
       data.Add(readStr); 
       strPtr += readStr.Length; //I think it should be Length + 1 to include '\0' 
      } 
     } 
    } 
} 
संबंधित मुद्दे