Member 14087451 Ответов: 0

Задача в pinvoke vector<struct> to C#


у меня есть проблема с пинвокингом вектора, содержащего struct в c#

я не маршал IntPtr к строке в структура

for (int i = 0; i < itemcount; i++)
{
 var soft = items[i];
string x = Marshal.PtrToStringAuto( soft.DisplayName);
 }



пожалуйста помочь

Что я уже пробовал:

код на языке c++
typedef intptr_t ItemListHandle;

bool GetPrograms(InstalledPrograms::ItemListHandle * hItems, Software** itemsFound, int* itemCount)
{
	vector<Software>* lst = InstalledPrograms::GetInstalledPrograms(true);

	*hItems = reinterpret_cast<InstalledPrograms::ItemListHandle>(lst);
	*itemsFound = lst->data();
	*itemCount = lst->size();
	return true;
}
код c#
class ItemsSafeHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
        public ItemsSafeHandle()
            : base(true){}
        protected override bool ReleaseHandle()
        {
            return Program.ReleaseItems(handle);
        }
    }
      
    [StructLayout(LayoutKind.Sequential)]
    public struct Software
    {
        public IntPtr DisplayName;
        public IntPtr InstallLocation;
        public IntPtr Version;
        public IntPtr Architecture;
        public IntPtr Icon;
    };
    class Program
    {
        [DllImport(@"mydll.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "GetPrograms",CharSet =CharSet.Auto)]
        static unsafe extern bool GetPrograms(out ItemsSafeHandle itemsHandle, out Software* items, out int itemCount);


        [DllImport(@"mydll.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ReleaseVectorItems", CharSet = CharSet.Auto)]
        public static unsafe extern bool ReleaseItems(IntPtr itemsHandle);
        static unsafe void Main(string[] args)
        {            
            int itemcount = 0;
            Software* items;
            using (GenerateItemsWrapper( out  items, out itemcount))
            {
                for (int i = 0; i <itemcount; i++)
                {
                    var soft = items[i];
                    string x = Marshal.PtrToStringAuto(soft.DisplayName);
                }
            }
        }

        static unsafe ItemsSafeHandle GenerateItemsWrapper(out Software* items, out int itemsCount)
        {
            ItemsSafeHandle itemsHandle;
            if (!GetPrograms(out itemsHandle, out items, out itemsCount))
            {
                throw new InvalidOperationException();
            }
            return itemsHandle;
        }

Richard MacCutchan

Вам нужно точно объяснить, в чем проблема.

Member 14087451

сэр, как вы можете видеть, программное обеспечение(struct) имеет члены intptr, которые я не могу преобразовать в строковые значения

honey the codewitch

можете ли вы дать нам заголовок C/C++ для импортируемой структуры?

Мне нужно увидеть нативные типы, чтобы получить вам правильный p/invoke

возможно, потребуется маршалировать stringbuilders или строки фиксированной длины внутри структуры или что-то в этом роде. это может быть что угодно. мне нужно увидеть собственный заголовок для структуры

0 Ответов