我有一个未损坏的COM对象的方法,我正在尝试编组:
STDMETHOD(SomeMethod)(LPSTR** items, INT* numOfItems) = 0;
但我无法弄清楚编组LPSTR **物品的正确方法。它应该是一个项目列表。但是,如果尝试做这样的事情:
[PreserveSig]
int SomeMethod([MarshalAs(UnmanagedType.LPStr)]ref StringBuilder items, ref uint numOfItems);
我只收到第一个项目的第一个字母而没有别的。
如何正确编组LPSTR **变量?
答案 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'
}
}
}
}