Как из native dll импоритировать функцию со структурой в качестве параметра
От: vladpol Украина http://vlad-mislitel.livejournal.com/
Дата: 09.12.14 15:02
Оценка:
Есть dll (от NVdia), которую подгружаю через LoadLibrary в .Net приложение. Все, в принципе, работает, но загвоздка в одной функции,
NVAPI_INTERFACE NvAPI_DRS_GetProfileInfo(NvDRSSessionHandle hSession, NvDRSProfileHandle hProfile, NVDRS_PROFILE *pProfileInfo);

где
typedef struct _NVDRS_PROFILE
{
     NvU32                      version;            //!< Structure Version
     NvAPI_UnicodeString        profileName;        //!< String name of the Profile
     NVDRS_GPU_SUPPORT          gpuSupport;         //!< This read-only flag indicates the profile support on either
                                                    //!< Quadro, or Geforce, or both.
     NvU32                      isPredefined;       //!< Is the Profile user-defined, or predefined
     NvU32                      numOfApps;          //!< Total number of applications that belong to this profile. Read-only
     NvU32                      numOfSettings;      //!< Total number of settings applied for this Profile. Read-only
} NVDRS_PROFILE;


typedef NvU16 NvAPI_UnicodeString[NVAPI_UNICODE_STRING_MAX];


typedef struct _NVDRS_GPU_SUPPORT
{
    NvU32 geforce    :  1;
    NvU32 quadro     :  1;
    NvU32 nvs        :  1;
    NvU32 reserved4  :  1;
    NvU32 reserved5  :  1;
    NvU32 reserved6  :  1;
    NvU32 reserved7  :  1;
    NvU32 reserved8  :  1;
    NvU32 reserved9  :  1;
    NvU32 reserved10 :  1;
    NvU32 reserved11 :  1;
    NvU32 reserved12 :  1;
    NvU32 reserved13 :  1;
    NvU32 reserved14 :  1;
    NvU32 reserved15 :  1;
    NvU32 reserved16 :  1;
    NvU32 reserved17 :  1;
    NvU32 reserved18 :  1;
    NvU32 reserved19 :  1;
    NvU32 reserved20 :  1;
    NvU32 reserved21 :  1;
    NvU32 reserved22 :  1;
    NvU32 reserved23 :  1;
    NvU32 reserved24 :  1;
    NvU32 reserved25 :  1;
    NvU32 reserved26 :  1;
    NvU32 reserved27 :  1;
    NvU32 reserved28 :  1;
    NvU32 reserved29 :  1;
    NvU32 reserved30 :  1;
    NvU32 reserved31 :  1;
    NvU32 reserved32 :  1;
} NVDRS_GPU_SUPPORT;


так вот, как я не пытаюсь задекларивовать эту структуру в .Net и через и MarshalAs и через [StructLayout(LayoutKind.Sequential)] и через [StructLayout(LayoutKind.Explicit)] (с распределением смещений), даже пробовал пихать массив байт соответствующего размера — оно падает (возвращает INCOMPATIBLE_STRUCT_VERSION). В чем я не прав?
С уважением, Владислав Полищук
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.