srilekhamenon Ответов: 1

Проблема в то время как pinvoke setupdigetclassimageindex


я хочу, чтобы вызов PInvoke
SetupDiGetClassImageIndex

Функция SetupDiGetClassImageIndex | Microsoft Docs[^]

но он всегда возвращает false, plz help,
то, что IAM делаю не так ?

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

[StructLayout(LayoutKind.Sequential)]
       public struct SP_CLASSIMAGELIST_DATA
       {
           public uint cbSize;
           public IntPtr HIMAGELIST;
           public IntPtr Reserved;
       }

[DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
        internal static extern bool SetupDiGetClassImageIndex(SP_CLASSIMAGELIST_DATA ClassImageListData, Guid ClassGuid,ref int ImageIndex);


string strGuid="myguid";
SP_CLASSIMAGELIST_DATA m_ImageListData = new SP_CLASSIMAGELIST_DATA();
            bool success = false;
            int ClassImage = 0;
            Guid ClassGuid = new Guid(strGuid);
            
            m_ImageListData.cbSize = (uint)Marshal.SizeOf(typeof(SP_CLASSIMAGELIST_DATA));
            success = SetupDiGetClassImageIndex(m_ImageListData, ClassGuid,ref ClassImage);

1 Ответов

Рейтинг:
9

Jochen Arndt

Вызов GetLastError() когда функция выходит из строя. Код ошибки может помочь выяснить, что не так. Я думаю, что здесь это недопустимый параметр.

Обратите внимание, что все параметры функции API являются указателями. Так что, вероятно, это должно быть (не проверено):

[DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
        internal static extern bool SetupDiGetClassImageIndex(ref SP_CLASSIMAGELIST_DATA ClassImageListData, Guid ClassGuid, ref int ImageIndex);
Конверсия с идентификатором GUID# в структуру GUID указатель должен быть, насколько мне известно, сделано по P/вызвать автоматически.

Ваш GUID, надеюсь, действителен, потому что в противном случае исключение будет вызвано Guid() конструктор.


srilekhamenon

функция getlasterror() выдает код ошибки 1784, предоставленный пользовательский буфер недопустим для запрошенной операции.

Jochen Arndt

Это относится, вероятно, к параметру PSP_CLASSIMAGELIST_DATA, поскольку функция проверяет член cbSize.

Вы пробовали указать ref (также при последнем звонке)?

srilekhamenon

Да, сэр, я прошел SP_CLASSIMAGELIST_DATA как Реф, но все равно проблему не решить

Jochen Arndt

Все, что я могу предложить, это попробовать ref также для Guid и указать ImageIndex как out.

Это 64-битное или 32-битное приложение?
В зависимости от этого может потребоваться добавить параметр Pack в StructLayout (8 для 64 бит и 1 или 4 для 32 бит, как используется в файле setupapi.h).

srilekhamenon

целевая платформа приложений-x86, а моя система-64-битная система

srilekhamenon

проблема решена, спасибо