2014-09-23 2 views
1

Я пытаюсь использовать 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". Я не уверен, почему он вернет это, потому что все, что я ищу, - это указатель.

+0

Вы говорите, что размер, который вы отправляете, и размер, который вы получаете, различны? Если это так, это говорит вам кое-что - в основном, что ваше определение неверно. – ctacke

+0

Нет, я говорю, что функция не влияет на структуру. Функция 'cbSize' не изменяется функцией, но изменяется на sizeof –

ответ

2

Похоже, что ваш cbSize, вероятно, ошибается. Попробуйте изменить public fixed char szProfile[32]; к public fixed System.UInt16 szProfile[32];

Кроме того, FILETIME это два типа DWORD структура, а не один DWORD.

+0

Пробовал, но с той же проблемой все еще. –

+0

Какова ценность передаваемого cbsize? И исправьте размер двух структур FILETIME. – PaulH

+0

Спасибо! Изменение структур FILETIME на QWORDS исправило это :) –

Смежные вопросы