我开发了一个应用程序,该应用程序枚举并合并了曾经连接到系统的所有驱动器的内容映射。 对于使用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;
}
请注意,有两个已经连接的设备(在我对允许连接的响应的每个设备上:YES),因此var count接收值2 并且deviceIds [0]可以,但是deviceIds [1]始终为null! (即使在更换USB插槽上的设备之后)。
我在Windows 10上使用Windows Studio Professional 2017 这两个设备是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)它给了我一个例外:无法找到无效的PortableDeviceApiLib.IPortableDeviceManager.GetDevices(System.String ByRef,UInt32 ByRef)
有人解决非第一设备总是返回的空值吗?