wpd c # перечисление содержимого устройств, когда присутствует более одного устройства - PullRequest
0 голосов
/ 12 сентября 2018

Я разработал приложение, которое перечисляет и объединяет карты содержимого всех дисков, когда-либо подключенных к системе.Делая то же самое для устройств с интерфейсом WPD API Interop.PortableDeviceApiLib.dll, существует предельное ограничение для управления современными устройствами.

Мне удалось выполнить трюк, приведенный в https://blogs.msdn.microsoft.com/dimeby8/2006/12/05/enumerating-wpd-devices-in-c/
, для разборки изаново собрать Interop.PortableDeviceApiLib.dll, чтобы управлять более чем одним устройством одновременно, заменив

instance void GetDevices([in][out] string& marshal( lpwstr) pPnPDeviceIDs

на

instance void GetDevices([in][out] string[] marshal( lpwstr[]) pPnPDeviceIDs

НО, с двумя подключенными устройствами, второй элемент возвращаемого массива ВСЕГДА null !!!

Это фрагмент кода:

    public string[] Refresh() {
        deviceManager.RefreshDeviceList();
        string[] nullArray = { null };
        uint count = 1;
        try { deviceManager.GetDevices(null, ref count); }    // <-- I tried also with nullArray instead of null
        catch (Exception ex) { Console.WriteLine(ex.Message); count = 0; }
        if (count == 0)
            return null;
        var deviceIds = new string[count];
        deviceManager.GetDevices(deviceIds, ref count);
        foreach (var deviceId in deviceIds)
        {
            Add(new PortableDevice(deviceId));
        }
        return deviceIds;
    }

Обратите внимание, что два уже подключеныустройств (на каждом я ответил на Разрешить соединение: ДА), поэтому переменная count получает значение 2 и deviceIds [0] в порядке, но deviceIds [1] всегда нулевой!(даже после замены устройств в слотах USB).

Я использую Windows Studio Professional 2017 в Windows 10 Два устройства - это Honor9 и USB-диск или iPad.В файле project.csproj я вставил: ...

<Reference Include="Interop.PortableDeviceApiLib">
  <HintPath>.\Interop.PortableDeviceApiLib.dll</HintPath>
</Reference>
<Reference Include="Interop.PortableDeviceTypesLib">
  <HintPath>.\Interop.PortableDeviceTypesLib.dll</HintPath>
</Reference>

... вместо этого, чтобы сослаться на файлы COM:

    <COMReference Include="PortableDeviceApiLib">
  <Guid>{1F001332-1A57-4934-BE31-AFFC99F4EE0A}</Guid>
  <VersionMajor>1</VersionMajor>
  <VersionMinor>0</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>tlbimp</WrapperTool>
  <Isolated>False</Isolated>
  <EmbedInteropTypes>False</EmbedInteropTypes>
</COMReference>
<COMReference Include="PortableDeviceTypesLib">
  <Guid>{2B00BA2F-E750-4BEB-9235-97142EDE1D3E}</Guid>
  <VersionMajor>1</VersionMajor>
  <VersionMinor>0</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>tlbimp</WrapperTool>
  <Isolated>False</Isolated>
  <EmbedInteropTypes>False</EmbedInteropTypes>
</COMReference>

, потому что раньше это давало мне две проблемы: 1)каждая компиляция перезаписывала новый bin / Debug / Interop.PortableDeviceApiLib.dll;2) Это дало мне исключение: невозможно найти void PortableDeviceApiLib.IPortableDeviceManager.GetDevices (System.String ByRef, UInt32 ByRef)

Есть ли кто-нибудь, чтобы решить нулевое значение, всегда возвращаемое для не-первых устройств?

...