首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在.NET中使用LPSTR**?

如何在.NET中使用LPSTR**?
EN

Stack Overflow用户
提问于 2017-03-28 14:26:51
回答 2查看 778关注 0票数 6

我在unmaged COM对象中有一个方法,我正在尝试使用这个方法:

代码语言:javascript
复制
STDMETHOD(SomeMethod)(LPSTR** items, INT* numOfItems) = 0;

但我想不出正确的方法来整理LPSTR**项目。应该是一张物品清单。但是,如果尝试这样做:

代码语言:javascript
复制
[PreserveSig] 
int SomeMethod([MarshalAs(UnmanagedType.LPStr)]ref StringBuilder items, ref uint numOfItems);

我只收到第一件物品的第一封信,没有别的东西。

如何正确封送LPSTR**变量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-28 15:16:18

我现在不能检查它,但是签名应该如下所示:

代码语言:javascript
复制
[PreserveSig]
int SomeMethod(
    [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 1)] out string[] items,
    out int numOfItems);

当然,这是没有帮助的,您可以通过元帅类执行手动编组(如Sinatr所建议的)。

票数 0
EN

Stack Overflow用户

发布于 2017-03-28 15:50:35

试试这个:

代码语言:javascript
复制
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'
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43072247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档