如何在.NET中编组LPSTR **?

时间:2017-03-28 14:26:51

标签: c# .net marshalling

我有一个未损坏的COM对象的方法,我正在尝试编组:

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

但我无法弄清楚编组LPSTR **物品的正确方法。它应该是一个项目列表。但是,如果尝试做这样的事情:

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

我只收到第一个项目的第一个字母而没有别的。

如何正确编组LPSTR **变量?

2 个答案:

答案 0 :(得分:0)

我现在无法检查,但签名应如下所示:

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

当然,它无济于事,您可以随时通过Marshal课程进行手动编组(如Sinatr建议的那样)。

答案 1 :(得分: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'
            }
        }
    }
}