可以在Windows中使用CreateFile以编程方式从iPhone读取图像吗?

可以在Windows中使用CreateFile以编程方式从iPhone读取图像吗?,iphone,windows,winapi,filesystems,createfile,Iphone,Windows,Winapi,Filesystems,Createfile,当iPhone连接到Win7计算机时,可以使用Explorer(以及我的应用程序的“打开文件”对话框)查看图像。但是,文件位置不包含驱动器号 例如Computer\Apple iPhone\Internal Storage\DCIM\800aaaaaa\IMG_0008.JPG而不是E:\DCIM\800aaaaaa\IMG_0008.JPG,这是SD卡、usb驱动器等的常见功能 我曾尝试使用CreateFileW从iPhone读取图像,但失败的原因是“(错误代码:3)系统找不到指定的路径。”我

当iPhone连接到Win7计算机时,可以使用Explorer(以及我的应用程序的“打开文件”对话框)查看图像。但是,文件位置不包含驱动器号

例如
Computer\Apple iPhone\Internal Storage\DCIM\800aaaaaa\IMG_0008.JPG
而不是
E:\DCIM\800aaaaaa\IMG_0008.JPG
,这是SD卡、usb驱动器等的常见功能

我曾尝试使用CreateFileW从iPhone读取图像,但失败的原因是“(错误代码:3)系统找不到指定的路径。”我还尝试使用Chrome访问它们,但也失败了


有什么建议吗?

该文件夹实际上是所谓的“虚拟文件夹”,在文件系统上没有完整路径。您需要使用从“打开”对话框返回的shell项来获取文件的内容,而不是使用CreateFile

数据应该是可访问的,但您应该按照中的说明进行操作。我相信可能有更好的例子(因为这只提供了指导方针)

编辑粗略的过程是从IFileOpenDialog获取IShellItem,然后绑定到流,然后读取流(假设为只读)-请记住,此代码几乎没有错误处理、检查或安全性:

if (pitem->GetDisplayName(SIGDN_NORMALDISPLAY, &destName) == S_OK) {
    std::cout << destName << std::endl;
    CoTaskMemFree(destName);
}
IStream *pistream;
if (pitem->BindToHandler(0, BHID_Stream, IID_PPV_ARGS(&pistream)) == S_OK) {
    char input[1024];
    long to_read = 1024;
    unsigned long read;
    while (S_OK == pistream->Read(input, to_read, &read)) {
       std::cout << input << std::endl;
    }
    pistream->Release();
}
pitem->Release();
if(pitem->GetDisplayName(SIGDN\u NORMALDISPLAY,&destName)==S\u确定){
标准::无法读取(输入、读取和读取){
std::cout Release();

此类设备通常作为外壳命名空间扩展插入Windows资源管理器中,而不像带驱动器号的U盘。大多数普通文件命令(如CopyFile(..)、FindFirst()或GetFileInfo(..)都不能直接在此类外壳命名空间扩展中使用。只有
CopyHere(..)
正在工作。 我花了很长时间才弄明白如何在digicam上枚举文件,现在又在Android设备上使用vb.net程序枚举文件,并将我的图片复制到我的Windows PC上:

Public Const MyComputer As Integer=&H11&
子枚举计算机()
作为对象的Dim oItem
Dim res作为整数
对于DirectCast(CreateObject(“Shell.Application”).Namespace(MyComputer.Items、System.Collections.IEnumerable)中的每个oItem
Debug.Print(oItem.Type.ToString)
如果oItem.Type.ToString=“Tragbares Medienwiedergabegerät”那么“=0,那么”现在我们可以这样做:
将MyFileInfo设置为System.IO.FileInfo=My.Computer.FileSystem.GetFileInfo(tempFullFileName)
Dim fileDate As Date=MyFileInfo.LastWriteTime
如果“成功”,则结束
如果'else y.IsFolder'结束
下一个y
EnumNamespaceItems=0
端函数
函数CopyHereFileWait(sourceNamespaceObject为对象,targetFolder为字符串)为整数
将fsMyStream设置为System.IO.FileStream
将n1设置为整数
Dim taregetFullFileName作为字符串
n1=Len(targetFolder)
如果Mid(targetFolder,n1,1)=“\”则
targetFolder=Microsoft.VisualBasic.Left(targetFolder,n1-1)
如果结束
taregetFullFileName=targetFolder&“\”&sourceNamespaceObject.Name.ToString
Dim OnTargetFolder作为对象
OnTargetFolder=CreateObject(“Shell.Application”).Namespace(CStr(targetFolder))
OnTargetFolder.copyHere(sourceNamespaceObject)
'立即返回并在后台执行工作
n1=0
做
线程。线程。睡眠(50)'ms
尝试
fsMyStream=System.IO.File.Open(taregetFullFileName、IO.FileMode.Open、IO.FileAccess.ReadWrite)
fsMyStream.Close()
CopyHereFileWait=n1
退出功能
特例
调试.打印(例如消息)
结束尝试
n1=n1+1
n1<400'超时400*50ms=20s时循环
CopyHereFileWait=-n1
端函数
您可以添加以检查具有y.Name.ToString=“DCIM”(on folderLevel=1)的文件夹和具有“.jpg”的文件