Я пытаюсь использовать Coredll.dll в C# для извлечения данных в магазинах, которые монтируются.Использование Coredll.dll для извлечения информации о магазинах
Вот мои Структуры, которые должны имитировать структур в родной библиотеке (STORAGEDEVICEINFO, STORAGEINFO)
[StructLayout(LayoutKind.Sequential)]
public unsafe struct STORAGEDEVICEINFO
{
public DWORD cbSize;
public fixed System.UInt16 szProfile[32];
public DWORD dwDeviceClass;
public DWORD dwDeviceType;
public DWORD dwDeviceFlags;
}
[StructLayout(LayoutKind.Sequential)]
public unsafe struct STOREINFO
{
public DWORD cbSize;
public fixed System.UInt16 szDeviceName[8];
public fixed System.UInt16 szStoreName[32];
public DWORD dwDeviceClass;
public DWORD dwDeviceType;
public STORAGEDEVICEINFO sdi;
public DWORD dwDeviceFlags;
public SECTORNUM snNumSectors;
public DWORD dwBytesPerSector;
public SECTORNUM snFreeSectors;
public SECTORNUM snBiggestPartCreatable;
public DWORD ftCreated; /* ? */
public DWORD ftLastModified;
public DWORD dwAttributes;
public DWORD dwPartitionCount;
public DWORD dwMountCount;
}
Вот мой FindStoreInfo вызов (HANDLE
это просто IntPtr
):
[DllImport("Coredll.dll", SetLastError = true)]
public static extern HANDLE FindFirstStore(STOREINFO *info/*PSTOREINFO pStoreInfo*/);
Функция вызывает без ошибок, но она не меняется info
. Он оставляет это как пустую структуру, за исключением cbSize (но это изменяется от sizeof вызова). Здесь я называю это.
STOREINFO info;
info.cbSize = (uint)Marshal.SizeOf(typeof(STOREINFO));
Store.StorageManager.FindFirstStore(&info);
Вызов GetLastError возвращает 0x57, который является "ERROR_INVALID_PARAMETER". Я не уверен, почему он вернет это, потому что все, что я ищу, - это указатель.
Вы говорите, что размер, который вы отправляете, и размер, который вы получаете, различны? Если это так, это говорит вам кое-что - в основном, что ваше определение неверно. – ctacke
Нет, я говорю, что функция не влияет на структуру. Функция 'cbSize' не изменяется функцией, но изменяется на sizeof –