我试图使用Windows Portable Devices API和此API提供的PortableDeviceManager在Windows上枚举连接的便携式设备.
我已经在MSDN文档链接和各种博客链接之后实现了设备ID的枚举,但它们都导致了同样的问题 - 我只能在有几个连接的时候给我一个设备的ID .
这是我正在使用的C#代码片段:
PortableDeviceManagerClass deviceManager = new PortableDeviceManagerClass();
deviceManager.RefreshDeviceList();
uint numberOfDevices = 1;
deviceManager.GetDevices(null, ref numberOfDevices);
if (numberOfDevices == 0)
{
return new string[0];
}
string [] deviceIds = new string[numberOfDevices];
deviceManager.GetDevices(ref deviceIds[0], ref numberOfDevices);
return deviceIds;
Run Code Online (Sandbox Code Playgroud)
我有两台设备连接到我的电脑,一台可拆卸USB记忆棒和一台数码相机.当两者都处于活动状态时,将仅返回我的相机的设备ID.当我关闭相机时,将返回可移动USB记忆棒的设备ID.
是否有任何有此API经验的人可以指出我做错的方向?
编辑:请求完整的源代码.下面是一个准系统实现,以便复制该错误.删除内容枚举,但无论如何崩溃都会在第一个对象调用上发生.在这种情况下,WPD_DEVICE_OBJECT_ID对象.
链接到CPP(Bug从第103行开始)
链接到QMAKE.PRO(我正在使用Qt)
在我的项目中,我使用WPD API来读取移动设备的内容.我遵循API到tee并成功实现了内容枚举.
但是,如果连接了USB驱动器,WPD API有时也会将其检测为设备.无论如何,我的程序将继续进行内容枚举.我不希望这样.我只想枚举移动设备.
问题是在内容枚举期间,当我的程序试图检索USB驱动器上的对象的属性时,它会崩溃.以下是崩溃详情:
Problem Event Name: BEX
Application Name: UniversalMC.exe
Application Version: 0.0.0.0
Application Timestamp: 5906a8a3
Fault Module Name: MSVCR100.dll
Fault Module Version: 10.0.40219.325
Fault Module Timestamp: 4df2be1e
Exception Offset: 0008af3e
Exception Code: c0000417
Exception Data: 00000000
OS Version: 6.1.7601.2.1.0.768.3
Locale ID: 1033
Additional Information 1: 185e
Additional Information 2: 185ef2beb7eb77a8e39d1dada57d0d11
Additional Information 3: a852
Additional Information 4: a85222a7fc0721be22726bd2ca6bc946
Run Code Online (Sandbox Code Playgroud)
此次调用发生崩溃:
hr = pObjectProperties->GetStringValue(WPD_OBJECT_ORIGINAL_FILE_NAME, &objectName);
Run Code Online (Sandbox Code Playgroud)
hr 返回FAILED然后我的程序崩溃.
经过一些研究,我发现异常代码c0000417意味着发生了缓冲区溢出?如果我错了,请纠正我,但这是WPD …
我想写一个将MP3文件复制到SanDisk Sansa M240的应用程序.SanDisk没有驱动器号并使用MTP进行文件传输.我偶然发现了连接到设备的示例:http://blogs.msdn.com/dimeby8/archive/2006/09/27/774259.aspx
但一旦连接,我无法弄清楚如何在设备上实际复制文件/创建文件夹.
我很惊讶这个COM库没有任何.Net包装器.
在我的项目中,我使用Windows便携设备(WPD)API来枚举移动设备的内容.WPD API枚举指南.我能够枚举每个对象并查看其属性,如API编程指南中所示.WPD API属性指南
但是,当我尝试获取名称中包含对象名称的对象.名称时,返回的值将被截断.
HRESULT hr = objectProperties->GetStringValue(WPD_OBJECT_NAME, &strOriginalFileName);
if(FAILED(hr))
return false;
PWSTR wideStr = strOriginalFileName;
char buffer[20];
wcstombs(buffer, wideStr, 20);
qDebug() << buffer;
Run Code Online (Sandbox Code Playgroud)
因此,例如,com.example返回名称为的对象(设备上的文件夹)com.当我试图在设备上找到特定的文件路径时,这成为一个明显的问题.
我似乎无法弄清楚出了什么问题.我误解了文件名实际上是怎么回事?对象example内是另一个属性还是其他东西com?我很困惑.
编辑:所以我使用WPD API示例软件来检索com.example对象的所有对象属性,您可以看到WPD本身无法获取完整的文件夹名称. 
谢谢你的时间!
我正在尝试从java签名的applet中读取便携式设备....我在http://code.google.com/p/jmtp/w/list上找到了一个jmtp库 来访问便携式设备,但是当我运行它时netbeans它给出了错误
Exception in thread "main" java.lang.UnsatisfiedLinkError: no jmtp in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
at jmtp.PortableDeviceManagerImplWin32.(PortableDeviceManagerImplWin32.java:38)
at jmtp.PortableDeviceManager.(PortableDeviceManager.java:34)
at jmtp.Jmtp.main(Jmtp.java:23)
Java Result: 1
我搜索并发现我必须在.jmtp项目中包含.dll文件作为本机库...我右键单击项目并导航到属性,然后选择"运行"和选择的VM选项为
-Djava.library.path="c:\jmtp\native\windows"并将该jmtp.dll文件放在c:\ jmtp文件夹中
但是我的代码不断出现同样的错误
package jmtp;
import jmtp.PortableDevice;
import jmtp.PortableDeviceManager;
import jmtp.PortableDeviceObject;
import jmtp.PortableDeviceStorageObject;
public class Jmtp {
public static void main(String[] args) {
PortableDeviceManager manager = new PortableDeviceManager();
PortableDevice device = manager.getDevices()[0];
// Connect to my mp3-player
device.open();
System.out.println(device.getModel());
System.out.println("---------------");
// Iterate over deviceObjects
for(PortableDeviceObject object : device.getRootObjects()) {
// …
Run Code Online (Sandbox Code Playgroud) 我希望得到一些关于实现看似简单目标的一般指导.我有一个数码单反相机(佳能EOS 50D),需要编写一个应用程序,告诉相机拍照.我还需要将图片传输到计算机,并可能将其从相机的存储中删除.奖励将是在我的应用程序中从相机获得实时预览.我的环境将是Windows(XP Pro或Vista Enterprise)和.Net 3.5(C#).
我做了一些研究,发现了几个选择.我知道一个会工作,但限制我将来只使用佳能相机.我找到并从佳能下载了一个SDK,它提供了很多这方面的功能.我查看了SDK,虽然它很广泛并且用C语言编写,但它确实有C#包装器,可以加快开发速度.
我发现的另一个选项叫做Windows便携设备.显然,它是一个API,可以与实现PTP和MTP标准的设备进行通信.它是基于COM的,据我所知,它没有.Net包装器.然而,这不是一个节目塞子.我可以P/Invoke我需要的功能或编写托管C++ DLL在我的应用程序中使用与摄像头通信.
我正在寻找有WPD经验的人给我指点.我仔细阅读了文档并看到了传输图像和删除图像的参考.但是,我没有看到提取照片,获取预览图像或说焦点/自动对焦的命令.
我的Android应用程序生成一些文件,我需要与我的主PC程序同步,反之亦然.我这样做的常用方法是使用一个FTP帐户,我的Android应用程序和我的PC程序都获取最新版本的文件,这很好用.我的一些客户在他们的Android设备上没有互联网访问权限,因此必须通过USB电缆连接到PC来与我的程序同步.为此,我在我的电脑程序中的程序将在Android设备上的指定文件夹中的文件同步.问题是此方法仅在Android设备可以作为驱动器安装时才有效,因此可以通过Windows为其分配驱动器号.
某些设备,尤其是运行Honeycomb的平板电脑(我在三星Galaxy 10.1标签和联想Thinkpad平板电脑上经历过这种设备)不会作为驱动器安装,而是作为Windows便携设备(WPD)连接.在这种情况下,我无法从我的程序(用Delphi编写)访问设备,因此我的同步文件的例程不起作用.
我的例程必须知道要同步的文件夹的特定位置才能工作,所以如果我可以将文件从设备传输到PC上的临时文件夹,同步它们并可能将文件传回设备,这将解决我的问题.
任何人都可以建议一种方法,我可以将文件从WPD设备传输到我的PC上的文件夹,然后再返回?它必须自动化,因为我的客户端无法手动传输文件.或者,有没有办法强制WPD设备作为普通外部驱动器运行并分配驱动器号?
我是C#的新手,必须在C#中开发Windows Form应用程序.此应用程序应跟踪以下内容.
我可以RegisterNotification通过跟踪方法中的WM_DEVICECHANGE消息来获取CD/DVD驱动器插入的系统通知WndProc.
以上实现让我知道何时将新设备连接到PC.
我面临的问题是如何跟踪CD/DVD上发生的文件更改(写入/修改).一种选择是将CD/DVD中的文件轮询为后台作业.但是,这将是最后一个选择.
我发现IMAPI我们可以通过它写入CD/DVD但我只需要监视文件更改以进行审计.
请指点我如何在我的程序中接收CD/DVD通知上的文件更改?
我试过FileSystemWatcher但它似乎不适用于CD/DVD驱动器.
更新于2018年2月7日:
我能找到的另一种方法是通过WMI附加的查询WMI Events.我找到了一个Best way to detect dvd insertion in drive c#也可以得到答案的问题.我想知道在WMI中是否可以检测到DVD文件系统修改,以及是否有任何专家可以共享查询.我希望阿尔沙德能够在这方面提供帮助.
我注意到,有些USB存储设备没有在Windows中注册为常规驱动器,因为它们甚至没有分配驱动器号.因此,我无法使用标准文件操作C API显然访问它们.
我可以使用什么WinAPI调用在这些奇怪的设备上执行一些正常的文件操作 - 所以:
此外,已知/调用这些类型的设备/协议的一般关键字是什么?
我正在开发一个在Windows上运行的PC c ++应用程序.应用程序应使用MTP与通过USB连接的Android手机通信.该idée是不安装存储卡.我发现Windows有一些他们称之为支持MTP的WPD(Windows便携设备).它看起来还不错,但它要求安装WMP11.我想知道的是:
任何帮助将不胜感激.