6468 lines
233 KiB
Plaintext
6468 lines
233 KiB
Plaintext
(* ImageEn Build 7.0.0.06.2637 @ 7-4-17 14:58:42.679 *)
|
|
(*
|
|
Copyright (c) 1998-2017 by Carlotta Calandra. All rights reserved.
|
|
Copyright (c) 2011-2017 by Xequte Software.
|
|
|
|
This software comes without express or implied warranty.
|
|
In no case shall the author be liable for any damage or unwanted behavior of any
|
|
computer hardware and/or software.
|
|
|
|
Author grants you the right to include the component
|
|
in your application, whether COMMERCIAL, SHAREWARE, or FREEWARE.
|
|
|
|
ImageEn, IEvolution and ImageEn ActiveX may not be included in any
|
|
commercial, shareware or freeware libraries or components.
|
|
|
|
www.ImageEn.com
|
|
*)
|
|
|
|
(*
|
|
File version 1011
|
|
*)
|
|
|
|
unit iexWPD;
|
|
// NPC: 23/10/14
|
|
|
|
{$R-}
|
|
{$Q-}
|
|
|
|
{$I ie.inc}
|
|
|
|
{$IFDEF IEINCLUDEWPD}
|
|
|
|
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
|
|
{$WARN SYMBOL_PLATFORM OFF}
|
|
{$WRITEABLECONST ON}
|
|
{$VARPROPSETTER ON}
|
|
interface
|
|
|
|
uses
|
|
ActiveX, ComObj, ComCtrls, Classes;
|
|
|
|
|
|
|
|
type
|
|
{!!
|
|
<FS>TIEPortableDeviceLogEvent
|
|
|
|
<FM>Declaration<FC>
|
|
}
|
|
TIEPortableDeviceLogEvent = procedure(Sender : TObject; const sMsg : String) of object;
|
|
{!!}
|
|
|
|
type
|
|
|
|
{!!
|
|
<FS>TWPDObjectFormat
|
|
|
|
<FM>Declaration<FC>
|
|
}
|
|
TWPDObjectFormat = (
|
|
_WPD_OBJECT_FORMAT_3GP ,
|
|
_WPD_OBJECT_FORMAT_AAC ,
|
|
_WPD_OBJECT_FORMAT_ABSTRACT_CONTACT ,
|
|
_WPD_OBJECT_FORMAT_ABSTRACT_CONTACT_GROUP ,
|
|
_WPD_OBJECT_FORMAT_ABSTRACT_MEDIA_CAST ,
|
|
_WPD_OBJECT_FORMAT_AIFF ,
|
|
_WPD_OBJECT_FORMAT_ALL ,
|
|
_WPD_OBJECT_FORMAT_ASF ,
|
|
_WPD_OBJECT_FORMAT_ASXPLAYLIST ,
|
|
_WPD_OBJECT_FORMAT_AUDIBLE ,
|
|
_WPD_OBJECT_FORMAT_AVI ,
|
|
_WPD_OBJECT_FORMAT_BMP ,
|
|
_WPD_OBJECT_FORMAT_CIFF ,
|
|
_WPD_OBJECT_FORMAT_DPOF ,
|
|
_WPD_OBJECT_FORMAT_EXECUTABLE ,
|
|
_WPD_OBJECT_FORMAT_EXIF ,
|
|
_WPD_OBJECT_FORMAT_FLAC ,
|
|
_WPD_OBJECT_FORMAT_FLASHPIX ,
|
|
_WPD_OBJECT_FORMAT_GIF ,
|
|
_WPD_OBJECT_FORMAT_HTML ,
|
|
_WPD_OBJECT_FORMAT_ICALENDAR ,
|
|
_WPD_OBJECT_FORMAT_ICON ,
|
|
_WPD_OBJECT_FORMAT_JFIF ,
|
|
_WPD_OBJECT_FORMAT_JP2 ,
|
|
_WPD_OBJECT_FORMAT_JPX ,
|
|
_WPD_OBJECT_FORMAT_M3UPLAYLIST ,
|
|
_WPD_OBJECT_FORMAT_M4A ,
|
|
_WPD_OBJECT_FORMAT_MHT_COMPILED_HTML ,
|
|
_WPD_OBJECT_FORMAT_MICROSOFT_EXCEL ,
|
|
_WPD_OBJECT_FORMAT_MICROSOFT_POWERPOINT ,
|
|
_WPD_OBJECT_FORMAT_MICROSOFT_WFC ,
|
|
_WPD_OBJECT_FORMAT_MICROSOFT_WORD ,
|
|
_WPD_OBJECT_FORMAT_MP2 ,
|
|
_WPD_OBJECT_FORMAT_MP3 ,
|
|
_WPD_OBJECT_FORMAT_MP4 ,
|
|
_WPD_OBJECT_FORMAT_MPEG ,
|
|
_WPD_OBJECT_FORMAT_MPLPLAYLIST ,
|
|
_WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION ,
|
|
_WPD_OBJECT_FORMAT_OGG ,
|
|
_WPD_OBJECT_FORMAT_PCD ,
|
|
_WPD_OBJECT_FORMAT_PICT ,
|
|
_WPD_OBJECT_FORMAT_PLSPLAYLIST ,
|
|
_WPD_OBJECT_FORMAT_PNG ,
|
|
_WPD_OBJECT_FORMAT_PROPERTIES_ONLY ,
|
|
_WPD_OBJECT_FORMAT_SCRIPT ,
|
|
_WPD_OBJECT_FORMAT_TEXT ,
|
|
_WPD_OBJECT_FORMAT_TIFF ,
|
|
_WPD_OBJECT_FORMAT_TIFFEP ,
|
|
_WPD_OBJECT_FORMAT_TIFFIT ,
|
|
_WPD_OBJECT_FORMAT_UNSPECIFIED ,
|
|
_WPD_OBJECT_FORMAT_VCALENDAR1 ,
|
|
_WPD_OBJECT_FORMAT_VCARD2 ,
|
|
_WPD_OBJECT_FORMAT_VCARD3 ,
|
|
_WPD_OBJECT_FORMAT_WAVE ,
|
|
_WPD_OBJECT_FORMAT_WINDOWSIMAGEFORMAT ,
|
|
_WPD_OBJECT_FORMAT_WMA ,
|
|
_WPD_OBJECT_FORMAT_WMV ,
|
|
_WPD_OBJECT_FORMAT_WPLPLAYLIST ,
|
|
_WPD_OBJECT_FORMAT_X509V3CERTIFICATE ,
|
|
_WPD_OBJECT_FORMAT_XML ,
|
|
_WPD_OBJECT_FORMAT_UNKNOWN );
|
|
{!!}
|
|
|
|
|
|
{!!
|
|
<FS>TWPDContentType
|
|
|
|
<FM>Declaration<FC>
|
|
}
|
|
TWPDContentType = (
|
|
_WPD_CONTENT_TYPE_ALL ,
|
|
_WPD_CONTENT_TYPE_APPOINTMENT ,
|
|
_WPD_CONTENT_TYPE_AUDIO ,
|
|
_WPD_CONTENT_TYPE_AUDIO_ALBUM ,
|
|
_WPD_CONTENT_TYPE_CALENDAR ,
|
|
_WPD_CONTENT_TYPE_CERTIFICATE ,
|
|
_WPD_CONTENT_TYPE_CONTACT ,
|
|
_WPD_CONTENT_TYPE_CONTACT_GROUP ,
|
|
_WPD_CONTENT_TYPE_DOCUMENT ,
|
|
_WPD_CONTENT_TYPE_EMAIL ,
|
|
_WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT ,
|
|
_WPD_CONTENT_TYPE_GENERIC_FILE ,
|
|
_WPD_CONTENT_TYPE_GENERIC_MESSAGE ,
|
|
_WPD_CONTENT_TYPE_IMAGE ,
|
|
_WPD_CONTENT_TYPE_IMAGE_ALBUM ,
|
|
_WPD_CONTENT_TYPE_MEDIA_CAST ,
|
|
_WPD_CONTENT_TYPE_MEMO ,
|
|
_WPD_CONTENT_TYPE_MIXED_CONTENT_ALBUM ,
|
|
_WPD_CONTENT_TYPE_NETWORK_ASSOCIATION ,
|
|
_WPD_CONTENT_TYPE_PLAYLIST ,
|
|
_WPD_CONTENT_TYPE_PROGRAM ,
|
|
_WPD_CONTENT_TYPE_SECTION ,
|
|
_WPD_CONTENT_TYPE_TASK ,
|
|
_WPD_CONTENT_TYPE_TELEVISION ,
|
|
_WPD_CONTENT_TYPE_UNSPECIFIED ,
|
|
_WPD_CONTENT_TYPE_VIDEO ,
|
|
_WPD_CONTENT_TYPE_VIDEO_ALBUM ,
|
|
_WPD_CONTENT_TYPE_WIRELESS_PROFILE ,
|
|
_WPD_CONTENT_TYPE_FOLDER ,
|
|
_WPD_CONTENT_TYPE_UNKNOWN );
|
|
{!!}
|
|
|
|
{!!
|
|
<FS>TIEWPDObjectType
|
|
|
|
<FM>Declaration<FC>
|
|
}
|
|
TIEWPDObjectType = (iewFile, iewFolder);
|
|
{!!}
|
|
|
|
{!!
|
|
<FS>TIEWPDObjectTypes
|
|
|
|
<FM>Declaration<FC>
|
|
TIEWPDObjectTypes = set of <A TIEWPDObjectType>;
|
|
!!}
|
|
TIEWPDObjectTypes = set of TIEWPDObjectType;
|
|
|
|
{!!
|
|
<FS>TIEPortableDevice
|
|
|
|
<FM>Declaration<FC>
|
|
}
|
|
TIEPortableDevice = Record
|
|
ID : WideString;
|
|
FriendlyName : WideString;
|
|
Description : WideString;
|
|
Manufacturer : WideString;
|
|
IsDrive : Boolean; // True if it a removable drive, false for devices, such as smart phones
|
|
end;
|
|
{!!}
|
|
PIEPortableDevice = ^TIEPortableDevice;
|
|
|
|
|
|
{!!
|
|
<FS>TIEWPDObject
|
|
|
|
<FM>Declaration<FC>
|
|
TIEWPDObject = Record
|
|
ID : WideString;
|
|
FriendlyName : WideString; // The WPD name. A file without an extension - Best for folders
|
|
Filename : WideString; // Original name in WPD. Name of file with extension (but without a path) - Best for files
|
|
Path : WideString;
|
|
ObjectType : <A TIEWPDObjectType>;
|
|
end;
|
|
!!}
|
|
TIEWPDObject = Record
|
|
ID : WideString;
|
|
FriendlyName : WideString; // The WPD name. A file without an extension
|
|
Filename : WideString; // Original name in WPD. Name of file with extension (but without a path)
|
|
Path : WideString;
|
|
ObjectType : TIEWPDObjectType;
|
|
end;
|
|
PIEWPDObject = ^TIEWPDObject;
|
|
|
|
{!!
|
|
<FS>TIEWPDObjectAdvancedProps
|
|
|
|
<FM>Declaration<FC>
|
|
TIEWPDObjectAdvancedProps = Record
|
|
ObjectID : WideString;
|
|
ParentID : WideString;
|
|
FriendlyName : WideString; // The WPD name. A file without an extension - Best for folders
|
|
Filename : WideString; // Original name in WPD. Name of file with extension (but without a path) - Best for files
|
|
PersistentUniqueID : WideString;
|
|
ObjectFormat : <A TWPDObjectFormat>;
|
|
ContentType : <A TWPDContentType>;
|
|
IsHidden : Boolean;
|
|
IsSystem : Boolean;
|
|
DateCreated : TDateTime;
|
|
DateModified : TDateTime;
|
|
SizeBytes : Largeuint; // Is Int64
|
|
end;
|
|
!!}
|
|
TIEWPDObjectAdvancedProps = Record
|
|
ObjectID : WideString;
|
|
ParentID : WideString;
|
|
FriendlyName : WideString;
|
|
Filename : WideString;
|
|
PersistentUniqueID : WideString;
|
|
ObjectFormat : TWPDObjectFormat;
|
|
ContentType : TWPDContentType;
|
|
IsHidden : Boolean;
|
|
IsSystem : Boolean;
|
|
DateCreated : TDateTime;
|
|
DateModified : TDateTime;
|
|
SizeBytes : Largeuint;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices
|
|
|
|
<FM>Description<FN>
|
|
An implementation of Windows Portable Devices API, which provides access to connected devices and external drives. It is used in ImageEn by the <A TIEDcimAcquire> class for acquisition of images from devices.
|
|
|
|
<FM>Demos<FN>
|
|
<TABLE2>
|
|
<R> <C_IMG_DEMO> <C>Demos\ImageAcquisition\AllAcquire\AllAcquire.dpr </C> </R>
|
|
<R> <C_IMG_DEMO> <C>Demos\ImageAcquisition\PortableDevices\WPDDemo.dpr </C> </R>
|
|
</TABLE>
|
|
|
|
<FM>Properties<FN>
|
|
<TABLE2>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEPortableDevices.ActiveDeviceID></C> </R>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEPortableDevices.ActiveFolderID></C> </R>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEPortableDevices.CanNavigateToParent></C> </R>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEPortableDevices.HideEmptyDevices></C> </R>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEPortableDevices.Devices></C> </R>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEPortableDevices.DeviceCount></C> </R>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEPortableDevices.Objects></C> </R>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEPortableDevices.ObjectCount></C> </R>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEPortableDevices.LastError></C> </R>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEPortableDevices.Sorted></C> </R>
|
|
</TABLE>
|
|
|
|
<FM>Methods<FN>
|
|
<TABLE2>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.Create></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.Destroy></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.Cancel></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.CopyFileToDevice></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.CopyFileFromDevice></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.CopyStreamFromDevice></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.DeleteFromDevice></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.DeviceIDToIndex></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.FindFilesByName></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.FindFilesOfType></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.GetObjectAdvancedProps></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.ObjectIDToIndex></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.ObjectIsFolder></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.LookupDeviceFriendlyName></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.LookupObjectFriendlyName></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.NavigateToFolderID></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.NavigateToFolderPath></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.NavigateToParent></C> </R>
|
|
<R> <C_IMG_METHOD> <C><A TIEPortableDevices.RefreshDevices></C> </R>
|
|
</TABLE>
|
|
|
|
<FM>Events<FN>
|
|
<TABLE2>
|
|
<R> <C_IMG_EVENT> <C><A TIEPortableDevices.OnLog></C> </R>
|
|
</TABLE>
|
|
|
|
!!}
|
|
TIEPortableDevices = class
|
|
private
|
|
fDevices : TList;
|
|
fObjects : TList;
|
|
fDevicesInitialized : Boolean;
|
|
fObjectsInitialized : Boolean;
|
|
fSorted : Boolean;
|
|
fOnLog : TIEPortableDeviceLogEvent;
|
|
fLastError : String;
|
|
fActiveDeviceID: WideString;
|
|
fActiveFolderID: WideString;
|
|
fHideEmptyDevices : Boolean;
|
|
|
|
procedure Clear();
|
|
procedure ClearObjectList();
|
|
function DeviceContainsObjects(const sDeviceID : WideString) : Boolean;
|
|
procedure AddToLog(const sMsg : String);
|
|
function GetDevices(Index: Integer): TIEPortableDevice;
|
|
function GetDeviceCount: Integer;
|
|
procedure CheckDevicesInitialized();
|
|
function GetObjects(Index: Integer): TIEWPDObject;
|
|
function GetObjectCount: Integer;
|
|
procedure CheckObjectsInitialized();
|
|
procedure SetActiveDeviceID(const Value: WideString);
|
|
procedure SetActiveFolderID(const Value: WideString);
|
|
function GetCanNavigateToParent: Boolean;
|
|
|
|
public
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.Create
|
|
|
|
<FM>Declaration<FC>
|
|
}
|
|
constructor Create();
|
|
{!!}
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.Destroy
|
|
|
|
<FM>Declaration<FC>
|
|
}
|
|
destructor Destroy(); override;
|
|
{!!}
|
|
|
|
property ActiveDeviceID : WideString read fActiveDeviceID write SetActiveDeviceID;
|
|
property ActiveFolderID : WideString read fActiveFolderID write SetActiveFolderID;
|
|
|
|
function RefreshDevices(): Boolean;
|
|
property Devices[Index: Integer]: TIEPortableDevice read GetDevices;
|
|
property DeviceCount : Integer read GetDeviceCount;
|
|
function DeviceIDToIndex(const sDeviceID : WideString) : Integer;
|
|
|
|
function NavigateToFolderID(const sFolderID : WideString; bIncludeSubFolders : Boolean = False; GetTypes: TIEWPDObjectTypes = [iewFile, iewFolder]) : Boolean; overload;
|
|
function NavigateToFolderID(const sDeviceID, sFolderID : WideString; bIncludeSubFolders : Boolean = False; GetTypes: TIEWPDObjectTypes = [iewFile, iewFolder]) : Boolean; overload;
|
|
function NavigateToFolderPath(const sPath : WideString; bIncludeSubFolders : Boolean = False; GetTypes: TIEWPDObjectTypes = [iewFile, iewFolder]) : Boolean; overload;
|
|
function NavigateToFolderPath(const sDeviceID, sPath : WideString; bIncludeSubFolders : Boolean = False; GetTypes: TIEWPDObjectTypes = [iewFile, iewFolder]) : Boolean; overload;
|
|
function FindFilesOfType(const sDeviceID, sFolderID : WideString; sFileExtensions: String; iMaxDepth : Integer = 0): Boolean; overload;
|
|
function FindFilesOfType(const sFolderID : WideString; sFileExtensions: String; iMaxDepth : Integer = 0): Boolean; overload;
|
|
function FindFilesByName(const sDeviceID, sFolderID, sSearchText: WideString; GetTypes: TIEWPDObjectTypes = [iewFile, iewFolder]; iMaxDepth : Integer = 0): Boolean; overload;
|
|
function FindFilesByName(const sFolderID, sSearchText: WideString; GetTypes: TIEWPDObjectTypes = [iewFile, iewFolder]; iMaxDepth : Integer = 0): Boolean; overload;
|
|
function NavigateToParent() : Boolean;
|
|
|
|
property Objects[Index: Integer]: TIEWPDObject read GetObjects;
|
|
property ObjectCount : Integer read GetObjectCount;
|
|
function ObjectIDToIndex(const sObjectID : WideString) : Integer;
|
|
function ObjectIsFolder(const sObjectID : WideString) : Boolean; overload;
|
|
function ObjectIsFolder(Index: Integer): Boolean; overload;
|
|
function GetObjectAdvancedProps(const sObjectID: WideString; out DestProps : TIEWPDObjectAdvancedProps): Boolean; overload;
|
|
function GetObjectAdvancedProps(Index: Integer; out DestProps : TIEWPDObjectAdvancedProps): Boolean; overload;
|
|
function GetObjectAdvancedProps(const sDeviceID, sObjectID: WideString; out DestProps : TIEWPDObjectAdvancedProps): Boolean; overload;
|
|
|
|
function CopyFileFromDevice(const sDeviceID, sObjectID, sDestFilename: WideString): Boolean;
|
|
function CopyStreamFromDevice(const sDeviceID, sObjectID: WideString; var ssDestStream: TMemoryStream): Boolean;
|
|
function Cancel(): Boolean;
|
|
function CopyFileToDevice(const sDeviceID, sFolderID, sSourceFilename: WideString): Boolean;
|
|
function DeleteFromDevice(const sDeviceID, sObjectID : WideString; bDeleteSubObjects: Boolean; var sResultText: WideString): Integer; overload;
|
|
function DeleteFromDevice(const sDeviceID, sObjectID : WideString; bDeleteSubObjects: Boolean = True): Integer; overload;
|
|
function DeleteFromDevice(const sDeviceID : WideString; ssObjectIDs : TStrings; bDeleteSubObjects: Boolean = True): Integer; overload;
|
|
function DeleteFromDevice(const sDeviceID : WideString; ssObjectIDs : TStrings; bDeleteSubObjects: Boolean; var sResultText: WideString): Integer; overload;
|
|
|
|
function LookupDeviceFriendlyName(const sDeviceID : WideString): WideString;
|
|
function LookupObjectFriendlyName(const sObjectID : WideString): WideString; overload;
|
|
function LookupObjectFriendlyName(const sDeviceID, sObjectID : WideString): WideString; overload;
|
|
|
|
function PathToFolderID(const sPath : WideString) : WideString; overload;
|
|
function PathToFolderID(const sDeviceID, sPath : WideString) : WideString; overload;
|
|
|
|
{$IFDEF DEBUG}
|
|
function EnumDeviceProperties(const sDeviceID : WideString; ssDest : TStrings) : Boolean;
|
|
{$ENDIF}
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.LastError
|
|
|
|
<FM>Declaration<FC>
|
|
property LastError : String; (Read-only)
|
|
|
|
<FM>Description<FN>
|
|
Returns detail on the last failure that occured.
|
|
|
|
When calling a WPD method, such as <A TIEPortableDevices.NavigateToFolderID>, a false result will indicate failure. Read <FC>LastError<FN> to access detail of the failure.
|
|
|
|
<FM>Example<FC>
|
|
if IEPortableDevices.RefreshDevices = False then
|
|
ShowMessage('Unable to get devices: ' + IEPortableDevices.LastError);
|
|
!!}
|
|
property LastError : String read fLastError;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.OnLog
|
|
|
|
<FM>Declaration<FC>
|
|
property OnLog : <A TIEPortableDeviceLogEvent>;
|
|
|
|
<FM>Description<FN>
|
|
Specify an OnLog handler to receive debugging information.
|
|
|
|
<FM>Example<FC>
|
|
procedure TfrmMain.FormCreate(Sender: TObject);
|
|
begin
|
|
fPortableDevices := TIEPortableDevices.Create();
|
|
fPortableDevices.OnLog := AddToLog;
|
|
end;
|
|
|
|
procedure TfrmMain.AddToLog(Sender : TObject; const sMsg : String);
|
|
begin
|
|
memLog.Lines.Add( sMsg );
|
|
end;
|
|
!!}
|
|
property OnLog : TIEPortableDeviceLogEvent read fOnLog write fOnLog;
|
|
|
|
property CanNavigateToParent : Boolean read GetCanNavigateToParent;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.Sorted
|
|
|
|
<FM>Declaration<FC>
|
|
property Sorted : Boolean; (Read/Write)
|
|
|
|
<FM>Description<FN>
|
|
When enabled, the returned <L TIEPortableDevices.Objects>list of objects</L> will be sorted alphabetically (also folders before files).
|
|
|
|
Default: True
|
|
!!}
|
|
property Sorted : Boolean read fSorted write fSorted;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.HideEmptyDevices
|
|
|
|
<FM>Declaration<FC>
|
|
property HideEmptyDevices : Boolean; (Read/Write)
|
|
|
|
<FM>Description<FN>
|
|
When enabled, the <L TIEPortableDevices.Devices>list of devices</L> will exclude any devices that are not available or are empty.
|
|
|
|
Default: False
|
|
|
|
Note: You will need to <A TIEDcimAcquire.Refresh> the device list after changing <FC>HideEmptyDevices<FN>.
|
|
!!}
|
|
property HideEmptyDevices : Boolean read fHideEmptyDevices write fHideEmptyDevices;
|
|
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
SysUtils, Windows, Variants, Controls, hyieutils, OleServer, hyiedefs;
|
|
|
|
type
|
|
TLogger = procedure(const sMsg : String) of object;
|
|
|
|
const
|
|
CLASS_PortableDeviceValues: TGUID = '{0c15d503-d017-47ce-9016-7b3f978721cc}';
|
|
CLASS_PortableDevicePropVariantCollection: TGUID = '{08a99e2f-6d6d-4b80-af5a-baf2bcbe4cb9}';
|
|
CLSID_PortableDeviceKeyCollection: TGUID = '{de2d022d-2480-43be-97f0-d1fa2cf98f4f}';
|
|
|
|
{$IFDEF DEBUG}
|
|
WPD_CATEGORY_CAPABILITIES : TGuid = '{0cabec78-6b74-41c6-9216-2639d1fce356}';
|
|
WPD_CATEGORY_COMMON : TGuid = '{f0422a9c-5dc8-4440-b5bd-5df28835658a}';
|
|
WPD_CATEGORY_DEVICE_HINTS : TGuid = '{0d5fb92b-cb46-4c4f-8343-0bc3d3f17c84}';
|
|
WPD_CATEGORY_MEDIA_CAPTURE : TGuid = '{59b433ba-fe44-4d8d-808c-6bcb9b0f15e8}';
|
|
WPD_CATEGORY_NETWORK_CONFIGURATION : TGuid = '{78f9c6fc-79b8-473c-9060-6bd23dd072c4}';
|
|
WPD_CATEGORY_NULL : TGuid = '{00000000-0000-0000-0000-000000000000}';
|
|
WPD_CATEGORY_OBJECT_ENUMERATION : TGuid = '{b7474e91-e7f8-4ad9-b400-ad1a4b58eeec}';
|
|
WPD_CATEGORY_OBJECT_MANAGEMENT : TGuid = '{ef1e43dd-a9ed-4341-8bcc-186192aea089}';
|
|
WPD_CATEGORY_OBJECT_PROPERTIES : TGuid = '{9e5582e4-0814-44e6-981a-b2998d583804}';
|
|
WPD_CATEGORY_OBJECT_PROPERTIES_BULK : TGuid = '{11c824dd-04cd-4e4e-8c7b-f6efb794d84e}';
|
|
WPD_CATEGORY_OBJECT_RESOURCES : TGuid = '{b3a2b22d-a595-4108-be0a-fc3c965f3d4a}';
|
|
WPD_CATEGORY_SERVICE_CAPABILITIES : TGuid = '{24457e74-2e9f-44f9-8c57-1d1bcb170b89}';
|
|
WPD_CATEGORY_SERVICE_COMMON : TGuid = '{322f071d-36ef-477f-b4b5-6f52d734baee}';
|
|
WPD_CATEGORY_SERVICE_METHODS : TGuid = '{2d521ca8-c1b0-4268-a342-cf19321569bc}';
|
|
WPD_CATEGORY_SMS : TGuid = '{afc25d66-fe0d-4114-9097-970c93e920d1}';
|
|
WPD_CATEGORY_STILL_IMAGE_CAPTURE : TGuid = '{4fcd6982-22a2-4b05-a48b-62d38bf27b32}';
|
|
WPD_CATEGORY_STORAGE : TGuid = '{d8f907a6-34cc-45fa-97fb-d007fa47ec94}';
|
|
{$ENDIF}
|
|
|
|
WPD_CONTENT_TYPE_ALL : TGuid = '{80e170d2-1055-4a3e-b952-82cc4f8a8689}';
|
|
WPD_CONTENT_TYPE_APPOINTMENT : TGuid = '{0fed060e-8793-4b1e-90c9-48ac389ac631}';
|
|
WPD_CONTENT_TYPE_AUDIO : TGuid = '{4ad2c85e-5e2d-45e5-8864-4f229e3c6cf0}';
|
|
WPD_CONTENT_TYPE_AUDIO_ALBUM : TGuid = '{aa18737e-5009-48fa-ae21-85f24383b4e6}';
|
|
WPD_CONTENT_TYPE_CALENDAR : TGuid = '{a1fd5967-6023-49a0-9df1-f8060be751b0}';
|
|
WPD_CONTENT_TYPE_CERTIFICATE : TGuid = '{dc3876e8-a948-4060-9050-cbd77e8a3d87}';
|
|
WPD_CONTENT_TYPE_CONTACT : TGuid = '{eaba8313-4525-4707-9f0e-87c6808e9435}';
|
|
WPD_CONTENT_TYPE_CONTACT_GROUP : TGuid = '{346b8932-4c36-40d8-9415-1828291f9de9}';
|
|
WPD_CONTENT_TYPE_DOCUMENT : TGuid = '{680adf52-950a-4041-9b41-65e393648155}';
|
|
WPD_CONTENT_TYPE_EMAIL : TGuid = '{8038044a-7e51-4f8f-883d-1d0623d14533}';
|
|
WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT : TGuid = '{99ed0160-17ff-4c44-9d98-1d7a6f941921}';
|
|
WPD_CONTENT_TYPE_GENERIC_FILE : TGuid = '{0085e0a6-8d34-45d7-bc5c-447e59c73d48}';
|
|
WPD_CONTENT_TYPE_GENERIC_MESSAGE : TGuid = '{e80eaaf8-b2db-4133-b67e-1bef4b4a6e5f}';
|
|
WPD_CONTENT_TYPE_IMAGE : TGuid = '{ef2107d5-a52a-4243-a26b-62d4176d7603}';
|
|
WPD_CONTENT_TYPE_IMAGE_ALBUM : TGuid = '{75793148-15f5-4a30-a813-54ed8a37e226}';
|
|
WPD_CONTENT_TYPE_MEDIA_CAST : TGuid = '{5e88b3cc-3e65-4e62-bfff-229495253ab0}';
|
|
WPD_CONTENT_TYPE_MEMO : TGuid = '{9cd20ecf-3b50-414f-a641-e473ffe45751}';
|
|
WPD_CONTENT_TYPE_MIXED_CONTENT_ALBUM : TGuid = '{00f0c3ac-a593-49ac-9219-24abca5a2563}';
|
|
WPD_CONTENT_TYPE_NETWORK_ASSOCIATION : TGuid = '{031da7ee-18c8-4205-847e-89a11261d0f3}';
|
|
WPD_CONTENT_TYPE_PLAYLIST : TGuid = '{1a33f7e4-af13-48f5-994e-77369dfe04a3}';
|
|
WPD_CONTENT_TYPE_PROGRAM : TGuid = '{d269f96a-247c-4bff-98fb-97f3c49220e6}';
|
|
WPD_CONTENT_TYPE_SECTION : TGuid = '{821089f5-1d91-4dc9-be3c-bbb1b35b18ce}';
|
|
WPD_CONTENT_TYPE_TASK : TGuid = '{63252f2c-887f-4cb6-b1ac-d29855dcef6c}';
|
|
WPD_CONTENT_TYPE_TELEVISION : TGuid = '{60a169cf-f2ae-4e21-9375-9677f11c1c6e}';
|
|
WPD_CONTENT_TYPE_UNSPECIFIED : TGuid = '{28d8d31e-249c-454e-aabc-34883168e634}';
|
|
WPD_CONTENT_TYPE_VIDEO : TGuid = '{9261b03c-3d78-4519-85e3-02c5e1f50bb9}';
|
|
WPD_CONTENT_TYPE_VIDEO_ALBUM : TGuid = '{012b0db7-d4c1-45d6-b081-94b87779614f}';
|
|
WPD_CONTENT_TYPE_WIRELESS_PROFILE : TGuid = '{0bac070a-9f5f-4da4-a8f6-3de44d68fd6c}';
|
|
WPD_CONTENT_TYPE_FOLDER : TGuid = '{27E2E392-A111-48E0-AB0C-E17705A05F85}';
|
|
|
|
{$IFDEF DEBUG}
|
|
WPD_FUNCTIONAL_CATEGORY_ALL : TGuid = '{2d8a6512-a74c-448e-ba8a-f4ac07c49399}';
|
|
WPD_FUNCTIONAL_CATEGORY_AUDIO_CAPTURE : TGuid = '{3f2a1919-c7c2-4a00-855d-f57cf06debbb}';
|
|
WPD_FUNCTIONAL_CATEGORY_DEVICE : TGuid = '{08ea466b-e3a4-4336-a1f3-a44d2b5c438c}';
|
|
WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION : TGuid = '{48f4db72-7c6a-4ab0-9e1a-470e3cdbf26a}';
|
|
WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION : TGuid = '{08600ba4-a7ba-4a01-ab0e-0065d0a356d3}';
|
|
WPD_FUNCTIONAL_CATEGORY_SMS : TGuid = '{0044a0b1-c1e9-4afd-b358-a62c6117c9cf}';
|
|
WPD_FUNCTIONAL_CATEGORY_STILL_IMAGE_CAPTURE : TGuid = '{613ca327-ab93-4900-b4fa-895bb5874b79}';
|
|
WPD_FUNCTIONAL_CATEGORY_STORAGE : TGuid = '{23f05bbc-15de-4c2a-a55b-a9af5ce412ef}';
|
|
WPD_FUNCTIONAL_CATEGORY_VIDEO_CAPTURE : TGuid = '{e23e5f6b-7243-43aa-8df1-0eb3d968a918}';
|
|
WPD_FUNCTIONAL_OBJECT_PROPERTIES_V1 : TGuid = '{8f052d93-abca-4fc5-a5ac-b01df4dbe598}';
|
|
{$ENDIF}
|
|
|
|
WPD_OBJECT_FORMAT_3GP : TGuid = '{b9840000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_AAC : TGuid = '{b9030000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_ABSTRACT_CONTACT : TGuid = '{bb810000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_ABSTRACT_CONTACT_GROUP : TGuid = '{ba060000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_ABSTRACT_MEDIA_CAST : TGuid = '{ba0b0000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_AIFF : TGuid = '{30070000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_ALL : TGuid = '{c1f62eb2-4bb3-479c-9cfa-05b5f3a57b22}';
|
|
WPD_OBJECT_FORMAT_ASF : TGuid = '{300c0000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_ASXPLAYLIST : TGuid = '{ba130000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_AUDIBLE : TGuid = '{b9040000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_AVI : TGuid = '{300a0000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_BMP : TGuid = '{38040000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_CIFF : TGuid = '{38050000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_DPOF : TGuid = '{30060000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_EXECUTABLE : TGuid = '{30030000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_EXIF : TGuid = '{38010000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_FLAC : TGuid = '{b9060000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_FLASHPIX : TGuid = '{38030000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_GIF : TGuid = '{38070000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_HTML : TGuid = '{30050000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_ICALENDAR : TGuid = '{be030000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_ICON : TGuid = '{077232ed-102c-4638-9c22-83f142bfc822}';
|
|
WPD_OBJECT_FORMAT_JFIF : TGuid = '{38080000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_JP2 : TGuid = '{380f0000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_JPX : TGuid = '{38100000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_M3UPLAYLIST : TGuid = '{ba110000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_M4A : TGuid = '{30aba7ac-6ffd-4c23-a359-3e9b52f3f1c8}';
|
|
WPD_OBJECT_FORMAT_MHT_COMPILED_HTML : TGuid = '{ba840000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_MICROSOFT_EXCEL : TGuid = '{ba850000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_MICROSOFT_POWERPOINT : TGuid = '{ba860000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_MICROSOFT_WFC : TGuid = '{b1040000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_MICROSOFT_WORD : TGuid = '{ba830000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_MP2 : TGuid = '{b9830000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_MP3 : TGuid = '{30090000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_MP4 : TGuid = '{b9820000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_MPEG : TGuid = '{300b0000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_MPLPLAYLIST : TGuid = '{ba120000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION : TGuid = '{b1020000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_OGG : TGuid = '{b9020000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_PCD : TGuid = '{38090000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_PICT : TGuid = '{380a0000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_PLSPLAYLIST : TGuid = '{ba140000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_PNG : TGuid = '{380b0000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_PROPERTIES_ONLY : TGuid = '{30010000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_SCRIPT : TGuid = '{30020000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_TEXT : TGuid = '{30040000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_TIFF : TGuid = '{380d0000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_TIFFEP : TGuid = '{38020000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_TIFFIT : TGuid = '{380e0000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_UNSPECIFIED : TGuid = '{30000000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_VCALENDAR1 : TGuid = '{be020000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_VCARD2 : TGuid = '{bb820000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_VCARD3 : TGuid = '{bb830000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_WAVE : TGuid = '{30080000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_WINDOWSIMAGEFORMAT : TGuid = '{b8810000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_WMA : TGuid = '{b9010000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_WMV : TGuid = '{b9810000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_WPLPLAYLIST : TGuid = '{ba100000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_X509V3CERTIFICATE : TGuid = '{b1030000-ae6c-4804-98ba-c57b46965fe7}';
|
|
WPD_OBJECT_FORMAT_XML : TGuid = '{ba820000-ae6c-4804-98ba-c57b46965fe7}';
|
|
|
|
WPD_PROPERTY_NULL_FMTID : TGuid = '{00000000-0000-0000-0000-000000000000}';
|
|
WPD_PROPERTY_NULL_PID = 0;
|
|
|
|
WPD_OBJECT_ID_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_ID_PID = 2;
|
|
|
|
WPD_OBJECT_PARENT_ID_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_PARENT_ID_PID = 3;
|
|
|
|
WPD_OBJECT_NAME_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_NAME_PID = 4;
|
|
|
|
WPD_OBJECT_PERSISTENT_UNIQUE_ID_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_PERSISTENT_UNIQUE_ID_PID = 5;
|
|
|
|
WPD_OBJECT_FORMAT_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_FORMAT_PID = 6;
|
|
|
|
WPD_OBJECT_CONTENT_TYPE_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_CONTENT_TYPE_PID = 7;
|
|
|
|
WPD_OBJECT_ISHIDDEN_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_ISHIDDEN_PID = 9;
|
|
|
|
WPD_OBJECT_ISSYSTEM_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_ISSYSTEM_PID = 10;
|
|
|
|
WPD_OBJECT_SIZE_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_SIZE_PID = 11;
|
|
|
|
WPD_OBJECT_ORIGINAL_FILE_NAME_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_ORIGINAL_FILE_NAME_PID = 12;
|
|
|
|
WPD_OBJECT_NON_CONSUMABLE_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_NON_CONSUMABLE_PID = 13;
|
|
|
|
WPD_OBJECT_REFERENCES_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_REFERENCES_PID = 14;
|
|
|
|
WPD_OBJECT_KEYWORDS_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_KEYWORDS_PID = 15;
|
|
|
|
WPD_OBJECT_SYNC_ID_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_SYNC_ID_PID = 16;
|
|
|
|
WPD_OBJECT_IS_DRM_PROTECTED_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_IS_DRM_PROTECTED_PID = 17;
|
|
|
|
WPD_OBJECT_DATE_CREATED_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_DATE_CREATED_PID = 18;
|
|
|
|
WPD_OBJECT_DATE_MODIFIED_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_DATE_MODIFIED_PID = 19;
|
|
|
|
WPD_OBJECT_DATE_AUTHORED_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_DATE_AUTHORED_PID = 20;
|
|
|
|
WPD_OBJECT_BACK_REFERENCES_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_BACK_REFERENCES_PID = 21;
|
|
|
|
WPD_OBJECT_CONTAINER_FUNCTIONAL_OBJECT_ID_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_CONTAINER_FUNCTIONAL_OBJECT_ID_PID = 23;
|
|
|
|
WPD_OBJECT_GENERATE_THUMBNAIL_FROM_RESOURCE_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_GENERATE_THUMBNAIL_FROM_RESOURCE_PID = 24;
|
|
|
|
WPD_OBJECT_HINT_LOCATION_DISPLAY_NAME_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_HINT_LOCATION_DISPLAY_NAME_PID = 25;
|
|
|
|
WPD_OBJECT_CAN_DELETE_FMTID : TGuid = '{EF6B490D-5CD8-437A-AFFC-DA8B60EE4A3C}';
|
|
WPD_OBJECT_CAN_DELETE_PID = 26;
|
|
|
|
|
|
WPD_CLIENT_NAME_FMTID : TGuid = '{204D9F0C-2292-4080-9F42-40664E70F859}';
|
|
WPD_CLIENT_NAME_PID = 2;
|
|
|
|
WPD_CLIENT_MAJOR_VERSION_FMTID : TGuid = '{204D9F0C-2292-4080-9F42-40664E70F859}';
|
|
WPD_CLIENT_MAJOR_VERSION_PID = 3;
|
|
|
|
WPD_CLIENT_MINOR_VERSION_FMTID : TGuid = '{204D9F0C-2292-4080-9F42-40664E70F859}';
|
|
WPD_CLIENT_MINOR_VERSION_PID = 4;
|
|
|
|
WPD_CLIENT_REVISION_FMTID : TGuid = '{204D9F0C-2292-4080-9F42-40664E70F859}';
|
|
WPD_CLIENT_REVISION_PID = 5;
|
|
|
|
WPD_CLIENT_DESIRED_ACCESS_FMTID : TGuid = '{204D9F0C-2292-4080-9F42-40664E70F859}';
|
|
WPD_CLIENT_DESIRED_ACCESS_PID = 9;
|
|
|
|
WPD_DEVICE_FRIENDLY_NAME_FMTID : TGuid = '{26D4979A-E643-4626-9E2B-736DC0C92FDC}';
|
|
WPD_DEVICE_FRIENDLY_NAME_PID = 12;
|
|
|
|
|
|
WPD_RESOURCE_DEFAULT_FMTID : TGuid = '{E81E79BE-34F0-41BF-B53F-F1A06AE87842}';
|
|
WPD_RESOURCE_DEFAULT_PID = 0;
|
|
|
|
|
|
WPD_PROPERTY_ATTRIBUTE_FORM_FMTID : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTE_FORM_PID = 2;
|
|
|
|
WPD_PROPERTY_ATTRIBUTE_CAN_READ_FMTID : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTE_CAN_READ_PID = 3;
|
|
|
|
WPD_PROPERTY_ATTRIBUTE_CAN_WRITE_FMTID : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTE_CAN_WRITE_PID = 4;
|
|
|
|
WPD_PROPERTY_ATTRIBUTE_CAN_DELETE_FMTID : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTE_CAN_DELETE_PID = 5;
|
|
|
|
WPD_PROPERTY_ATTRIBUTE_DEFAULT_VALUE_FMTID : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTE_DEFAULT_VALUE_PID = 6;
|
|
|
|
WPD_PROPERTY_ATTRIBUTE_FAST_PROPERTY_FMTID : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTE_FAST_PROPERTY_PID = 7;
|
|
|
|
WPD_PROPERTY_ATTRIBUTE_RANGE_MIN_FMTID : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTE_RANGE_MIN_PID = 8;
|
|
|
|
WPD_PROPERTY_ATTRIBUTE_RANGE_MAX_FMTID : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTE_RANGE_MAX_PID = 9;
|
|
|
|
WPD_PROPERTY_ATTRIBUTE_RANGE_STEP_FMTID : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTE_RANGE_STEP_PID = 10;
|
|
|
|
WPD_PROPERTY_ATTRIBUTE_ENUMERATION_ELEMENTS_FMTID : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTE_ENUMERATION_ELEMENTS_PID = 11;
|
|
|
|
WPD_PROPERTY_ATTRIBUTE_REGULAR_EXPRESSION_FMTID : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTE_REGULAR_EXPRESSION_PID = 12;
|
|
|
|
WPD_PROPERTY_ATTRIBUTE_MAX_SIZE_FMTID : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTE_MAX_SIZE_PID = 13;
|
|
|
|
WPD_DEVICE_OBJECT_ID = 'DEVICE';
|
|
|
|
(*
|
|
OTHER WPD CONSTS
|
|
|
|
GUID_DEVINTERFACE_WPD : TGuid = '{6ac27878-a6fa-4155-ba85-f98f491d4f33}';
|
|
GUID_DEVINTERFACE_WPD_PRIVATE : TGuid = '{ba0c718f-4ded-49b7-bdd3-fabe28661211}';
|
|
GUID_DEVINTERFACE_WPD_SERVICE : TGuid = '{9ef44f80-3d64-4246-a6aa-206f328d1edc}';
|
|
WPD_API_OPTIONS_V1 : TGuid = '{10e54a3e-052d-4777-a13c-de7614be2bc4}';
|
|
WPD_APPOINTMENT_OBJECT_PROPERTIES_V1 : TGuid = '{f99efd03-431d-40d8-a1c9-4e220d9c88d3}';
|
|
|
|
WPD_CLASS_EXTENSION_OPTIONS_V1 : TGuid = '{6309ffef-a87c-4ca7-8434-797576e40a96}';
|
|
WPD_CLASS_EXTENSION_OPTIONS_V2 : TGuid = '{3e3595da-4d71-49fe-a0b4-d4406c3ae93f}';
|
|
WPD_CLASS_EXTENSION_V1 : TGuid = '{33fb0d11-64a3-4fac-b4c7-3dfeaa99b051}';
|
|
WPD_CLASS_EXTENSION_V2 : TGuid = '{7f0779b5-fa2b-4766-9cb2-f73ba30b6758}';
|
|
WPD_CLIENT_INFORMATION_PROPERTIES_V1 : TGuid = '{204d9f0c-2292-4080-9f42-40664e70f859}';
|
|
WPD_COMMON_INFORMATION_OBJECT_PROPERTIES_V1 : TGuid = '{b28ae94b-05a4-4e8e-be01-72cc7e099d8f}';
|
|
WPD_PROPERTY_COMMON_COMMAND_CATEGORY : TGuid = '{4d545058-1a2e-4106-a357-771e0819fc56}';
|
|
WPD_CONTACT_OBJECT_PROPERTIES_V1 : TGuid = '{fbd4fdab-987d-4777-b3f9-726185a9312b}';
|
|
|
|
WPD_DEVICE_PROPERTIES_V1 : TGuid = '{26d4979a-e643-4626-9e2b-736dc0c92fdc}';
|
|
WPD_DEVICE_PROPERTIES_V2 : TGuid = '{463dd662-7fc4-4291-911c-7f4c9cca9799}';
|
|
WPD_DOCUMENT_OBJECT_PROPERTIES_V1 : TGuid = '{0b110203-eb95-4f02-93e0-97c631493ad5}';
|
|
WPD_EMAIL_OBJECT_PROPERTIES_V1 : TGuid = '{41f8f65a-5484-4782-b13d-4740dd7c37c5}';
|
|
WPD_EVENT_ATTRIBUTES_V1 : TGuid = '{10c96578-2e81-4111-adde-e08ca6138f6d}';
|
|
WPD_EVENT_DEVICE_CAPABILITIES_UPDATED : TGuid = '{36885aa1-cd54-4daa-b3d0-afb3e03f5999}';
|
|
WPD_EVENT_DEVICE_REMOVED : TGuid = '{e4cbca1b-6918-48b9-85ee-02be7c850af9}';
|
|
WPD_EVENT_DEVICE_RESET : TGuid = '{7755cf53-c1ed-44f3-b5a2-451e2c376b27}';
|
|
WPD_EVENT_OBJECT_ADDED : TGuid = '{a726da95-e207-4b02-8d44-bef2e86cbffc}';
|
|
WPD_EVENT_OBJECT_REMOVED : TGuid = '{be82ab88-a52c-4823-96e5-d0272671fc38}';
|
|
WPD_EVENT_OBJECT_TRANSFER_REQUESTED : TGuid = '{8d16a0a1-f2c6-41da-8f19-5e53721adbf2}';
|
|
WPD_EVENT_OBJECT_UPDATED : TGuid = '{1445a759-2e01-485d-9f27-ff07dae697ab}';
|
|
WPD_EVENT_OPTIONS_V1 : TGuid = '{b3d8dad7-a361-4b83-8a48-5b02ce10713b}';
|
|
WPD_EVENT_PROPERTIES_V1 : TGuid = '{15ab1953-f817-4fef-a921-5676e838f6e0}';
|
|
WPD_EVENT_PROPERTIES_V2 : TGuid = '{52807b8a-4914-4323-9b9a-74f654b2b846}';
|
|
WPD_EVENT_SERVICE_METHOD_COMPLETE : TGuid = '{8a33f5f8-0acc-4d9b-9cc4-112d353b86ca}';
|
|
WPD_EVENT_STORAGE_FORMAT : TGuid = '{3782616b-22bc-4474-a251-3070f8d38857}';
|
|
WPD_FOLDER_OBJECT_PROPERTIES_V1 : TGuid = '{7e9a7abf-e568-4b34-aa2f-13bb12ab177d}';
|
|
WPD_FORMAT_ATTRIBUTES_V1 : TGuid = '{a0a02000-bcaf-4be8-b3f5-233f231cf58f}';
|
|
|
|
WPD_IMAGE_OBJECT_PROPERTIES_V1 : TGuid = '{63d64908-9fa1-479f-85ba-9952216447db}';
|
|
WPD_MEDIA_PROPERTIES_V1 : TGuid = '{2ed8ba05-0ad3-42dc-b0d0-bc95ac396ac8}';
|
|
WPD_MEMO_OBJECT_PROPERTIES_V1 : TGuid = '{5ffbfc7b-7483-41ad-afb9-da3f4e592b8d}';
|
|
WPD_METHOD_ATTRIBUTES_V1 : TGuid = '{f17a5071-f039-44af-8efe-432cf32e432a}';
|
|
WPD_MUSIC_OBJECT_PROPERTIES_V1 : TGuid = '{b324f56a-dc5d-46e5-b6df-d2ea414888c6}';
|
|
WPD_NETWORK_ASSOCIATION_PROPERTIES_V1 : TGuid = '{e4c93c1f-b203-43f1-a100-5a07d11b0274}';
|
|
|
|
WPD_OBJECT_PROPERTIES_V1 : TGuid = '{ef6b490d-5cd8-437a-affc-da8b60ee4a3c}';
|
|
WPD_PARAMETER_ATTRIBUTES_V1 : TGuid = '{e6864dd7-f325-45ea-a1d5-97cf73b6ca58}';
|
|
WPD_PROPERTY_ATTRIBUTES_V1 : TGuid = '{ab7943d8-6332-445f-a00d-8d5ef1e96f37}';
|
|
WPD_PROPERTY_ATTRIBUTES_V2 : TGuid = '{5d9da160-74ae-43cc-85a9-fe555a80798e}';
|
|
WPD_RENDERING_INFORMATION_OBJECT_PROPERTIES_V1 : TGuid = '{c53d039f-ee23-4a31-8590-7639879870b4}';
|
|
WPD_RESOURCE_ATTRIBUTES_V1 : TGuid = '{1eb6f604-9278-429f-93cc-5bb8c06656b6}';
|
|
WPD_SECTION_OBJECT_PROPERTIES_V1 : TGuid = '{516afd2b-c64e-44f0-98dc-bee1c88f7d66}';
|
|
WPD_SERVICE_PROPERTIES_V1 : TGuid = '{7510698a-cb54-481c-b8db-0d75c93f1c06}';
|
|
WPD_SMS_OBJECT_PROPERTIES_V1 : TGuid = '{7e1074cc-50ff-4dd1-a742-53be6f093a0d}';
|
|
WPD_STILL_IMAGE_CAPTURE_OBJECT_PROPERTIES_V1 : TGuid = '{58c571ec-1bcb-42a7-8ac5-bb291573a260}';
|
|
WPD_STORAGE_OBJECT_PROPERTIES_V1 : TGuid = '{01a3057a-74d6-4e80-bea7-dc4c212ce50a}';
|
|
WPD_TASK_OBJECT_PROPERTIES_V1 : TGuid = '{e354e95e-d8a0-4637-a03a-0cb26838dbc7}';
|
|
WPD_VIDEO_OBJECT_PROPERTIES_V1 : TGuid = '{346f2163-f998-4146-8b01-d19b4c00de9a}';
|
|
*)
|
|
|
|
|
|
|
|
|
|
// ************************************************************************ //
|
|
// Type Lib: C:\Windows\system32\PortableDeviceApi.dll (1)
|
|
// HelpString: PortableDeviceApi 1.0 Type Library
|
|
// ************************************************************************ //
|
|
|
|
|
|
// *********************************************************************//
|
|
// GUIDS declared in the TypeLibrary. Following prefixes are used:
|
|
// Type Libraries : LIBID_xxxx
|
|
// CoClasses : CLASS_xxxx
|
|
// DISPInterfaces : DIID_xxxx
|
|
// Non-DISP interfaces: IID_xxxx
|
|
// *********************************************************************//
|
|
const
|
|
// TypeLibrary Major and minor versions
|
|
PortableDeviceApiLibMajorVersion = 1;
|
|
PortableDeviceApiLibMinorVersion = 0;
|
|
|
|
LIBID_PortableDeviceApiLib: TGUID = '{1F001332-1A57-4934-BE31-AFFC99F4EE0A}';
|
|
|
|
IID_IPortableDevice: TGUID = '{625E2DF8-6392-4CF0-9AD1-3CFA5F17775C}';
|
|
CLASS_PortableDevice: TGUID = '{728A21C5-3D9E-48D7-9810-864848F0F404}';
|
|
IID_IPortableDeviceValues: TGUID = '{6848F6F2-3155-4F86-B6F5-263EEEAB3143}';
|
|
IID_ISequentialStream: TGUID = '{0C733A30-2A1C-11CE-ADE5-00AA0044773D}';
|
|
IID_IStream: TGUID = '{0000000C-0000-0000-C000-000000000046}';
|
|
IID_IStorage: TGUID = '{0000000B-0000-0000-C000-000000000046}';
|
|
IID_IEnumSTATSTG: TGUID = '{0000000D-0000-0000-C000-000000000046}';
|
|
IID_IRecordInfo: TGUID = '{0000002F-0000-0000-C000-000000000046}';
|
|
IID_ITypeInfo: TGUID = '{00020401-0000-0000-C000-000000000046}';
|
|
IID_ITypeComp: TGUID = '{00020403-0000-0000-C000-000000000046}';
|
|
IID_ITypeLib: TGUID = '{00020402-0000-0000-C000-000000000046}';
|
|
IID_IPortableDevicePropVariantCollection: TGUID = '{89B2E422-4F1B-4316-BCEF-A44AFEA83EB3}';
|
|
IID_IPortableDeviceKeyCollection: TGUID = '{DADA2357-E0AD-492E-98DB-DD61C53BA353}';
|
|
IID_IPortableDeviceValuesCollection: TGUID = '{6E3F2D79-4E07-48C4-8208-D8C2E5AF4A99}';
|
|
IID_IPropertyStore: TGUID = '{886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99}';
|
|
IID_IPortableDeviceContent: TGUID = '{6A96ED84-7C73-4480-9938-BF5AF477D426}';
|
|
IID_IEnumPortableDeviceObjectIDs: TGUID = '{10ECE955-CF41-4728-BFA0-41EEDF1BBF19}';
|
|
IID_IPortableDeviceProperties: TGUID = '{7F6D695C-03DF-4439-A809-59266BEEE3A6}';
|
|
IID_IPortableDeviceResources: TGUID = '{FD8878AC-D841-4D17-891C-E6829CDB6934}';
|
|
IID_IPortableDeviceCapabilities: TGUID = '{2C8C6DBF-E3DC-4061-BECC-8542E810D126}';
|
|
IID_IPortableDeviceEventCallback: TGUID = '{A8792A31-F385-493C-A893-40F64EB45F6E}';
|
|
IID_IPortableDeviceManager: TGUID = '{A1567595-4C2F-4574-A6FA-ECEF917B9A40}';
|
|
CLASS_PortableDeviceManager: TGUID = '{0AF10CEC-2ECD-4B92-9581-34F6AE0637F3}';
|
|
IID_IPortableDeviceService: TGUID = '{D3BD3A44-D7B5-40A9-98B7-2FA4D01DEC08}';
|
|
CLASS_PortableDeviceService: TGUID = '{EF5DB4C2-9312-422C-9152-411CD9C4DD84}';
|
|
IID_IPortableDeviceServiceCapabilities: TGUID = '{24DBD89D-413E-43E0-BD5B-197F3C56C886}';
|
|
IID_IPortableDeviceContent2: TGUID = '{9B4ADD96-F6BF-4034-8708-ECA72BF10554}';
|
|
IID_IPortableDeviceServiceMethods: TGUID = '{E20333C9-FD34-412D-A381-CC6F2D820DF7}';
|
|
IID_IPortableDeviceServiceMethodCallback: TGUID = '{C424233C-AFCE-4828-A756-7ED7A2350083}';
|
|
IID_IPortableDeviceDispatchFactory: TGUID = '{5E1EAFC3-E3D7-4132-96FA-759C0F9D1E0F}';
|
|
CLASS_PortableDeviceDispatchFactory: TGUID = '{43232233-8338-4658-AE01-0B4AE830B6B0}';
|
|
CLASS_PortableDeviceFTM: TGUID = '{F7C0039A-4762-488A-B4B3-760EF9A1BA9B}';
|
|
CLASS_PortableDeviceServiceFTM: TGUID = '{1649B154-C794-497A-9B03-F3F0121302F3}';
|
|
|
|
// *********************************************************************//
|
|
// Declaration of Enumerations defined in Type Library
|
|
// *********************************************************************//
|
|
// Constants for enum tagTYPEKIND
|
|
type
|
|
tagTYPEKIND = TOleEnum;
|
|
const
|
|
TKIND_ENUM = $00000000;
|
|
TKIND_RECORD = $00000001;
|
|
TKIND_MODULE = $00000002;
|
|
TKIND_INTERFACE = $00000003;
|
|
TKIND_DISPATCH = $00000004;
|
|
TKIND_COCLASS = $00000005;
|
|
TKIND_ALIAS = $00000006;
|
|
TKIND_UNION = $00000007;
|
|
TKIND_MAX = $00000008;
|
|
|
|
// Constants for enum tagDESCKIND
|
|
type
|
|
tagDESCKIND = TOleEnum;
|
|
const
|
|
DESCKIND_NONE = $00000000;
|
|
DESCKIND_FUNCDESC = $00000001;
|
|
DESCKIND_VARDESC = $00000002;
|
|
DESCKIND_TYPECOMP = $00000003;
|
|
DESCKIND_IMPLICITAPPOBJ = $00000004;
|
|
DESCKIND_MAX = $00000005;
|
|
|
|
// Constants for enum tagFUNCKIND
|
|
type
|
|
tagFUNCKIND = TOleEnum;
|
|
const
|
|
FUNC_VIRTUAL = $00000000;
|
|
FUNC_PUREVIRTUAL = $00000001;
|
|
FUNC_NONVIRTUAL = $00000002;
|
|
FUNC_STATIC = $00000003;
|
|
FUNC_DISPATCH = $00000004;
|
|
|
|
// Constants for enum tagINVOKEKIND
|
|
type
|
|
tagINVOKEKIND = TOleEnum;
|
|
const
|
|
INVOKE_FUNC = $00000001;
|
|
INVOKE_PROPERTYGET = $00000002;
|
|
INVOKE_PROPERTYPUT = $00000004;
|
|
INVOKE_PROPERTYPUTREF = $00000008;
|
|
|
|
// Constants for enum tagCALLCONV
|
|
type
|
|
tagCALLCONV = TOleEnum;
|
|
const
|
|
CC_FASTCALL = $00000000;
|
|
CC_CDECL = $00000001;
|
|
CC_MSCPASCAL = $00000002;
|
|
CC_PASCAL = $00000002;
|
|
CC_MACPASCAL = $00000003;
|
|
CC_STDCALL = $00000004;
|
|
CC_FPFASTCALL = $00000005;
|
|
CC_SYSCALL = $00000006;
|
|
CC_MPWCDECL = $00000007;
|
|
CC_MPWPASCAL = $00000008;
|
|
CC_MAX = $00000009;
|
|
|
|
// Constants for enum tagVARKIND
|
|
type
|
|
tagVARKIND = TOleEnum;
|
|
const
|
|
VAR_PERINSTANCE = $00000000;
|
|
VAR_STATIC = $00000001;
|
|
VAR_CONST = $00000002;
|
|
VAR_DISPATCH = $00000003;
|
|
|
|
// Constants for enum tagSYSKIND
|
|
type
|
|
tagSYSKIND = TOleEnum;
|
|
const
|
|
SYS_WIN16 = $00000000;
|
|
SYS_WIN32 = $00000001;
|
|
SYS_MAC = $00000002;
|
|
SYS_WIN64 = $00000003;
|
|
|
|
type
|
|
|
|
// *********************************************************************//
|
|
// Forward declaration of types defined in TypeLibrary
|
|
// *********************************************************************//
|
|
IPortableDevice = interface;
|
|
IPortableDeviceValues = interface;
|
|
ISequentialStream = interface;
|
|
IStream = interface;
|
|
IStorage = interface;
|
|
IEnumSTATSTG = interface;
|
|
IRecordInfo = interface;
|
|
ITypeInfo = interface;
|
|
ITypeComp = interface;
|
|
ITypeLib = interface;
|
|
IPortableDevicePropVariantCollection = interface;
|
|
IPortableDeviceKeyCollection = interface;
|
|
IPortableDeviceValuesCollection = interface;
|
|
IPropertyStore = interface;
|
|
IPortableDeviceContent = interface;
|
|
IEnumPortableDeviceObjectIDs = interface;
|
|
IPortableDeviceProperties = interface;
|
|
IPortableDeviceResources = interface;
|
|
IPortableDeviceCapabilities = interface;
|
|
IPortableDeviceEventCallback = interface;
|
|
IPortableDeviceManager = interface;
|
|
IPortableDeviceService = interface;
|
|
IPortableDeviceServiceCapabilities = interface;
|
|
IPortableDeviceContent2 = interface;
|
|
IPortableDeviceServiceMethods = interface;
|
|
IPortableDeviceServiceMethodCallback = interface;
|
|
IPortableDeviceDispatchFactory = interface;
|
|
|
|
// *********************************************************************//
|
|
// Declaration of CoClasses defined in Type Library
|
|
// (NOTE: Here we map each CoClass to its Default Interface)
|
|
// *********************************************************************//
|
|
PortableDevice = IPortableDevice;
|
|
PortableDeviceManager = IPortableDeviceManager;
|
|
PortableDeviceService = IPortableDeviceService;
|
|
PortableDeviceDispatchFactory = IPortableDeviceDispatchFactory;
|
|
PortableDeviceFTM = IPortableDevice;
|
|
PortableDeviceServiceFTM = IPortableDeviceService;
|
|
|
|
|
|
// *********************************************************************//
|
|
// Declaration of structures, unions and aliases.
|
|
// *********************************************************************//
|
|
wirePSAFEARRAY = ^PUserType5;
|
|
wireSNB = ^tagRemSNB;
|
|
PUserType6 = ^_FLAGGED_WORD_BLOB; {*}
|
|
PUserType7 = ^_wireVARIANT; {*}
|
|
PUserType14 = ^_wireBRECORD; {*}
|
|
PUserType5 = ^_wireSAFEARRAY; {*}
|
|
PPUserType1 = ^PUserType5; {*}
|
|
PUserType11 = ^tagTYPEDESC; {*}
|
|
PUserType12 = ^tagARRAYDESC; {*}
|
|
PUserType2 = ^tag_inner_PROPVARIANT; {*}
|
|
PUINT1 = ^LongWord; {*}
|
|
PUserType1 = ^_WPDtagpropertykey; {*}
|
|
PUserType3 = ^TGUID; {*}
|
|
PByte1 = ^Byte; {*}
|
|
PUserType4 = ^_FILETIME; {*}
|
|
POleVariant1 = ^OleVariant; {*}
|
|
PUserType8 = ^tagTYPEATTR; {*}
|
|
PUserType9 = ^tagFUNCDESC; {*}
|
|
PUserType10 = ^tagVARDESC; {*}
|
|
PUserType13 = ^tagTLIBATTR; {*}
|
|
|
|
_WPDtagpropertykey = packed record
|
|
fmtid: TGUID;
|
|
pid: LongWord;
|
|
end;
|
|
|
|
_LARGE_INTEGER = packed record
|
|
QuadPart: Int64;
|
|
end;
|
|
|
|
_ULARGE_INTEGER = packed record
|
|
QuadPart: Largeuint;
|
|
end;
|
|
|
|
_FILETIME = packed record
|
|
dwLowDateTime: LongWord;
|
|
dwHighDateTime: LongWord;
|
|
end;
|
|
|
|
tagCLIPDATA = packed record
|
|
cbSize: LongWord;
|
|
ulClipFmt: Integer;
|
|
pClipData: ^Byte;
|
|
end;
|
|
|
|
tagBSTRBLOB = packed record
|
|
cbSize: LongWord;
|
|
pData: ^Byte;
|
|
end;
|
|
|
|
tagBLOB = packed record
|
|
cbSize: LongWord;
|
|
pBlobData: ^Byte;
|
|
end;
|
|
|
|
tagVersionedStream = packed record
|
|
guidVersion: TGUID;
|
|
pStream: IStream;
|
|
end;
|
|
|
|
tagSTATSTG = packed record
|
|
pwcsName: PWideChar;
|
|
type_: LongWord;
|
|
cbSize: _ULARGE_INTEGER;
|
|
mtime: _FILETIME;
|
|
ctime: _FILETIME;
|
|
atime: _FILETIME;
|
|
grfMode: LongWord;
|
|
grfLocksSupported: LongWord;
|
|
clsid: TGUID;
|
|
grfStateBits: LongWord;
|
|
reserved: LongWord;
|
|
end;
|
|
|
|
tagRemSNB = packed record
|
|
ulCntStr: LongWord;
|
|
ulCntChar: LongWord;
|
|
rgString: ^Word;
|
|
end;
|
|
|
|
tagCAC = packed record
|
|
cElems: LongWord;
|
|
pElems: ^Shortint;
|
|
end;
|
|
|
|
tagCAUB = packed record
|
|
cElems: LongWord;
|
|
pElems: ^Byte;
|
|
end;
|
|
|
|
_wireSAFEARR_BSTR = packed record
|
|
Size: LongWord;
|
|
aBstr: ^PUserType6;
|
|
end;
|
|
|
|
_wireSAFEARR_UNKNOWN = packed record
|
|
Size: LongWord;
|
|
apUnknown: ^IUnknown;
|
|
end;
|
|
|
|
_wireSAFEARR_DISPATCH = packed record
|
|
Size: LongWord;
|
|
apDispatch: ^IDispatch;
|
|
end;
|
|
|
|
_FLAGGED_WORD_BLOB = packed record
|
|
fFlags: LongWord;
|
|
clSize: LongWord;
|
|
asData: ^Word;
|
|
end;
|
|
|
|
_wireSAFEARR_VARIANT = packed record
|
|
Size: LongWord;
|
|
aVariant: ^PUserType7;
|
|
end;
|
|
|
|
_wireBRECORD = packed record
|
|
fFlags: LongWord;
|
|
clSize: LongWord;
|
|
pRecInfo: IRecordInfo;
|
|
pRecord: ^Byte;
|
|
end;
|
|
|
|
__MIDL_IOleAutomationTypes_0005 = record
|
|
case Integer of
|
|
0: (lptdesc: PUserType11);
|
|
1: (lpadesc: PUserType12);
|
|
2: (hreftype: LongWord);
|
|
end;
|
|
|
|
tagTYPEDESC = packed record
|
|
DUMMYUNIONNAME: __MIDL_IOleAutomationTypes_0005;
|
|
vt: Word;
|
|
end;
|
|
|
|
tagSAFEARRAYBOUND = packed record
|
|
cElements: LongWord;
|
|
lLbound: Integer;
|
|
end;
|
|
|
|
ULONG_PTR = LongWord;
|
|
|
|
tagIDLDESC = packed record
|
|
dwReserved: ULONG_PTR;
|
|
wIDLFlags: Word;
|
|
end;
|
|
|
|
DWORD = LongWord;
|
|
|
|
tagPARAMDESCEX = packed record
|
|
cBytes: LongWord;
|
|
varDefaultValue: OleVariant;
|
|
end;
|
|
|
|
tagPARAMDESC = packed record
|
|
pparamdescex: ^tagPARAMDESCEX;
|
|
wParamFlags: Word;
|
|
end;
|
|
|
|
tagELEMDESC = packed record
|
|
tdesc: tagTYPEDESC;
|
|
paramdesc: tagPARAMDESC;
|
|
end;
|
|
|
|
tagFUNCDESC = packed record
|
|
memid: Integer;
|
|
lprgscode: ^SCODE;
|
|
lprgelemdescParam: ^tagELEMDESC;
|
|
funckind: tagFUNCKIND;
|
|
invkind: tagINVOKEKIND;
|
|
callconv: tagCALLCONV;
|
|
cParams: Smallint;
|
|
cParamsOpt: Smallint;
|
|
oVft: Smallint;
|
|
cScodes: Smallint;
|
|
elemdescFunc: tagELEMDESC;
|
|
wFuncFlags: Word;
|
|
end;
|
|
|
|
__MIDL_IOleAutomationTypes_0006 = record
|
|
case Integer of
|
|
0: (oInst: LongWord);
|
|
1: (lpvarValue: ^OleVariant);
|
|
end;
|
|
|
|
tagVARDESC = packed record
|
|
memid: Integer;
|
|
lpstrSchema: PWideChar;
|
|
DUMMYUNIONNAME: __MIDL_IOleAutomationTypes_0006;
|
|
elemdescVar: tagELEMDESC;
|
|
wVarFlags: Word;
|
|
varkind: tagVARKIND;
|
|
end;
|
|
|
|
tagTLIBATTR = packed record
|
|
guid: TGUID;
|
|
lcid: LongWord;
|
|
syskind: tagSYSKIND;
|
|
wMajorVerNum: Word;
|
|
wMinorVerNum: Word;
|
|
wLibFlags: Word;
|
|
end;
|
|
|
|
_wireSAFEARR_BRECORD = packed record
|
|
Size: LongWord;
|
|
aRecord: ^PUserType14;
|
|
end;
|
|
|
|
_wireSAFEARR_HAVEIID = packed record
|
|
Size: LongWord;
|
|
apUnknown: ^IUnknown;
|
|
iid: TGUID;
|
|
end;
|
|
|
|
_BYTE_SIZEDARR = packed record
|
|
clSize: LongWord;
|
|
pData: ^Byte;
|
|
end;
|
|
|
|
_SHORT_SIZEDARR = packed record
|
|
clSize: LongWord;
|
|
pData: ^Word;
|
|
end;
|
|
|
|
_LONG_SIZEDARR = packed record
|
|
clSize: LongWord;
|
|
pData: ^LongWord;
|
|
end;
|
|
|
|
_HYPER_SIZEDARR = packed record
|
|
clSize: LongWord;
|
|
pData: ^Int64;
|
|
end;
|
|
|
|
tagCAI = packed record
|
|
cElems: LongWord;
|
|
pElems: ^Smallint;
|
|
end;
|
|
|
|
tagCAUI = packed record
|
|
cElems: LongWord;
|
|
pElems: ^Word;
|
|
end;
|
|
|
|
tagCAL = packed record
|
|
cElems: LongWord;
|
|
pElems: ^Integer;
|
|
end;
|
|
|
|
tagCAUL = packed record
|
|
cElems: LongWord;
|
|
pElems: ^LongWord;
|
|
end;
|
|
|
|
tagCAH = packed record
|
|
cElems: LongWord;
|
|
pElems: ^_LARGE_INTEGER;
|
|
end;
|
|
|
|
tagCAUH = packed record
|
|
cElems: LongWord;
|
|
pElems: ^_ULARGE_INTEGER;
|
|
end;
|
|
|
|
tagCAFLT = packed record
|
|
cElems: LongWord;
|
|
pElems: ^Single;
|
|
end;
|
|
|
|
tagCADBL = packed record
|
|
cElems: LongWord;
|
|
pElems: ^Double;
|
|
end;
|
|
|
|
tagCABOOL = packed record
|
|
cElems: LongWord;
|
|
pElems: ^WordBool;
|
|
end;
|
|
|
|
tagCASCODE = packed record
|
|
cElems: LongWord;
|
|
pElems: ^SCODE;
|
|
end;
|
|
|
|
tagCACY = packed record
|
|
cElems: LongWord;
|
|
pElems: ^Currency;
|
|
end;
|
|
|
|
tagCADATE = packed record
|
|
cElems: LongWord;
|
|
pElems: ^TDateTime;
|
|
end;
|
|
|
|
tagCAFILETIME = packed record
|
|
cElems: LongWord;
|
|
pElems: ^_FILETIME;
|
|
end;
|
|
|
|
tagCACLSID = packed record
|
|
cElems: LongWord;
|
|
pElems: ^TGUID;
|
|
end;
|
|
|
|
tagCACLIPDATA = packed record
|
|
cElems: LongWord;
|
|
pElems: ^tagCLIPDATA;
|
|
end;
|
|
|
|
tagCABSTR = packed record
|
|
cElems: LongWord;
|
|
pElems: ^WideString;
|
|
end;
|
|
|
|
tagCABSTRBLOB = packed record
|
|
cElems: LongWord;
|
|
pElems: ^tagBSTRBLOB;
|
|
end;
|
|
|
|
tagCALPSTR = packed record
|
|
cElems: LongWord;
|
|
pElems: ^PChar;
|
|
end;
|
|
|
|
tagCALPWSTR = packed record
|
|
cElems: LongWord;
|
|
pElems: ^PWideChar;
|
|
end;
|
|
|
|
|
|
tagCAPROPVARIANT = packed record
|
|
cElems: LongWord;
|
|
pElems: PUserType2;
|
|
end;
|
|
|
|
__MIDL___MIDL_itf_PortableDeviceApi_0001_0000_0001 = record
|
|
case Integer of
|
|
0: (cVal: Shortint);
|
|
1: (bVal: Byte);
|
|
2: (iVal: Smallint);
|
|
3: (uiVal: Word);
|
|
4: (lVal: Integer);
|
|
5: (ulVal: LongWord);
|
|
6: (intVal: SYSINT);
|
|
7: (uintVal: SYSUINT);
|
|
8: (hVal: _LARGE_INTEGER);
|
|
9: (uhVal: _ULARGE_INTEGER);
|
|
10: (fltVal: Single);
|
|
11: (dblVal: Double);
|
|
12: (boolVal: WordBool);
|
|
13: (bool: WordBool);
|
|
14: (scode: SCODE);
|
|
15: (cyVal: Currency);
|
|
16: (date: TDateTime);
|
|
17: (filetime: _FILETIME);
|
|
18: (puuid: ^TGUID);
|
|
19: (pClipData: ^tagCLIPDATA);
|
|
20: (bstrVal: {!!WideString}Pointer);
|
|
21: (bstrblobVal: tagBSTRBLOB);
|
|
22: (blob: tagBLOB);
|
|
23: (pszVal: PChar);
|
|
24: (pwszVal: PWideChar);
|
|
25: (punkVal: {!!IUnknown}Pointer);
|
|
26: (pdispVal: {!!IDispatch}Pointer);
|
|
27: (pStream: {!!IStream}Pointer);
|
|
28: (pStorage: {!!IStorage}Pointer);
|
|
29: (pVersionedStream: ^tagVersionedStream);
|
|
30: (parray: wirePSAFEARRAY);
|
|
31: (cac: tagCAC);
|
|
32: (caub: tagCAUB);
|
|
33: (cai: tagCAI);
|
|
34: (caui: tagCAUI);
|
|
35: (cal: tagCAL);
|
|
36: (caul: tagCAUL);
|
|
37: (cah: tagCAH);
|
|
38: (cauh: tagCAUH);
|
|
39: (caflt: tagCAFLT);
|
|
40: (cadbl: tagCADBL);
|
|
41: (cabool: tagCABOOL);
|
|
42: (cascode: tagCASCODE);
|
|
43: (cacy: tagCACY);
|
|
44: (cadate: tagCADATE);
|
|
45: (cafiletime: tagCAFILETIME);
|
|
46: (cauuid: tagCACLSID);
|
|
47: (caclipdata: tagCACLIPDATA);
|
|
48: (cabstr: tagCABSTR);
|
|
49: (cabstrblob: tagCABSTRBLOB);
|
|
50: (calpstr: tagCALPSTR);
|
|
51: (calpwstr: tagCALPWSTR);
|
|
52: (capropvar: tagCAPROPVARIANT);
|
|
53: (pcVal: ^Shortint);
|
|
54: (pbVal: ^Byte);
|
|
55: (piVal: ^Smallint);
|
|
56: (puiVal: ^Word);
|
|
57: (plVal: ^Integer);
|
|
58: (pulVal: ^LongWord);
|
|
59: (pintVal: ^SYSINT);
|
|
60: (puintVal: ^SYSUINT);
|
|
61: (pfltVal: ^Single);
|
|
62: (pdblVal: ^Double);
|
|
63: (pboolVal: ^WordBool);
|
|
64: (pdecVal: ^TDecimal);
|
|
65: (pscode: ^SCODE);
|
|
66: (pcyVal: ^Currency);
|
|
67: (pdate: ^TDateTime);
|
|
68: (pbstrVal: ^WideString);
|
|
69: (ppunkVal: {!!^IUnknown}Pointer);
|
|
70: (ppdispVal: {!!^IDispatch}Pointer);
|
|
71: (pparray: ^wirePSAFEARRAY);
|
|
72: (pvarVal: PUserType2);
|
|
end;
|
|
|
|
tag_inner_PROPVARIANT = packed record
|
|
vt: Word;
|
|
wReserved1: Byte;
|
|
wReserved2: Byte;
|
|
wReserved3: LongWord;
|
|
AsVariant: __MIDL___MIDL_itf_PortableDeviceApi_0001_0000_0001;
|
|
end;
|
|
|
|
__MIDL_IOleAutomationTypes_0004 = record
|
|
case Integer of
|
|
0: (llVal: Int64);
|
|
1: (lVal: Integer);
|
|
2: (bVal: Byte);
|
|
3: (iVal: Smallint);
|
|
4: (fltVal: Single);
|
|
5: (dblVal: Double);
|
|
6: (boolVal: WordBool);
|
|
7: (scode: SCODE);
|
|
8: (cyVal: Currency);
|
|
9: (date: TDateTime);
|
|
10: (bstrVal: ^_FLAGGED_WORD_BLOB);
|
|
11: (punkVal: {!!IUnknown}Pointer);
|
|
12: (pdispVal: {!!IDispatch}Pointer);
|
|
13: (parray: ^PUserType5);
|
|
14: (brecVal: ^_wireBRECORD);
|
|
15: (pbVal: ^Byte);
|
|
16: (piVal: ^Smallint);
|
|
17: (plVal: ^Integer);
|
|
18: (pllVal: ^Int64);
|
|
19: (pfltVal: ^Single);
|
|
20: (pdblVal: ^Double);
|
|
21: (pboolVal: ^WordBool);
|
|
22: (pscode: ^SCODE);
|
|
23: (pcyVal: ^Currency);
|
|
24: (pdate: ^TDateTime);
|
|
25: (pbstrVal: ^PUserType6);
|
|
26: (ppunkVal: {!!^IUnknown}Pointer);
|
|
27: (ppdispVal: {!!^IDispatch}Pointer);
|
|
28: (pparray: ^PPUserType1);
|
|
29: (pvarVal: ^PUserType7);
|
|
30: (cVal: Shortint);
|
|
31: (uiVal: Word);
|
|
32: (ulVal: LongWord);
|
|
33: (ullVal: Largeuint);
|
|
34: (intVal: SYSINT);
|
|
35: (uintVal: SYSUINT);
|
|
36: (decVal: TDecimal);
|
|
37: (pdecVal: ^TDecimal);
|
|
38: (pcVal: ^Shortint);
|
|
39: (puiVal: ^Word);
|
|
40: (pulVal: ^LongWord);
|
|
41: (pullVal: ^Largeuint);
|
|
42: (pintVal: ^SYSINT);
|
|
43: (puintVal: ^SYSUINT);
|
|
end;
|
|
|
|
__MIDL_IOleAutomationTypes_0001 = record
|
|
case Integer of
|
|
0: (BstrStr: _wireSAFEARR_BSTR);
|
|
1: (UnknownStr: _wireSAFEARR_UNKNOWN);
|
|
2: (DispatchStr: _wireSAFEARR_DISPATCH);
|
|
3: (VariantStr: _wireSAFEARR_VARIANT);
|
|
4: (RecordStr: _wireSAFEARR_BRECORD);
|
|
5: (HaveIidStr: _wireSAFEARR_HAVEIID);
|
|
6: (ByteStr: _BYTE_SIZEDARR);
|
|
7: (WordStr: _SHORT_SIZEDARR);
|
|
8: (LongStr: _LONG_SIZEDARR);
|
|
9: (HyperStr: _HYPER_SIZEDARR);
|
|
end;
|
|
|
|
_wireSAFEARRAY_UNION = packed record
|
|
sfType: LongWord;
|
|
u: __MIDL_IOleAutomationTypes_0001;
|
|
end;
|
|
|
|
_wireVARIANT = packed record
|
|
clSize: LongWord;
|
|
rpcReserved: LongWord;
|
|
vt: Word;
|
|
wReserved1: Word;
|
|
wReserved2: Word;
|
|
wReserved3: Word;
|
|
DUMMYUNIONNAME: __MIDL_IOleAutomationTypes_0004;
|
|
end;
|
|
|
|
tagTYPEATTR = packed record
|
|
guid: TGUID;
|
|
lcid: LongWord;
|
|
dwReserved: LongWord;
|
|
memidConstructor: Integer;
|
|
memidDestructor: Integer;
|
|
lpstrSchema: PWideChar;
|
|
cbSizeInstance: LongWord;
|
|
typekind: tagTYPEKIND;
|
|
cFuncs: Word;
|
|
cVars: Word;
|
|
cImplTypes: Word;
|
|
cbSizeVft: Word;
|
|
cbAlignment: Word;
|
|
wTypeFlags: Word;
|
|
wMajorVerNum: Word;
|
|
wMinorVerNum: Word;
|
|
tdescAlias: tagTYPEDESC;
|
|
idldescType: tagIDLDESC;
|
|
end;
|
|
|
|
tagARRAYDESC = packed record
|
|
tdescElem: tagTYPEDESC;
|
|
cDims: Word;
|
|
rgbounds: ^tagSAFEARRAYBOUND;
|
|
end;
|
|
|
|
_wireSAFEARRAY = packed record
|
|
cDims: Word;
|
|
fFeatures: Word;
|
|
cbElements: LongWord;
|
|
cLocks: LongWord;
|
|
uArrayStructs: _wireSAFEARRAY_UNION;
|
|
rgsabound: ^tagSAFEARRAYBOUND;
|
|
end;
|
|
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDevice
|
|
// Flags: (0)
|
|
// GUID: {625E2DF8-6392-4CF0-9AD1-3CFA5F17775C}
|
|
// *********************************************************************//
|
|
IPortableDevice = interface(IUnknown)
|
|
['{625E2DF8-6392-4CF0-9AD1-3CFA5F17775C}']
|
|
function Open(pszPnPDeviceID: PWideChar; const pClientInfo: IPortableDeviceValues): HResult; stdcall;
|
|
function SendCommand(dwFlags: LongWord; const pParameters: IPortableDeviceValues;
|
|
out ppResults: IPortableDeviceValues): HResult; stdcall;
|
|
function Content(out ppContent: IPortableDeviceContent): HResult; stdcall;
|
|
function Capabilities(out ppCapabilities: IPortableDeviceCapabilities): HResult; stdcall;
|
|
function Cancel: HResult; stdcall;
|
|
function Close: HResult; stdcall;
|
|
function Advise(dwFlags: LongWord; const pCallback: IPortableDeviceEventCallback;
|
|
const pParameters: IPortableDeviceValues; out ppszCookie: PWideChar): HResult; stdcall;
|
|
function Unadvise(pszCookie: PWideChar): HResult; stdcall;
|
|
function GetPnPDeviceID(out ppszPnPDeviceID: PWideChar): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceValues
|
|
// Flags: (0)
|
|
// GUID: {6848F6F2-3155-4F86-B6F5-263EEEAB3143}
|
|
// *********************************************************************//
|
|
IPortableDeviceValues = interface(IUnknown)
|
|
['{6848F6F2-3155-4F86-B6F5-263EEEAB3143}']
|
|
function GetCount(var pcelt: LongWord): HResult; stdcall;
|
|
function GetAt(index: LongWord; var pKey: _WPDtagpropertykey; var pValue: tag_inner_PROPVARIANT): HResult; stdcall;
|
|
function SetValue(var key: _WPDtagpropertykey; var pValue: tag_inner_PROPVARIANT): HResult; stdcall;
|
|
function GetValue(var key: _WPDtagpropertykey; out pValue: tag_inner_PROPVARIANT): HResult; stdcall;
|
|
function SetStringValue(var key: _WPDtagpropertykey; Value: PWideChar): HResult; stdcall;
|
|
function GetStringValue(var key: _WPDtagpropertykey; out pValue: PWideChar): HResult; stdcall;
|
|
function SetUnsignedIntegerValue(var key: _WPDtagpropertykey; Value: LongWord): HResult; stdcall;
|
|
function GetUnsignedIntegerValue(var key: _WPDtagpropertykey; out pValue: LongWord): HResult; stdcall;
|
|
function SetSignedIntegerValue(var key: _WPDtagpropertykey; Value: Integer): HResult; stdcall;
|
|
function GetSignedIntegerValue(var key: _WPDtagpropertykey; out pValue: Integer): HResult; stdcall;
|
|
function SetUnsignedLargeIntegerValue(var key: _WPDtagpropertykey; Value: Largeuint): HResult; stdcall;
|
|
function GetUnsignedLargeIntegerValue(var key: _WPDtagpropertykey; out pValue: Largeuint): HResult; stdcall;
|
|
function SetSignedLargeIntegerValue(var key: _WPDtagpropertykey; Value: Int64): HResult; stdcall;
|
|
function GetSignedLargeIntegerValue(var key: _WPDtagpropertykey; out pValue: Int64): HResult; stdcall;
|
|
function SetFloatValue(var key: _WPDtagpropertykey; Value: Single): HResult; stdcall;
|
|
function GetFloatValue(var key: _WPDtagpropertykey; out pValue: Single): HResult; stdcall;
|
|
function SetErrorValue(var key: _WPDtagpropertykey; Value: HResult): HResult; stdcall;
|
|
function GetErrorValue(var key: _WPDtagpropertykey; out pValue: HResult): HResult; stdcall;
|
|
function SetKeyValue(var key: _WPDtagpropertykey; var Value: _WPDtagpropertykey): HResult; stdcall;
|
|
function GetKeyValue(var key: _WPDtagpropertykey; out pValue: _WPDtagpropertykey): HResult; stdcall;
|
|
function SetBoolValue(var key: _WPDtagpropertykey; Value: Integer): HResult; stdcall;
|
|
function GetBoolValue(var key: _WPDtagpropertykey; out pValue: Integer): HResult; stdcall;
|
|
function SetIUnknownValue(var key: _WPDtagpropertykey; const pValue: IUnknown): HResult; stdcall;
|
|
function GetIUnknownValue(var key: _WPDtagpropertykey; out ppValue: IUnknown): HResult; stdcall;
|
|
function SetGuidValue(var key: _WPDtagpropertykey; var Value: TGUID): HResult; stdcall;
|
|
function GetGuidValue(var key: _WPDtagpropertykey; out pValue: TGUID): HResult; stdcall;
|
|
function SetBufferValue(var key: _WPDtagpropertykey; var pValue: Byte; cbValue: LongWord): HResult; stdcall;
|
|
function GetBufferValue(var key: _WPDtagpropertykey; out ppValue: PByte1; out pcbValue: LongWord): HResult; stdcall;
|
|
function SetIPortableDeviceValuesValue(var key: _WPDtagpropertykey;
|
|
const pValue: IPortableDeviceValues): HResult; stdcall;
|
|
function GetIPortableDeviceValuesValue(var key: _WPDtagpropertykey;
|
|
out ppValue: IPortableDeviceValues): HResult; stdcall;
|
|
function SetIPortableDevicePropVariantCollectionValue(var key: _WPDtagpropertykey;
|
|
const pValue: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function GetIPortableDevicePropVariantCollectionValue(var key: _WPDtagpropertykey;
|
|
out ppValue: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function SetIPortableDeviceKeyCollectionValue(var key: _WPDtagpropertykey;
|
|
const pValue: IPortableDeviceKeyCollection): HResult; stdcall;
|
|
function GetIPortableDeviceKeyCollectionValue(var key: _WPDtagpropertykey;
|
|
out ppValue: IPortableDeviceKeyCollection): HResult; stdcall;
|
|
function SetIPortableDeviceValuesCollectionValue(var key: _WPDtagpropertykey;
|
|
const pValue: IPortableDeviceValuesCollection): HResult; stdcall;
|
|
function GetIPortableDeviceValuesCollectionValue(var key: _WPDtagpropertykey;
|
|
out ppValue: IPortableDeviceValuesCollection): HResult; stdcall;
|
|
function RemoveValue(var key: _WPDtagpropertykey): HResult; stdcall;
|
|
function CopyValuesFromPropertyStore(const pStore: IPropertyStore): HResult; stdcall;
|
|
function CopyValuesToPropertyStore(const pStore: IPropertyStore): HResult; stdcall;
|
|
function Clear: HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: ISequentialStream
|
|
// Flags: (0)
|
|
// GUID: {0C733A30-2A1C-11CE-ADE5-00AA0044773D}
|
|
// *********************************************************************//
|
|
ISequentialStream = interface(IUnknown)
|
|
['{0C733A30-2A1C-11CE-ADE5-00AA0044773D}']
|
|
function RemoteRead(out pv: Byte; cb: LongWord; out pcbRead: LongWord): HResult; stdcall;
|
|
function RemoteWrite(var pv: Byte; cb: LongWord; out pcbWritten: LongWord): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IStream
|
|
// Flags: (0)
|
|
// GUID: {0000000C-0000-0000-C000-000000000046}
|
|
// *********************************************************************//
|
|
IStream = interface(ISequentialStream)
|
|
['{0000000C-0000-0000-C000-000000000046}']
|
|
function RemoteSeek(dlibMove: _LARGE_INTEGER; dwOrigin: LongWord;
|
|
out plibNewPosition: _ULARGE_INTEGER): HResult; stdcall;
|
|
function SetSize(libNewSize: _ULARGE_INTEGER): HResult; stdcall;
|
|
function RemoteCopyTo(const pstm: IStream; cb: _ULARGE_INTEGER; out pcbRead: _ULARGE_INTEGER;
|
|
out pcbWritten: _ULARGE_INTEGER): HResult; stdcall;
|
|
function Commit(grfCommitFlags: LongWord): HResult; stdcall;
|
|
function Revert: HResult; stdcall;
|
|
function LockRegion(libOffset: _ULARGE_INTEGER; cb: _ULARGE_INTEGER; dwLockType: LongWord): HResult; stdcall;
|
|
function UnlockRegion(libOffset: _ULARGE_INTEGER; cb: _ULARGE_INTEGER; dwLockType: LongWord): HResult; stdcall;
|
|
function Stat(out pstatstg: tagSTATSTG; grfStatFlag: LongWord): HResult; stdcall;
|
|
function Clone(out ppstm: IStream): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IStorage
|
|
// Flags: (0)
|
|
// GUID: {0000000B-0000-0000-C000-000000000046}
|
|
// *********************************************************************//
|
|
IStorage = interface(IUnknown)
|
|
['{0000000B-0000-0000-C000-000000000046}']
|
|
function CreateStream(pwcsName: PWideChar; grfMode: LongWord; reserved1: LongWord;
|
|
reserved2: LongWord; out ppstm: IStream): HResult; stdcall;
|
|
function RemoteOpenStream(pwcsName: PWideChar; cbReserved1: LongWord; var reserved1: Byte;
|
|
grfMode: LongWord; reserved2: LongWord; out ppstm: IStream): HResult; stdcall;
|
|
function CreateStorage(pwcsName: PWideChar; grfMode: LongWord; reserved1: LongWord;
|
|
reserved2: LongWord; out ppstg: IStorage): HResult; stdcall;
|
|
function OpenStorage(pwcsName: PWideChar; const pstgPriority: IStorage; grfMode: LongWord;
|
|
var snbExclude: tagRemSNB; reserved: LongWord; out ppstg: IStorage): HResult; stdcall;
|
|
function RemoteCopyTo(ciidExclude: LongWord; var rgiidExclude: TGUID;
|
|
var snbExclude: tagRemSNB; const pstgDest: IStorage): HResult; stdcall;
|
|
function MoveElementTo(pwcsName: PWideChar; const pstgDest: IStorage; pwcsNewName: PWideChar;
|
|
grfFlags: LongWord): HResult; stdcall;
|
|
function Commit(grfCommitFlags: LongWord): HResult; stdcall;
|
|
function Revert: HResult; stdcall;
|
|
function RemoteEnumElements(reserved1: LongWord; cbReserved2: LongWord; var reserved2: Byte;
|
|
reserved3: LongWord; out ppenum: IEnumSTATSTG): HResult; stdcall;
|
|
function DestroyElement(pwcsName: PWideChar): HResult; stdcall;
|
|
function RenameElement(pwcsOldName: PWideChar; pwcsNewName: PWideChar): HResult; stdcall;
|
|
function SetElementTimes(pwcsName: PWideChar; var pctime: _FILETIME; var patime: _FILETIME;
|
|
var pmtime: _FILETIME): HResult; stdcall;
|
|
function SetClass(var clsid: TGUID): HResult; stdcall;
|
|
function SetStateBits(grfStateBits: LongWord; grfMask: LongWord): HResult; stdcall;
|
|
function Stat(out pstatstg: tagSTATSTG; grfStatFlag: LongWord): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IEnumSTATSTG
|
|
// Flags: (0)
|
|
// GUID: {0000000D-0000-0000-C000-000000000046}
|
|
// *********************************************************************//
|
|
IEnumSTATSTG = interface(IUnknown)
|
|
['{0000000D-0000-0000-C000-000000000046}']
|
|
function RemoteNext(celt: LongWord; out rgelt: tagSTATSTG; out pceltFetched: LongWord): HResult; stdcall;
|
|
function Skip(celt: LongWord): HResult; stdcall;
|
|
function Reset: HResult; stdcall;
|
|
function Clone(out ppenum: IEnumSTATSTG): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IRecordInfo
|
|
// Flags: (0)
|
|
// GUID: {0000002F-0000-0000-C000-000000000046}
|
|
// *********************************************************************//
|
|
IRecordInfo = interface(IUnknown)
|
|
['{0000002F-0000-0000-C000-000000000046}']
|
|
function RecordInit(out pvNew: Pointer): HResult; stdcall;
|
|
function RecordClear(var pvExisting: Pointer): HResult; stdcall;
|
|
function RecordCopy(var pvExisting: Pointer; out pvNew: Pointer): HResult; stdcall;
|
|
function GetGuid(out pguid: TGUID): HResult; stdcall;
|
|
function GetName(out pbstrName: WideString): HResult; stdcall;
|
|
function GetSize(out pcbSize: LongWord): HResult; stdcall;
|
|
function GetTypeInfo(out ppTypeInfo: ITypeInfo): HResult; stdcall;
|
|
function GetField(var pvData: Pointer; szFieldName: PWideChar; out pvarField: OleVariant): HResult; stdcall;
|
|
function GetFieldNoCopy(var pvData: Pointer; szFieldName: PWideChar; out pvarField: OleVariant;
|
|
out ppvDataCArray: Pointer): HResult; stdcall;
|
|
function PutField(wFlags: LongWord; var pvData: Pointer; szFieldName: PWideChar;
|
|
var pvarField: OleVariant): HResult; stdcall;
|
|
function PutFieldNoCopy(wFlags: LongWord; var pvData: Pointer; szFieldName: PWideChar;
|
|
var pvarField: OleVariant): HResult; stdcall;
|
|
function GetFieldNames(var pcNames: LongWord; out rgBstrNames: WideString): HResult; stdcall;
|
|
function IsMatchingType(const pRecordInfo: IRecordInfo): Integer; stdcall;
|
|
function RecordCreate: Pointer; stdcall;
|
|
function RecordCreateCopy(var pvSource: Pointer; out ppvDest: Pointer): HResult; stdcall;
|
|
function RecordDestroy(var pvRecord: Pointer): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: ITypeInfo
|
|
// Flags: (0)
|
|
// GUID: {00020401-0000-0000-C000-000000000046}
|
|
// *********************************************************************//
|
|
ITypeInfo = interface(IUnknown)
|
|
['{00020401-0000-0000-C000-000000000046}']
|
|
function RemoteGetTypeAttr(out ppTypeAttr: PUserType8; out pDummy: DWORD): HResult; stdcall;
|
|
function GetTypeComp(out ppTComp: ITypeComp): HResult; stdcall;
|
|
function RemoteGetFuncDesc(index: SYSUINT; out ppFuncDesc: PUserType9; out pDummy: DWORD): HResult; stdcall;
|
|
function RemoteGetVarDesc(index: SYSUINT; out ppVarDesc: PUserType10; out pDummy: DWORD): HResult; stdcall;
|
|
function RemoteGetNames(memid: Integer; out rgBstrNames: WideString; cMaxNames: SYSUINT;
|
|
out pcNames: SYSUINT): HResult; stdcall;
|
|
function GetRefTypeOfImplType(index: SYSUINT; out pRefType: LongWord): HResult; stdcall;
|
|
function GetImplTypeFlags(index: SYSUINT; out pImplTypeFlags: SYSINT): HResult; stdcall;
|
|
function LocalGetIDsOfNames: HResult; stdcall;
|
|
function LocalInvoke: HResult; stdcall;
|
|
function RemoteGetDocumentation(memid: Integer; refPtrFlags: LongWord;
|
|
out pbstrName: WideString; out pBstrDocString: WideString;
|
|
out pdwHelpContext: LongWord; out pBstrHelpFile: WideString): HResult; stdcall;
|
|
function RemoteGetDllEntry(memid: Integer; invkind: tagINVOKEKIND; refPtrFlags: LongWord;
|
|
out pBstrDllName: WideString; out pbstrName: WideString;
|
|
out pwOrdinal: Word): HResult; stdcall;
|
|
function GetRefTypeInfo(hreftype: LongWord; out ppTInfo: ITypeInfo): HResult; stdcall;
|
|
function LocalAddressOfMember: HResult; stdcall;
|
|
function RemoteCreateInstance(var riid: TGUID; out ppvObj: IUnknown): HResult; stdcall;
|
|
function GetMops(memid: Integer; out pBstrMops: WideString): HResult; stdcall;
|
|
function RemoteGetContainingTypeLib(out ppTLib: ITypeLib; out pIndex: SYSUINT): HResult; stdcall;
|
|
function LocalReleaseTypeAttr: HResult; stdcall;
|
|
function LocalReleaseFuncDesc: HResult; stdcall;
|
|
function LocalReleaseVarDesc: HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: ITypeComp
|
|
// Flags: (0)
|
|
// GUID: {00020403-0000-0000-C000-000000000046}
|
|
// *********************************************************************//
|
|
ITypeComp = interface(IUnknown)
|
|
['{00020403-0000-0000-C000-000000000046}']
|
|
function RemoteBind(szName: PWideChar; lHashVal: LongWord; wFlags: Word;
|
|
out ppTInfo: ITypeInfo; out pDescKind: tagDESCKIND;
|
|
out ppFuncDesc: PUserType9; out ppVarDesc: PUserType10;
|
|
out ppTypeComp: ITypeComp; out pDummy: DWORD): HResult; stdcall;
|
|
function RemoteBindType(szName: PWideChar; lHashVal: LongWord; out ppTInfo: ITypeInfo): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: ITypeLib
|
|
// Flags: (0)
|
|
// GUID: {00020402-0000-0000-C000-000000000046}
|
|
// *********************************************************************//
|
|
ITypeLib = interface(IUnknown)
|
|
['{00020402-0000-0000-C000-000000000046}']
|
|
function RemoteGetTypeInfoCount(out pcTInfo: SYSUINT): HResult; stdcall;
|
|
function GetTypeInfo(index: SYSUINT; out ppTInfo: ITypeInfo): HResult; stdcall;
|
|
function GetTypeInfoType(index: SYSUINT; out pTKind: tagTYPEKIND): HResult; stdcall;
|
|
function GetTypeInfoOfGuid(var guid: TGUID; out ppTInfo: ITypeInfo): HResult; stdcall;
|
|
function RemoteGetLibAttr(out ppTLibAttr: PUserType13; out pDummy: DWORD): HResult; stdcall;
|
|
function GetTypeComp(out ppTComp: ITypeComp): HResult; stdcall;
|
|
function RemoteGetDocumentation(index: SYSINT; refPtrFlags: LongWord;
|
|
out pbstrName: WideString; out pBstrDocString: WideString;
|
|
out pdwHelpContext: LongWord; out pBstrHelpFile: WideString): HResult; stdcall;
|
|
function RemoteIsName(szNameBuf: PWideChar; lHashVal: LongWord; out pfName: Integer;
|
|
out pBstrLibName: WideString): HResult; stdcall;
|
|
function RemoteFindName(szNameBuf: PWideChar; lHashVal: LongWord; out ppTInfo: ITypeInfo;
|
|
out rgMemId: Integer; var pcFound: Word; out pBstrLibName: WideString): HResult; stdcall;
|
|
function LocalReleaseTLibAttr: HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDevicePropVariantCollection
|
|
// Flags: (0)
|
|
// GUID: {89B2E422-4F1B-4316-BCEF-A44AFEA83EB3}
|
|
// *********************************************************************//
|
|
IPortableDevicePropVariantCollection = interface(IUnknown)
|
|
['{89B2E422-4F1B-4316-BCEF-A44AFEA83EB3}']
|
|
function GetCount(var pcElems: LongWord): HResult; stdcall;
|
|
function GetAt(dwIndex: LongWord; var pValue: tag_inner_PROPVARIANT): HResult; stdcall;
|
|
function Add(var pValue: tag_inner_PROPVARIANT): HResult; stdcall;
|
|
function GetType(out pvt: Word): HResult; stdcall;
|
|
function ChangeType(vt: Word): HResult; stdcall;
|
|
function Clear: HResult; stdcall;
|
|
function RemoveAt(dwIndex: LongWord): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceKeyCollection
|
|
// Flags: (0)
|
|
// GUID: {DADA2357-E0AD-492E-98DB-DD61C53BA353}
|
|
// *********************************************************************//
|
|
IPortableDeviceKeyCollection = interface(IUnknown)
|
|
['{DADA2357-E0AD-492E-98DB-DD61C53BA353}']
|
|
function GetCount(var pcElems: LongWord): HResult; stdcall;
|
|
function GetAt(dwIndex: LongWord; var pKey: _WPDtagpropertykey): HResult; stdcall;
|
|
function Add(var key: _WPDtagpropertykey): HResult; stdcall;
|
|
function Clear: HResult; stdcall;
|
|
function RemoveAt(dwIndex: LongWord): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceValuesCollection
|
|
// Flags: (0)
|
|
// GUID: {6E3F2D79-4E07-48C4-8208-D8C2E5AF4A99}
|
|
// *********************************************************************//
|
|
IPortableDeviceValuesCollection = interface(IUnknown)
|
|
['{6E3F2D79-4E07-48C4-8208-D8C2E5AF4A99}']
|
|
function GetCount(var pcElems: LongWord): HResult; stdcall;
|
|
function GetAt(dwIndex: LongWord; out ppValues: IPortableDeviceValues): HResult; stdcall;
|
|
function Add(const pValues: IPortableDeviceValues): HResult; stdcall;
|
|
function Clear: HResult; stdcall;
|
|
function RemoveAt(dwIndex: LongWord): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPropertyStore
|
|
// Flags: (0)
|
|
// GUID: {886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99}
|
|
// *********************************************************************//
|
|
IPropertyStore = interface(IUnknown)
|
|
['{886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99}']
|
|
function GetCount(out cProps: LongWord): HResult; stdcall;
|
|
function GetAt(iProp: LongWord; out pKey: _WPDtagpropertykey): HResult; stdcall;
|
|
function GetValue(var key: _WPDtagpropertykey; out pv: tag_inner_PROPVARIANT): HResult; stdcall;
|
|
function SetValue(var key: _WPDtagpropertykey; var propvar: tag_inner_PROPVARIANT): HResult; stdcall;
|
|
function Commit: HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceContent
|
|
// Flags: (0)
|
|
// GUID: {6A96ED84-7C73-4480-9938-BF5AF477D426}
|
|
// *********************************************************************//
|
|
IPortableDeviceContent = interface(IUnknown)
|
|
['{6A96ED84-7C73-4480-9938-BF5AF477D426}']
|
|
function EnumObjects(dwFlags: LongWord; pszParentObjectID: PWideChar;
|
|
const pFilter: IPortableDeviceValues;
|
|
out ppenum: IEnumPortableDeviceObjectIDs): HResult; stdcall;
|
|
function Properties(out ppProperties: IPortableDeviceProperties): HResult; stdcall;
|
|
function Transfer(out ppResources: IPortableDeviceResources): HResult; stdcall;
|
|
function CreateObjectWithPropertiesOnly(const pValues: IPortableDeviceValues;
|
|
var ppszObjectID: PWideChar): HResult; stdcall;
|
|
function CreateObjectWithPropertiesAndData(const pValues: IPortableDeviceValues;
|
|
out ppData: IStream;
|
|
var pdwOptimalWriteBufferSize: LongWord;
|
|
var ppszCookie: PWideChar): HResult; stdcall;
|
|
function Delete(dwOptions: LongWord; const pObjectIDs: IPortableDevicePropVariantCollection;
|
|
var ppResults: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function GetObjectIDsFromPersistentUniqueIDs(const pPersistentUniqueIDs: IPortableDevicePropVariantCollection;
|
|
out ppObjectIDs: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function Cancel: HResult; stdcall;
|
|
function Move(const pObjectIDs: IPortableDevicePropVariantCollection;
|
|
pszDestinationFolderObjectID: PWideChar;
|
|
var ppResults: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function Copy(const pObjectIDs: IPortableDevicePropVariantCollection;
|
|
pszDestinationFolderObjectID: PWideChar;
|
|
var ppResults: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IEnumPortableDeviceObjectIDs
|
|
// Flags: (0)
|
|
// GUID: {10ECE955-CF41-4728-BFA0-41EEDF1BBF19}
|
|
// *********************************************************************//
|
|
IEnumPortableDeviceObjectIDs = interface(IUnknown)
|
|
['{10ECE955-CF41-4728-BFA0-41EEDF1BBF19}']
|
|
function Next(cObjects: LongWord; out pObjIDs: PWideChar; var pcFetched: LongWord): HResult; stdcall;
|
|
function Skip(cObjects: LongWord): HResult; stdcall;
|
|
function Reset: HResult; stdcall;
|
|
function Clone(out ppenum: IEnumPortableDeviceObjectIDs): HResult; stdcall;
|
|
function Cancel: HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceProperties
|
|
// Flags: (0)
|
|
// GUID: {7F6D695C-03DF-4439-A809-59266BEEE3A6}
|
|
// *********************************************************************//
|
|
IPortableDeviceProperties = interface(IUnknown)
|
|
['{7F6D695C-03DF-4439-A809-59266BEEE3A6}']
|
|
function GetSupportedProperties(pszObjectID: PWideChar; out ppKeys: IPortableDeviceKeyCollection): HResult; stdcall;
|
|
function GetPropertyAttributes(pszObjectID: PWideChar; var key: _WPDtagpropertykey;
|
|
out ppAttributes: IPortableDeviceValues): HResult; stdcall;
|
|
function GetValues(pszObjectID: PWideChar; const pKeys: IPortableDeviceKeyCollection;
|
|
out ppValues: IPortableDeviceValues): HResult; stdcall;
|
|
function SetValues(pszObjectID: PWideChar; const pValues: IPortableDeviceValues;
|
|
out ppResults: IPortableDeviceValues): HResult; stdcall;
|
|
function Delete(pszObjectID: PWideChar; const pKeys: IPortableDeviceKeyCollection): HResult; stdcall;
|
|
function Cancel: HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceResources
|
|
// Flags: (0)
|
|
// GUID: {FD8878AC-D841-4D17-891C-E6829CDB6934}
|
|
// *********************************************************************//
|
|
IPortableDeviceResources = interface(IUnknown)
|
|
['{FD8878AC-D841-4D17-891C-E6829CDB6934}']
|
|
function GetSupportedResources(pszObjectID: PWideChar; out ppKeys: IPortableDeviceKeyCollection): HResult; stdcall;
|
|
function GetResourceAttributes(pszObjectID: PWideChar; var key: _WPDtagpropertykey;
|
|
out ppResourceAttributes: IPortableDeviceValues): HResult; stdcall;
|
|
function GetStream(pszObjectID: PWideChar; var key: _WPDtagpropertykey; dwMode: LongWord;
|
|
var pdwOptimalBufferSize: LongWord; out ppStream: IStream): HResult; stdcall;
|
|
function Delete(pszObjectID: PWideChar; const pKeys: IPortableDeviceKeyCollection): HResult; stdcall;
|
|
function Cancel: HResult; stdcall;
|
|
function CreateResource(const pResourceAttributes: IPortableDeviceValues; out ppData: IStream;
|
|
var pdwOptimalWriteBufferSize: LongWord; var ppszCookie: PWideChar): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceCapabilities
|
|
// Flags: (0)
|
|
// GUID: {2C8C6DBF-E3DC-4061-BECC-8542E810D126}
|
|
// *********************************************************************//
|
|
IPortableDeviceCapabilities = interface(IUnknown)
|
|
['{2C8C6DBF-E3DC-4061-BECC-8542E810D126}']
|
|
function GetSupportedCommands(out ppCommands: IPortableDeviceKeyCollection): HResult; stdcall;
|
|
function GetCommandOptions(var Command: _WPDtagpropertykey; out ppOptions: IPortableDeviceValues): HResult; stdcall;
|
|
function GetFunctionalCategories(out ppCategories: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function GetFunctionalObjects(var Category: TGUID;
|
|
out ppObjectIDs: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function GetSupportedContentTypes(var Category: TGUID;
|
|
out ppContentTypes: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function GetSupportedFormats(var ContentType: TGUID;
|
|
out ppFormats: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function GetSupportedFormatProperties(var Format: TGUID;
|
|
out ppKeys: IPortableDeviceKeyCollection): HResult; stdcall;
|
|
function GetFixedPropertyAttributes(var Format: TGUID; var key: _WPDtagpropertykey;
|
|
out ppAttributes: IPortableDeviceValues): HResult; stdcall;
|
|
function Cancel: HResult; stdcall;
|
|
function GetSupportedEvents(out ppEvents: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function GetEventOptions(var Event: TGUID; out ppOptions: IPortableDeviceValues): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceEventCallback
|
|
// Flags: (0)
|
|
// GUID: {A8792A31-F385-493C-A893-40F64EB45F6E}
|
|
// *********************************************************************//
|
|
IPortableDeviceEventCallback = interface(IUnknown)
|
|
['{A8792A31-F385-493C-A893-40F64EB45F6E}']
|
|
function OnEvent(const pEventParameters: IPortableDeviceValues): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceManager
|
|
// Flags: (0)
|
|
// GUID: {A1567595-4C2F-4574-A6FA-ECEF917B9A40}
|
|
// *********************************************************************//
|
|
IPortableDeviceManager = interface(IUnknown)
|
|
['{A1567595-4C2F-4574-A6FA-ECEF917B9A40}']
|
|
function GetDevices(var pPnPDeviceIDs: PWideChar; var pcPnPDeviceIDs: LongWord): HResult; stdcall;
|
|
function RefreshDeviceList: HResult; stdcall;
|
|
function GetDeviceFriendlyName(pszPnPDeviceID: PWideChar; var pDeviceFriendlyName: Word;
|
|
var pcchDeviceFriendlyName: LongWord): HResult; stdcall;
|
|
function GetDeviceDescription(pszPnPDeviceID: PWideChar; var pDeviceDescription: Word;
|
|
var pcchDeviceDescription: LongWord): HResult; stdcall;
|
|
function GetDeviceManufacturer(pszPnPDeviceID: PWideChar; var pDeviceManufacturer: Word;
|
|
var pcchDeviceManufacturer: LongWord): HResult; stdcall;
|
|
function GetDeviceProperty(pszPnPDeviceID: PWideChar; pszDevicePropertyName: PWideChar;
|
|
var pData: Byte; var pcbData: LongWord; var pdwType: LongWord): HResult; stdcall;
|
|
function GetPrivateDevices(var pPnPDeviceIDs: PWideChar; var pcPnPDeviceIDs: LongWord): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceService
|
|
// Flags: (0)
|
|
// GUID: {D3BD3A44-D7B5-40A9-98B7-2FA4D01DEC08}
|
|
// *********************************************************************//
|
|
IPortableDeviceService = interface(IUnknown)
|
|
['{D3BD3A44-D7B5-40A9-98B7-2FA4D01DEC08}']
|
|
function Open(pszPnPServiceID: PWideChar; const pClientInfo: IPortableDeviceValues): HResult; stdcall;
|
|
function Capabilities(out ppCapabilities: IPortableDeviceServiceCapabilities): HResult; stdcall;
|
|
function Content(out ppContent: IPortableDeviceContent2): HResult; stdcall;
|
|
function Methods(out ppMethods: IPortableDeviceServiceMethods): HResult; stdcall;
|
|
function Cancel: HResult; stdcall;
|
|
function Close: HResult; stdcall;
|
|
function GetServiceObjectID(out ppszServiceObjectID: PWideChar): HResult; stdcall;
|
|
function GetPnPServiceID(out ppszPnPServiceID: PWideChar): HResult; stdcall;
|
|
function Advise(dwFlags: LongWord; const pCallback: IPortableDeviceEventCallback;
|
|
const pParameters: IPortableDeviceValues; out ppszCookie: PWideChar): HResult; stdcall;
|
|
function Unadvise(pszCookie: PWideChar): HResult; stdcall;
|
|
function SendCommand(dwFlags: LongWord; const pParameters: IPortableDeviceValues;
|
|
out ppResults: IPortableDeviceValues): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceServiceCapabilities
|
|
// Flags: (0)
|
|
// GUID: {24DBD89D-413E-43E0-BD5B-197F3C56C886}
|
|
// *********************************************************************//
|
|
IPortableDeviceServiceCapabilities = interface(IUnknown)
|
|
['{24DBD89D-413E-43E0-BD5B-197F3C56C886}']
|
|
function GetSupportedMethods(out ppMethods: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function GetSupportedMethodsByFormat(var Format: TGUID;
|
|
out ppMethods: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function GetMethodAttributes(var Method: TGUID; out ppAttributes: IPortableDeviceValues): HResult; stdcall;
|
|
function GetMethodParameterAttributes(var Method: TGUID; var Parameter: _WPDtagpropertykey;
|
|
out ppAttributes: IPortableDeviceValues): HResult; stdcall;
|
|
function GetSupportedFormats(out ppFormats: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function GetFormatAttributes(var Format: TGUID; out ppAttributes: IPortableDeviceValues): HResult; stdcall;
|
|
function GetSupportedFormatProperties(var Format: TGUID;
|
|
out ppKeys: IPortableDeviceKeyCollection): HResult; stdcall;
|
|
function GetFormatPropertyAttributes(var Format: TGUID; var Property_: _WPDtagpropertykey;
|
|
out ppAttributes: IPortableDeviceValues): HResult; stdcall;
|
|
function GetSupportedEvents(out ppEvents: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function GetEventAttributes(var Event: TGUID; out ppAttributes: IPortableDeviceValues): HResult; stdcall;
|
|
function GetEventParameterAttributes(var Event: TGUID; var Parameter: _WPDtagpropertykey;
|
|
out ppAttributes: IPortableDeviceValues): HResult; stdcall;
|
|
function GetInheritedServices(dwInheritanceType: LongWord;
|
|
out ppServices: IPortableDevicePropVariantCollection): HResult; stdcall;
|
|
function GetFormatRenderingProfiles(var Format: TGUID;
|
|
out ppRenderingProfiles: IPortableDeviceValuesCollection): HResult; stdcall;
|
|
function GetSupportedCommands(out ppCommands: IPortableDeviceKeyCollection): HResult; stdcall;
|
|
function GetCommandOptions(var Command: _WPDtagpropertykey; out ppOptions: IPortableDeviceValues): HResult; stdcall;
|
|
function Cancel: HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceContent2
|
|
// Flags: (0)
|
|
// GUID: {9B4ADD96-F6BF-4034-8708-ECA72BF10554}
|
|
// *********************************************************************//
|
|
IPortableDeviceContent2 = interface(IPortableDeviceContent)
|
|
['{9B4ADD96-F6BF-4034-8708-ECA72BF10554}']
|
|
function UpdateObjectWithPropertiesAndData(pszObjectID: PWideChar;
|
|
const pProperties: IPortableDeviceValues;
|
|
out ppData: IStream;
|
|
var pdwOptimalWriteBufferSize: LongWord): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceServiceMethods
|
|
// Flags: (0)
|
|
// GUID: {E20333C9-FD34-412D-A381-CC6F2D820DF7}
|
|
// *********************************************************************//
|
|
IPortableDeviceServiceMethods = interface(IUnknown)
|
|
['{E20333C9-FD34-412D-A381-CC6F2D820DF7}']
|
|
function Invoke(var Method: TGUID; const pParameters: IPortableDeviceValues;
|
|
var ppResults: IPortableDeviceValues): HResult; stdcall;
|
|
function InvokeAsync(var Method: TGUID; const pParameters: IPortableDeviceValues;
|
|
const pCallback: IPortableDeviceServiceMethodCallback): HResult; stdcall;
|
|
function Cancel(const pCallback: IPortableDeviceServiceMethodCallback): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceServiceMethodCallback
|
|
// Flags: (0)
|
|
// GUID: {C424233C-AFCE-4828-A756-7ED7A2350083}
|
|
// *********************************************************************//
|
|
IPortableDeviceServiceMethodCallback = interface(IUnknown)
|
|
['{C424233C-AFCE-4828-A756-7ED7A2350083}']
|
|
function OnComplete(hrStatus: HResult; const pResults: IPortableDeviceValues): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// Interface: IPortableDeviceDispatchFactory
|
|
// Flags: (0)
|
|
// GUID: {5E1EAFC3-E3D7-4132-96FA-759C0F9D1E0F}
|
|
// *********************************************************************//
|
|
IPortableDeviceDispatchFactory = interface(IUnknown)
|
|
['{5E1EAFC3-E3D7-4132-96FA-759C0F9D1E0F}']
|
|
function GetDeviceDispatch(pszPnPDeviceID: PWideChar; out ppDeviceDispatch: IDispatch): HResult; stdcall;
|
|
end;
|
|
|
|
// *********************************************************************//
|
|
// The Class CoPortableDevice provides a Create and CreateRemote method to
|
|
// create instances of the default interface IPortableDevice exposed by
|
|
// the CoClass PortableDevice. The functions are intended to be used by
|
|
// clients wishing to automate the CoClass objects exposed by the
|
|
// server of this typelibrary.
|
|
// *********************************************************************//
|
|
CoPortableDevice = class
|
|
class function Create: IPortableDevice;
|
|
class function CreateRemote(const MachineName: string): IPortableDevice;
|
|
end;
|
|
|
|
|
|
// *********************************************************************//
|
|
// OLE Server Proxy class declaration
|
|
// Server Object : TPortableDevice
|
|
// Help String : PortableDevice Class
|
|
// Default Interface: IPortableDevice
|
|
// Def. Intf. DISP? : No
|
|
// Event Interface:
|
|
// TypeFlags : (2) CanCreate
|
|
// *********************************************************************//
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
TPortableDeviceProperties= class;
|
|
{$ENDIF}
|
|
TPortableDevice = class(TOleServer)
|
|
private
|
|
FIntf: IPortableDevice;
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps: TPortableDeviceProperties;
|
|
function GetServerProperties: TPortableDeviceProperties;
|
|
{$ENDIF}
|
|
function GetDefaultInterface: IPortableDevice;
|
|
protected
|
|
procedure InitServerData; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Connect; override;
|
|
procedure ConnectTo(svrIntf: IPortableDevice);
|
|
procedure Disconnect; override;
|
|
function Open(pszPnPDeviceID: PWideChar; const pClientInfo: IPortableDeviceValues): HResult;
|
|
function SendCommand(dwFlags: LongWord; const pParameters: IPortableDeviceValues;
|
|
out ppResults: IPortableDeviceValues): HResult;
|
|
function Content(out ppContent: IPortableDeviceContent): HResult;
|
|
function Capabilities(out ppCapabilities: IPortableDeviceCapabilities): HResult;
|
|
function Cancel: HResult;
|
|
function Close: HResult;
|
|
function Advise(dwFlags: LongWord; const pCallback: IPortableDeviceEventCallback;
|
|
const pParameters: IPortableDeviceValues; out ppszCookie: PWideChar): HResult;
|
|
function Unadvise(pszCookie: PWideChar): HResult;
|
|
function GetPnPDeviceID(out ppszPnPDeviceID: PWideChar): HResult;
|
|
property DefaultInterface: IPortableDevice read GetDefaultInterface;
|
|
published
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
property Server: TPortableDeviceProperties read GetServerProperties;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
// *********************************************************************//
|
|
// OLE Server Properties Proxy Class
|
|
// Server Object : TPortableDevice
|
|
// (This object is used by the IDE's Property Inspector to allow editing
|
|
// of the properties of this server)
|
|
// *********************************************************************//
|
|
TPortableDeviceProperties = class(TPersistent)
|
|
private
|
|
FServer: TPortableDevice;
|
|
function GetDefaultInterface: IPortableDevice;
|
|
constructor Create(AServer: TPortableDevice);
|
|
protected
|
|
public
|
|
property DefaultInterface: IPortableDevice read GetDefaultInterface;
|
|
published
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
// *********************************************************************//
|
|
// The Class CoPortableDeviceManager provides a Create and CreateRemote method to
|
|
// create instances of the default interface IPortableDeviceManager exposed by
|
|
// the CoClass PortableDeviceManager. The functions are intended to be used by
|
|
// clients wishing to automate the CoClass objects exposed by the
|
|
// server of this typelibrary.
|
|
// *********************************************************************//
|
|
CoPortableDeviceManager = class
|
|
class function Create: IPortableDeviceManager;
|
|
class function CreateRemote(const MachineName: string): IPortableDeviceManager;
|
|
end;
|
|
|
|
|
|
// *********************************************************************//
|
|
// OLE Server Proxy class declaration
|
|
// Server Object : TPortableDeviceManager
|
|
// Help String : PortableDeviceManager Class
|
|
// Default Interface: IPortableDeviceManager
|
|
// Def. Intf. DISP? : No
|
|
// Event Interface:
|
|
// TypeFlags : (2) CanCreate
|
|
// *********************************************************************//
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
TPortableDeviceManagerProperties= class;
|
|
{$ENDIF}
|
|
TPortableDeviceManager = class(TOleServer)
|
|
private
|
|
FIntf: IPortableDeviceManager;
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps: TPortableDeviceManagerProperties;
|
|
function GetServerProperties: TPortableDeviceManagerProperties;
|
|
{$ENDIF}
|
|
function GetDefaultInterface: IPortableDeviceManager;
|
|
protected
|
|
procedure InitServerData; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Connect; override;
|
|
procedure ConnectTo(svrIntf: IPortableDeviceManager);
|
|
procedure Disconnect; override;
|
|
function GetDevices(var pPnPDeviceIDs: PWideChar; var pcPnPDeviceIDs: LongWord): HResult;
|
|
function RefreshDeviceList: HResult;
|
|
function GetDeviceFriendlyName(pszPnPDeviceID: PWideChar; var pDeviceFriendlyName: Word;
|
|
var pcchDeviceFriendlyName: LongWord): HResult;
|
|
function GetDeviceDescription(pszPnPDeviceID: PWideChar; var pDeviceDescription: Word;
|
|
var pcchDeviceDescription: LongWord): HResult;
|
|
function GetDeviceManufacturer(pszPnPDeviceID: PWideChar; var pDeviceManufacturer: Word;
|
|
var pcchDeviceManufacturer: LongWord): HResult;
|
|
function GetDeviceProperty(pszPnPDeviceID: PWideChar; pszDevicePropertyName: PWideChar;
|
|
var pData: Byte; var pcbData: LongWord; var pdwType: LongWord): HResult;
|
|
function GetPrivateDevices(var pPnPDeviceIDs: PWideChar; var pcPnPDeviceIDs: LongWord): HResult;
|
|
property DefaultInterface: IPortableDeviceManager read GetDefaultInterface;
|
|
published
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
property Server: TPortableDeviceManagerProperties read GetServerProperties;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
// *********************************************************************//
|
|
// OLE Server Properties Proxy Class
|
|
// Server Object : TPortableDeviceManager
|
|
// (This object is used by the IDE's Property Inspector to allow editing
|
|
// of the properties of this server)
|
|
// *********************************************************************//
|
|
TPortableDeviceManagerProperties = class(TPersistent)
|
|
private
|
|
FServer: TPortableDeviceManager;
|
|
function GetDefaultInterface: IPortableDeviceManager;
|
|
constructor Create(AServer: TPortableDeviceManager);
|
|
protected
|
|
public
|
|
property DefaultInterface: IPortableDeviceManager read GetDefaultInterface;
|
|
published
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
// *********************************************************************//
|
|
// The Class CoPortableDeviceService provides a Create and CreateRemote method to
|
|
// create instances of the default interface IPortableDeviceService exposed by
|
|
// the CoClass PortableDeviceService. The functions are intended to be used by
|
|
// clients wishing to automate the CoClass objects exposed by the
|
|
// server of this typelibrary.
|
|
// *********************************************************************//
|
|
CoPortableDeviceService = class
|
|
class function Create: IPortableDeviceService;
|
|
class function CreateRemote(const MachineName: string): IPortableDeviceService;
|
|
end;
|
|
|
|
|
|
// *********************************************************************//
|
|
// OLE Server Proxy class declaration
|
|
// Server Object : TPortableDeviceService
|
|
// Help String : PortableDeviceService Class
|
|
// Default Interface: IPortableDeviceService
|
|
// Def. Intf. DISP? : No
|
|
// Event Interface:
|
|
// TypeFlags : (2) CanCreate
|
|
// *********************************************************************//
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
TPortableDeviceServiceProperties= class;
|
|
{$ENDIF}
|
|
TPortableDeviceService = class(TOleServer)
|
|
private
|
|
FIntf: IPortableDeviceService;
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps: TPortableDeviceServiceProperties;
|
|
function GetServerProperties: TPortableDeviceServiceProperties;
|
|
{$ENDIF}
|
|
function GetDefaultInterface: IPortableDeviceService;
|
|
protected
|
|
procedure InitServerData; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Connect; override;
|
|
procedure ConnectTo(svrIntf: IPortableDeviceService);
|
|
procedure Disconnect; override;
|
|
function Open(pszPnPServiceID: PWideChar; const pClientInfo: IPortableDeviceValues): HResult;
|
|
function Capabilities(out ppCapabilities: IPortableDeviceServiceCapabilities): HResult;
|
|
function Content(out ppContent: IPortableDeviceContent2): HResult;
|
|
function Methods(out ppMethods: IPortableDeviceServiceMethods): HResult;
|
|
function Cancel: HResult;
|
|
function Close: HResult;
|
|
function GetServiceObjectID(out ppszServiceObjectID: PWideChar): HResult;
|
|
function GetPnPServiceID(out ppszPnPServiceID: PWideChar): HResult;
|
|
function Advise(dwFlags: LongWord; const pCallback: IPortableDeviceEventCallback;
|
|
const pParameters: IPortableDeviceValues; out ppszCookie: PWideChar): HResult;
|
|
function Unadvise(pszCookie: PWideChar): HResult;
|
|
function SendCommand(dwFlags: LongWord; const pParameters: IPortableDeviceValues;
|
|
out ppResults: IPortableDeviceValues): HResult;
|
|
property DefaultInterface: IPortableDeviceService read GetDefaultInterface;
|
|
published
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
property Server: TPortableDeviceServiceProperties read GetServerProperties;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
// *********************************************************************//
|
|
// OLE Server Properties Proxy Class
|
|
// Server Object : TPortableDeviceService
|
|
// (This object is used by the IDE's Property Inspector to allow editing
|
|
// of the properties of this server)
|
|
// *********************************************************************//
|
|
TPortableDeviceServiceProperties = class(TPersistent)
|
|
private
|
|
FServer: TPortableDeviceService;
|
|
function GetDefaultInterface: IPortableDeviceService;
|
|
constructor Create(AServer: TPortableDeviceService);
|
|
protected
|
|
public
|
|
property DefaultInterface: IPortableDeviceService read GetDefaultInterface;
|
|
published
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
// *********************************************************************//
|
|
// The Class CoPortableDeviceDispatchFactory provides a Create and CreateRemote method to
|
|
// create instances of the default interface IPortableDeviceDispatchFactory exposed by
|
|
// the CoClass PortableDeviceDispatchFactory. The functions are intended to be used by
|
|
// clients wishing to automate the CoClass objects exposed by the
|
|
// server of this typelibrary.
|
|
// *********************************************************************//
|
|
CoPortableDeviceDispatchFactory = class
|
|
class function Create: IPortableDeviceDispatchFactory;
|
|
class function CreateRemote(const MachineName: string): IPortableDeviceDispatchFactory;
|
|
end;
|
|
|
|
|
|
// *********************************************************************//
|
|
// OLE Server Proxy class declaration
|
|
// Server Object : TPortableDeviceDispatchFactory
|
|
// Help String : PortableDeviceDispatchFactory Class
|
|
// Default Interface: IPortableDeviceDispatchFactory
|
|
// Def. Intf. DISP? : No
|
|
// Event Interface:
|
|
// TypeFlags : (2) CanCreate
|
|
// *********************************************************************//
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
TPortableDeviceDispatchFactoryProperties= class;
|
|
{$ENDIF}
|
|
TPortableDeviceDispatchFactory = class(TOleServer)
|
|
private
|
|
FIntf: IPortableDeviceDispatchFactory;
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps: TPortableDeviceDispatchFactoryProperties;
|
|
function GetServerProperties: TPortableDeviceDispatchFactoryProperties;
|
|
{$ENDIF}
|
|
function GetDefaultInterface: IPortableDeviceDispatchFactory;
|
|
protected
|
|
procedure InitServerData; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Connect; override;
|
|
procedure ConnectTo(svrIntf: IPortableDeviceDispatchFactory);
|
|
procedure Disconnect; override;
|
|
function GetDeviceDispatch(pszPnPDeviceID: PWideChar; out ppDeviceDispatch: IDispatch): HResult;
|
|
property DefaultInterface: IPortableDeviceDispatchFactory read GetDefaultInterface;
|
|
published
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
property Server: TPortableDeviceDispatchFactoryProperties read GetServerProperties;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
// *********************************************************************//
|
|
// OLE Server Properties Proxy Class
|
|
// Server Object : TPortableDeviceDispatchFactory
|
|
// (This object is used by the IDE's Property Inspector to allow editing
|
|
// of the properties of this server)
|
|
// *********************************************************************//
|
|
TPortableDeviceDispatchFactoryProperties = class(TPersistent)
|
|
private
|
|
FServer: TPortableDeviceDispatchFactory;
|
|
function GetDefaultInterface: IPortableDeviceDispatchFactory;
|
|
constructor Create(AServer: TPortableDeviceDispatchFactory);
|
|
protected
|
|
public
|
|
property DefaultInterface: IPortableDeviceDispatchFactory read GetDefaultInterface;
|
|
published
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
// *********************************************************************//
|
|
// The Class CoPortableDeviceFTM provides a Create and CreateRemote method to
|
|
// create instances of the default interface IPortableDevice exposed by
|
|
// the CoClass PortableDeviceFTM. The functions are intended to be used by
|
|
// clients wishing to automate the CoClass objects exposed by the
|
|
// server of this typelibrary.
|
|
// *********************************************************************//
|
|
CoPortableDeviceFTM = class
|
|
class function Create: IPortableDevice;
|
|
class function CreateRemote(const MachineName: string): IPortableDevice;
|
|
end;
|
|
|
|
|
|
// *********************************************************************//
|
|
// OLE Server Proxy class declaration
|
|
// Server Object : TPortableDeviceFTM
|
|
// Help String : PortableDeviceFTM Class
|
|
// Default Interface: IPortableDevice
|
|
// Def. Intf. DISP? : No
|
|
// Event Interface:
|
|
// TypeFlags : (2) CanCreate
|
|
// *********************************************************************//
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
TPortableDeviceFTMProperties= class;
|
|
{$ENDIF}
|
|
TPortableDeviceFTM = class(TOleServer)
|
|
private
|
|
FIntf: IPortableDevice;
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps: TPortableDeviceFTMProperties;
|
|
function GetServerProperties: TPortableDeviceFTMProperties;
|
|
{$ENDIF}
|
|
function GetDefaultInterface: IPortableDevice;
|
|
protected
|
|
procedure InitServerData; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Connect; override;
|
|
procedure ConnectTo(svrIntf: IPortableDevice);
|
|
procedure Disconnect; override;
|
|
function Open(pszPnPDeviceID: PWideChar; const pClientInfo: IPortableDeviceValues): HResult;
|
|
function SendCommand(dwFlags: LongWord; const pParameters: IPortableDeviceValues;
|
|
out ppResults: IPortableDeviceValues): HResult;
|
|
function Content(out ppContent: IPortableDeviceContent): HResult;
|
|
function Capabilities(out ppCapabilities: IPortableDeviceCapabilities): HResult;
|
|
function Cancel: HResult;
|
|
function Close: HResult;
|
|
function Advise(dwFlags: LongWord; const pCallback: IPortableDeviceEventCallback;
|
|
const pParameters: IPortableDeviceValues; out ppszCookie: PWideChar): HResult;
|
|
function Unadvise(pszCookie: PWideChar): HResult;
|
|
function GetPnPDeviceID(out ppszPnPDeviceID: PWideChar): HResult;
|
|
property DefaultInterface: IPortableDevice read GetDefaultInterface;
|
|
published
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
property Server: TPortableDeviceFTMProperties read GetServerProperties;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
// *********************************************************************//
|
|
// OLE Server Properties Proxy Class
|
|
// Server Object : TPortableDeviceFTM
|
|
// (This object is used by the IDE's Property Inspector to allow editing
|
|
// of the properties of this server)
|
|
// *********************************************************************//
|
|
TPortableDeviceFTMProperties = class(TPersistent)
|
|
private
|
|
FServer: TPortableDeviceFTM;
|
|
function GetDefaultInterface: IPortableDevice;
|
|
constructor Create(AServer: TPortableDeviceFTM);
|
|
protected
|
|
public
|
|
property DefaultInterface: IPortableDevice read GetDefaultInterface;
|
|
published
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
// *********************************************************************//
|
|
// The Class CoPortableDeviceServiceFTM provides a Create and CreateRemote method to
|
|
// create instances of the default interface IPortableDeviceService exposed by
|
|
// the CoClass PortableDeviceServiceFTM. The functions are intended to be used by
|
|
// clients wishing to automate the CoClass objects exposed by the
|
|
// server of this typelibrary.
|
|
// *********************************************************************//
|
|
CoPortableDeviceServiceFTM = class
|
|
class function Create: IPortableDeviceService;
|
|
class function CreateRemote(const MachineName: string): IPortableDeviceService;
|
|
end;
|
|
|
|
|
|
// *********************************************************************//
|
|
// OLE Server Proxy class declaration
|
|
// Server Object : TPortableDeviceServiceFTM
|
|
// Help String : PortableDeviceServiceFTM Class
|
|
// Default Interface: IPortableDeviceService
|
|
// Def. Intf. DISP? : No
|
|
// Event Interface:
|
|
// TypeFlags : (2) CanCreate
|
|
// *********************************************************************//
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
TPortableDeviceServiceFTMProperties= class;
|
|
{$ENDIF}
|
|
TPortableDeviceServiceFTM = class(TOleServer)
|
|
private
|
|
FIntf: IPortableDeviceService;
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps: TPortableDeviceServiceFTMProperties;
|
|
function GetServerProperties: TPortableDeviceServiceFTMProperties;
|
|
{$ENDIF}
|
|
function GetDefaultInterface: IPortableDeviceService;
|
|
protected
|
|
procedure InitServerData; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Connect; override;
|
|
procedure ConnectTo(svrIntf: IPortableDeviceService);
|
|
procedure Disconnect; override;
|
|
function Open(pszPnPServiceID: PWideChar; const pClientInfo: IPortableDeviceValues): HResult;
|
|
function Capabilities(out ppCapabilities: IPortableDeviceServiceCapabilities): HResult;
|
|
function Content(out ppContent: IPortableDeviceContent2): HResult;
|
|
function Methods(out ppMethods: IPortableDeviceServiceMethods): HResult;
|
|
function Cancel: HResult;
|
|
function Close: HResult;
|
|
function GetServiceObjectID(out ppszServiceObjectID: PWideChar): HResult;
|
|
function GetPnPServiceID(out ppszPnPServiceID: PWideChar): HResult;
|
|
function Advise(dwFlags: LongWord; const pCallback: IPortableDeviceEventCallback;
|
|
const pParameters: IPortableDeviceValues; out ppszCookie: PWideChar): HResult;
|
|
function Unadvise(pszCookie: PWideChar): HResult;
|
|
function SendCommand(dwFlags: LongWord; const pParameters: IPortableDeviceValues;
|
|
out ppResults: IPortableDeviceValues): HResult;
|
|
property DefaultInterface: IPortableDeviceService read GetDefaultInterface;
|
|
published
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
property Server: TPortableDeviceServiceFTMProperties read GetServerProperties;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
// *********************************************************************//
|
|
// OLE Server Properties Proxy Class
|
|
// Server Object : TPortableDeviceServiceFTM
|
|
// (This object is used by the IDE's Property Inspector to allow editing
|
|
// of the properties of this server)
|
|
// *********************************************************************//
|
|
TPortableDeviceServiceFTMProperties = class(TPersistent)
|
|
private
|
|
FServer: TPortableDeviceServiceFTM;
|
|
function GetDefaultInterface: IPortableDeviceService;
|
|
constructor Create(AServer: TPortableDeviceServiceFTM);
|
|
protected
|
|
public
|
|
property DefaultInterface: IPortableDeviceService read GetDefaultInterface;
|
|
published
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
resourcestring
|
|
dtlServerPage = '(none)';
|
|
|
|
dtlOcxPage = '(none)';
|
|
|
|
|
|
class function CoPortableDevice.Create: IPortableDevice;
|
|
begin
|
|
Result := CreateComObject(CLASS_PortableDevice) as IPortableDevice;
|
|
end;
|
|
|
|
class function CoPortableDevice.CreateRemote(const MachineName: string): IPortableDevice;
|
|
begin
|
|
Result := CreateRemoteComObject(MachineName, CLASS_PortableDevice) as IPortableDevice;
|
|
end;
|
|
|
|
procedure TPortableDevice.InitServerData;
|
|
const
|
|
CServerData: TServerData = (
|
|
ClassID: '{728A21C5-3D9E-48D7-9810-864848F0F404}';
|
|
IntfIID: '{625E2DF8-6392-4CF0-9AD1-3CFA5F17775C}';
|
|
EventIID: '';
|
|
LicenseKey: nil;
|
|
Version: 500);
|
|
begin
|
|
ServerData := @CServerData;
|
|
end;
|
|
|
|
procedure TPortableDevice.Connect;
|
|
var
|
|
punk: IUnknown;
|
|
begin
|
|
if FIntf = nil then
|
|
begin
|
|
punk := GetServer;
|
|
Fintf:= punk as IPortableDevice;
|
|
end;
|
|
end;
|
|
|
|
procedure TPortableDevice.ConnectTo(svrIntf: IPortableDevice);
|
|
begin
|
|
Disconnect;
|
|
FIntf := svrIntf;
|
|
end;
|
|
|
|
procedure TPortableDevice.DisConnect;
|
|
begin
|
|
if Fintf <> nil then
|
|
begin
|
|
FIntf := nil;
|
|
end;
|
|
end;
|
|
|
|
function TPortableDevice.GetDefaultInterface: IPortableDevice;
|
|
begin
|
|
if FIntf = nil then
|
|
Connect;
|
|
Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call "Connect" or "ConnectTo" before this operation');
|
|
Result := FIntf;
|
|
end;
|
|
|
|
constructor TPortableDevice.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps := TPortableDeviceProperties.Create(Self);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
destructor TPortableDevice.Destroy;
|
|
begin
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps.Free;
|
|
{$ENDIF}
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
function TPortableDevice.GetServerProperties: TPortableDeviceProperties;
|
|
begin
|
|
Result := FProps;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function TPortableDevice.Open(pszPnPDeviceID: PWideChar; const pClientInfo: IPortableDeviceValues): HResult;
|
|
begin
|
|
Result := DefaultInterface.Open(pszPnPDeviceID, pClientInfo);
|
|
end;
|
|
|
|
function TPortableDevice.SendCommand(dwFlags: LongWord; const pParameters: IPortableDeviceValues;
|
|
out ppResults: IPortableDeviceValues): HResult;
|
|
begin
|
|
Result := DefaultInterface.SendCommand(dwFlags, pParameters, ppResults);
|
|
end;
|
|
|
|
function TPortableDevice.Content(out ppContent: IPortableDeviceContent): HResult;
|
|
begin
|
|
Result := DefaultInterface.Content(ppContent);
|
|
end;
|
|
|
|
function TPortableDevice.Capabilities(out ppCapabilities: IPortableDeviceCapabilities): HResult;
|
|
begin
|
|
Result := DefaultInterface.Capabilities(ppCapabilities);
|
|
end;
|
|
|
|
function TPortableDevice.Cancel: HResult;
|
|
begin
|
|
Result := DefaultInterface.Cancel;
|
|
end;
|
|
|
|
function TPortableDevice.Close: HResult;
|
|
begin
|
|
Result := DefaultInterface.Close;
|
|
end;
|
|
|
|
function TPortableDevice.Advise(dwFlags: LongWord; const pCallback: IPortableDeviceEventCallback;
|
|
const pParameters: IPortableDeviceValues; out ppszCookie: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.Advise(dwFlags, pCallback, pParameters, ppszCookie);
|
|
end;
|
|
|
|
function TPortableDevice.Unadvise(pszCookie: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.Unadvise(pszCookie);
|
|
end;
|
|
|
|
function TPortableDevice.GetPnPDeviceID(out ppszPnPDeviceID: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetPnPDeviceID(ppszPnPDeviceID);
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
constructor TPortableDeviceProperties.Create(AServer: TPortableDevice);
|
|
begin
|
|
inherited Create;
|
|
FServer := AServer;
|
|
end;
|
|
|
|
function TPortableDeviceProperties.GetDefaultInterface: IPortableDevice;
|
|
begin
|
|
Result := FServer.DefaultInterface;
|
|
end;
|
|
|
|
{$ENDIF}
|
|
|
|
class function CoPortableDeviceManager.Create: IPortableDeviceManager;
|
|
begin
|
|
Result := CreateComObject(CLASS_PortableDeviceManager) as IPortableDeviceManager;
|
|
end;
|
|
|
|
class function CoPortableDeviceManager.CreateRemote(const MachineName: string): IPortableDeviceManager;
|
|
begin
|
|
Result := CreateRemoteComObject(MachineName, CLASS_PortableDeviceManager) as IPortableDeviceManager;
|
|
end;
|
|
|
|
procedure TPortableDeviceManager.InitServerData;
|
|
const
|
|
CServerData: TServerData = (
|
|
ClassID: '{0AF10CEC-2ECD-4B92-9581-34F6AE0637F3}';
|
|
IntfIID: '{A1567595-4C2F-4574-A6FA-ECEF917B9A40}';
|
|
EventIID: '';
|
|
LicenseKey: nil;
|
|
Version: 500);
|
|
begin
|
|
ServerData := @CServerData;
|
|
end;
|
|
|
|
procedure TPortableDeviceManager.Connect;
|
|
var
|
|
punk: IUnknown;
|
|
begin
|
|
if FIntf = nil then
|
|
begin
|
|
punk := GetServer;
|
|
Fintf:= punk as IPortableDeviceManager;
|
|
end;
|
|
end;
|
|
|
|
procedure TPortableDeviceManager.ConnectTo(svrIntf: IPortableDeviceManager);
|
|
begin
|
|
Disconnect;
|
|
FIntf := svrIntf;
|
|
end;
|
|
|
|
procedure TPortableDeviceManager.DisConnect;
|
|
begin
|
|
if Fintf <> nil then
|
|
begin
|
|
FIntf := nil;
|
|
end;
|
|
end;
|
|
|
|
function TPortableDeviceManager.GetDefaultInterface: IPortableDeviceManager;
|
|
begin
|
|
if FIntf = nil then
|
|
Connect;
|
|
Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call "Connect" or "ConnectTo" before this operation');
|
|
Result := FIntf;
|
|
end;
|
|
|
|
constructor TPortableDeviceManager.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps := TPortableDeviceManagerProperties.Create(Self);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
destructor TPortableDeviceManager.Destroy;
|
|
begin
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps.Free;
|
|
{$ENDIF}
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
function TPortableDeviceManager.GetServerProperties: TPortableDeviceManagerProperties;
|
|
begin
|
|
Result := FProps;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function TPortableDeviceManager.GetDevices(var pPnPDeviceIDs: PWideChar;
|
|
var pcPnPDeviceIDs: LongWord): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetDevices(pPnPDeviceIDs, pcPnPDeviceIDs);
|
|
end;
|
|
|
|
function TPortableDeviceManager.RefreshDeviceList: HResult;
|
|
begin
|
|
Result := DefaultInterface.RefreshDeviceList;
|
|
end;
|
|
|
|
function TPortableDeviceManager.GetDeviceFriendlyName(pszPnPDeviceID: PWideChar;
|
|
var pDeviceFriendlyName: Word;
|
|
var pcchDeviceFriendlyName: LongWord): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetDeviceFriendlyName(pszPnPDeviceID, pDeviceFriendlyName,
|
|
pcchDeviceFriendlyName);
|
|
end;
|
|
|
|
function TPortableDeviceManager.GetDeviceDescription(pszPnPDeviceID: PWideChar;
|
|
var pDeviceDescription: Word;
|
|
var pcchDeviceDescription: LongWord): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetDeviceDescription(pszPnPDeviceID, pDeviceDescription,
|
|
pcchDeviceDescription);
|
|
end;
|
|
|
|
function TPortableDeviceManager.GetDeviceManufacturer(pszPnPDeviceID: PWideChar;
|
|
var pDeviceManufacturer: Word;
|
|
var pcchDeviceManufacturer: LongWord): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetDeviceManufacturer(pszPnPDeviceID, pDeviceManufacturer,
|
|
pcchDeviceManufacturer);
|
|
end;
|
|
|
|
function TPortableDeviceManager.GetDeviceProperty(pszPnPDeviceID: PWideChar;
|
|
pszDevicePropertyName: PWideChar;
|
|
var pData: Byte; var pcbData: LongWord;
|
|
var pdwType: LongWord): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetDeviceProperty(pszPnPDeviceID, pszDevicePropertyName, pData,
|
|
pcbData, pdwType);
|
|
end;
|
|
|
|
function TPortableDeviceManager.GetPrivateDevices(var pPnPDeviceIDs: PWideChar;
|
|
var pcPnPDeviceIDs: LongWord): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetPrivateDevices(pPnPDeviceIDs, pcPnPDeviceIDs);
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
constructor TPortableDeviceManagerProperties.Create(AServer: TPortableDeviceManager);
|
|
begin
|
|
inherited Create;
|
|
FServer := AServer;
|
|
end;
|
|
|
|
function TPortableDeviceManagerProperties.GetDefaultInterface: IPortableDeviceManager;
|
|
begin
|
|
Result := FServer.DefaultInterface;
|
|
end;
|
|
|
|
{$ENDIF}
|
|
|
|
class function CoPortableDeviceService.Create: IPortableDeviceService;
|
|
begin
|
|
Result := CreateComObject(CLASS_PortableDeviceService) as IPortableDeviceService;
|
|
end;
|
|
|
|
class function CoPortableDeviceService.CreateRemote(const MachineName: string): IPortableDeviceService;
|
|
begin
|
|
Result := CreateRemoteComObject(MachineName, CLASS_PortableDeviceService) as IPortableDeviceService;
|
|
end;
|
|
|
|
procedure TPortableDeviceService.InitServerData;
|
|
const
|
|
CServerData: TServerData = (
|
|
ClassID: '{EF5DB4C2-9312-422C-9152-411CD9C4DD84}';
|
|
IntfIID: '{D3BD3A44-D7B5-40A9-98B7-2FA4D01DEC08}';
|
|
EventIID: '';
|
|
LicenseKey: nil;
|
|
Version: 500);
|
|
begin
|
|
ServerData := @CServerData;
|
|
end;
|
|
|
|
procedure TPortableDeviceService.Connect;
|
|
var
|
|
punk: IUnknown;
|
|
begin
|
|
if FIntf = nil then
|
|
begin
|
|
punk := GetServer;
|
|
Fintf:= punk as IPortableDeviceService;
|
|
end;
|
|
end;
|
|
|
|
procedure TPortableDeviceService.ConnectTo(svrIntf: IPortableDeviceService);
|
|
begin
|
|
Disconnect;
|
|
FIntf := svrIntf;
|
|
end;
|
|
|
|
procedure TPortableDeviceService.DisConnect;
|
|
begin
|
|
if Fintf <> nil then
|
|
begin
|
|
FIntf := nil;
|
|
end;
|
|
end;
|
|
|
|
function TPortableDeviceService.GetDefaultInterface: IPortableDeviceService;
|
|
begin
|
|
if FIntf = nil then
|
|
Connect;
|
|
Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call "Connect" or "ConnectTo" before this operation');
|
|
Result := FIntf;
|
|
end;
|
|
|
|
constructor TPortableDeviceService.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps := TPortableDeviceServiceProperties.Create(Self);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
destructor TPortableDeviceService.Destroy;
|
|
begin
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps.Free;
|
|
{$ENDIF}
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
function TPortableDeviceService.GetServerProperties: TPortableDeviceServiceProperties;
|
|
begin
|
|
Result := FProps;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function TPortableDeviceService.Open(pszPnPServiceID: PWideChar;
|
|
const pClientInfo: IPortableDeviceValues): HResult;
|
|
begin
|
|
Result := DefaultInterface.Open(pszPnPServiceID, pClientInfo);
|
|
end;
|
|
|
|
function TPortableDeviceService.Capabilities(out ppCapabilities: IPortableDeviceServiceCapabilities): HResult;
|
|
begin
|
|
Result := DefaultInterface.Capabilities(ppCapabilities);
|
|
end;
|
|
|
|
function TPortableDeviceService.Content(out ppContent: IPortableDeviceContent2): HResult;
|
|
begin
|
|
Result := DefaultInterface.Content(ppContent);
|
|
end;
|
|
|
|
function TPortableDeviceService.Methods(out ppMethods: IPortableDeviceServiceMethods): HResult;
|
|
begin
|
|
Result := DefaultInterface.Methods(ppMethods);
|
|
end;
|
|
|
|
function TPortableDeviceService.Cancel: HResult;
|
|
begin
|
|
Result := DefaultInterface.Cancel;
|
|
end;
|
|
|
|
function TPortableDeviceService.Close: HResult;
|
|
begin
|
|
Result := DefaultInterface.Close;
|
|
end;
|
|
|
|
function TPortableDeviceService.GetServiceObjectID(out ppszServiceObjectID: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetServiceObjectID(ppszServiceObjectID);
|
|
end;
|
|
|
|
function TPortableDeviceService.GetPnPServiceID(out ppszPnPServiceID: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetPnPServiceID(ppszPnPServiceID);
|
|
end;
|
|
|
|
function TPortableDeviceService.Advise(dwFlags: LongWord;
|
|
const pCallback: IPortableDeviceEventCallback;
|
|
const pParameters: IPortableDeviceValues;
|
|
out ppszCookie: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.Advise(dwFlags, pCallback, pParameters, ppszCookie);
|
|
end;
|
|
|
|
function TPortableDeviceService.Unadvise(pszCookie: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.Unadvise(pszCookie);
|
|
end;
|
|
|
|
function TPortableDeviceService.SendCommand(dwFlags: LongWord;
|
|
const pParameters: IPortableDeviceValues;
|
|
out ppResults: IPortableDeviceValues): HResult;
|
|
begin
|
|
Result := DefaultInterface.SendCommand(dwFlags, pParameters, ppResults);
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
constructor TPortableDeviceServiceProperties.Create(AServer: TPortableDeviceService);
|
|
begin
|
|
inherited Create;
|
|
FServer := AServer;
|
|
end;
|
|
|
|
function TPortableDeviceServiceProperties.GetDefaultInterface: IPortableDeviceService;
|
|
begin
|
|
Result := FServer.DefaultInterface;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
class function CoPortableDeviceDispatchFactory.Create: IPortableDeviceDispatchFactory;
|
|
begin
|
|
Result := CreateComObject(CLASS_PortableDeviceDispatchFactory) as IPortableDeviceDispatchFactory;
|
|
end;
|
|
|
|
class function CoPortableDeviceDispatchFactory.CreateRemote(const MachineName: string): IPortableDeviceDispatchFactory;
|
|
begin
|
|
Result := CreateRemoteComObject(MachineName, CLASS_PortableDeviceDispatchFactory) as IPortableDeviceDispatchFactory;
|
|
end;
|
|
|
|
procedure TPortableDeviceDispatchFactory.InitServerData;
|
|
const
|
|
CServerData: TServerData = (
|
|
ClassID: '{43232233-8338-4658-AE01-0B4AE830B6B0}';
|
|
IntfIID: '{5E1EAFC3-E3D7-4132-96FA-759C0F9D1E0F}';
|
|
EventIID: '';
|
|
LicenseKey: nil;
|
|
Version: 500);
|
|
begin
|
|
ServerData := @CServerData;
|
|
end;
|
|
|
|
procedure TPortableDeviceDispatchFactory.Connect;
|
|
var
|
|
punk: IUnknown;
|
|
begin
|
|
if FIntf = nil then
|
|
begin
|
|
punk := GetServer;
|
|
Fintf:= punk as IPortableDeviceDispatchFactory;
|
|
end;
|
|
end;
|
|
|
|
procedure TPortableDeviceDispatchFactory.ConnectTo(svrIntf: IPortableDeviceDispatchFactory);
|
|
begin
|
|
Disconnect;
|
|
FIntf := svrIntf;
|
|
end;
|
|
|
|
procedure TPortableDeviceDispatchFactory.DisConnect;
|
|
begin
|
|
if Fintf <> nil then
|
|
begin
|
|
FIntf := nil;
|
|
end;
|
|
end;
|
|
|
|
function TPortableDeviceDispatchFactory.GetDefaultInterface: IPortableDeviceDispatchFactory;
|
|
begin
|
|
if FIntf = nil then
|
|
Connect;
|
|
Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call "Connect" or "ConnectTo" before this operation');
|
|
Result := FIntf;
|
|
end;
|
|
|
|
constructor TPortableDeviceDispatchFactory.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps := TPortableDeviceDispatchFactoryProperties.Create(Self);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
destructor TPortableDeviceDispatchFactory.Destroy;
|
|
begin
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps.Free;
|
|
{$ENDIF}
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
function TPortableDeviceDispatchFactory.GetServerProperties: TPortableDeviceDispatchFactoryProperties;
|
|
begin
|
|
Result := FProps;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function TPortableDeviceDispatchFactory.GetDeviceDispatch(pszPnPDeviceID: PWideChar;
|
|
out ppDeviceDispatch: IDispatch): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetDeviceDispatch(pszPnPDeviceID, ppDeviceDispatch);
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
constructor TPortableDeviceDispatchFactoryProperties.Create(AServer: TPortableDeviceDispatchFactory);
|
|
begin
|
|
inherited Create;
|
|
FServer := AServer;
|
|
end;
|
|
|
|
function TPortableDeviceDispatchFactoryProperties.GetDefaultInterface: IPortableDeviceDispatchFactory;
|
|
begin
|
|
Result := FServer.DefaultInterface;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
class function CoPortableDeviceFTM.Create: IPortableDevice;
|
|
begin
|
|
Result := CreateComObject(CLASS_PortableDeviceFTM) as IPortableDevice;
|
|
end;
|
|
|
|
class function CoPortableDeviceFTM.CreateRemote(const MachineName: string): IPortableDevice;
|
|
begin
|
|
Result := CreateRemoteComObject(MachineName, CLASS_PortableDeviceFTM) as IPortableDevice;
|
|
end;
|
|
|
|
procedure TPortableDeviceFTM.InitServerData;
|
|
const
|
|
CServerData: TServerData = (
|
|
ClassID: '{F7C0039A-4762-488A-B4B3-760EF9A1BA9B}';
|
|
IntfIID: '{625E2DF8-6392-4CF0-9AD1-3CFA5F17775C}';
|
|
EventIID: '';
|
|
LicenseKey: nil;
|
|
Version: 500);
|
|
begin
|
|
ServerData := @CServerData;
|
|
end;
|
|
|
|
procedure TPortableDeviceFTM.Connect;
|
|
var
|
|
punk: IUnknown;
|
|
begin
|
|
if FIntf = nil then
|
|
begin
|
|
punk := GetServer;
|
|
Fintf:= punk as IPortableDevice;
|
|
end;
|
|
end;
|
|
|
|
procedure TPortableDeviceFTM.ConnectTo(svrIntf: IPortableDevice);
|
|
begin
|
|
Disconnect;
|
|
FIntf := svrIntf;
|
|
end;
|
|
|
|
procedure TPortableDeviceFTM.DisConnect;
|
|
begin
|
|
if Fintf <> nil then
|
|
begin
|
|
FIntf := nil;
|
|
end;
|
|
end;
|
|
|
|
function TPortableDeviceFTM.GetDefaultInterface: IPortableDevice;
|
|
begin
|
|
if FIntf = nil then
|
|
Connect;
|
|
Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call "Connect" or "ConnectTo" before this operation');
|
|
Result := FIntf;
|
|
end;
|
|
|
|
constructor TPortableDeviceFTM.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps := TPortableDeviceFTMProperties.Create(Self);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
destructor TPortableDeviceFTM.Destroy;
|
|
begin
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps.Free;
|
|
{$ENDIF}
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
function TPortableDeviceFTM.GetServerProperties: TPortableDeviceFTMProperties;
|
|
begin
|
|
Result := FProps;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function TPortableDeviceFTM.Open(pszPnPDeviceID: PWideChar; const pClientInfo: IPortableDeviceValues): HResult;
|
|
begin
|
|
Result := DefaultInterface.Open(pszPnPDeviceID, pClientInfo);
|
|
end;
|
|
|
|
function TPortableDeviceFTM.SendCommand(dwFlags: LongWord;
|
|
const pParameters: IPortableDeviceValues;
|
|
out ppResults: IPortableDeviceValues): HResult;
|
|
begin
|
|
Result := DefaultInterface.SendCommand(dwFlags, pParameters, ppResults);
|
|
end;
|
|
|
|
function TPortableDeviceFTM.Content(out ppContent: IPortableDeviceContent): HResult;
|
|
begin
|
|
Result := DefaultInterface.Content(ppContent);
|
|
end;
|
|
|
|
function TPortableDeviceFTM.Capabilities(out ppCapabilities: IPortableDeviceCapabilities): HResult;
|
|
begin
|
|
Result := DefaultInterface.Capabilities(ppCapabilities);
|
|
end;
|
|
|
|
function TPortableDeviceFTM.Cancel: HResult;
|
|
begin
|
|
Result := DefaultInterface.Cancel;
|
|
end;
|
|
|
|
function TPortableDeviceFTM.Close: HResult;
|
|
begin
|
|
Result := DefaultInterface.Close;
|
|
end;
|
|
|
|
function TPortableDeviceFTM.Advise(dwFlags: LongWord;
|
|
const pCallback: IPortableDeviceEventCallback;
|
|
const pParameters: IPortableDeviceValues;
|
|
out ppszCookie: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.Advise(dwFlags, pCallback, pParameters, ppszCookie);
|
|
end;
|
|
|
|
function TPortableDeviceFTM.Unadvise(pszCookie: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.Unadvise(pszCookie);
|
|
end;
|
|
|
|
function TPortableDeviceFTM.GetPnPDeviceID(out ppszPnPDeviceID: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetPnPDeviceID(ppszPnPDeviceID);
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
constructor TPortableDeviceFTMProperties.Create(AServer: TPortableDeviceFTM);
|
|
begin
|
|
inherited Create;
|
|
FServer := AServer;
|
|
end;
|
|
|
|
function TPortableDeviceFTMProperties.GetDefaultInterface: IPortableDevice;
|
|
begin
|
|
Result := FServer.DefaultInterface;
|
|
end;
|
|
|
|
{$ENDIF}
|
|
|
|
class function CoPortableDeviceServiceFTM.Create: IPortableDeviceService;
|
|
begin
|
|
Result := CreateComObject(CLASS_PortableDeviceServiceFTM) as IPortableDeviceService;
|
|
end;
|
|
|
|
class function CoPortableDeviceServiceFTM.CreateRemote(const MachineName: string): IPortableDeviceService;
|
|
begin
|
|
Result := CreateRemoteComObject(MachineName, CLASS_PortableDeviceServiceFTM) as IPortableDeviceService;
|
|
end;
|
|
|
|
procedure TPortableDeviceServiceFTM.InitServerData;
|
|
const
|
|
CServerData: TServerData = (
|
|
ClassID: '{1649B154-C794-497A-9B03-F3F0121302F3}';
|
|
IntfIID: '{D3BD3A44-D7B5-40A9-98B7-2FA4D01DEC08}';
|
|
EventIID: '';
|
|
LicenseKey: nil;
|
|
Version: 500);
|
|
begin
|
|
ServerData := @CServerData;
|
|
end;
|
|
|
|
procedure TPortableDeviceServiceFTM.Connect;
|
|
var
|
|
punk: IUnknown;
|
|
begin
|
|
if FIntf = nil then
|
|
begin
|
|
punk := GetServer;
|
|
Fintf:= punk as IPortableDeviceService;
|
|
end;
|
|
end;
|
|
|
|
procedure TPortableDeviceServiceFTM.ConnectTo(svrIntf: IPortableDeviceService);
|
|
begin
|
|
Disconnect;
|
|
FIntf := svrIntf;
|
|
end;
|
|
|
|
procedure TPortableDeviceServiceFTM.DisConnect;
|
|
begin
|
|
if Fintf <> nil then
|
|
begin
|
|
FIntf := nil;
|
|
end;
|
|
end;
|
|
|
|
function TPortableDeviceServiceFTM.GetDefaultInterface: IPortableDeviceService;
|
|
begin
|
|
if FIntf = nil then
|
|
Connect;
|
|
Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call "Connect" or "ConnectTo" before this operation');
|
|
Result := FIntf;
|
|
end;
|
|
|
|
constructor TPortableDeviceServiceFTM.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps := TPortableDeviceServiceFTMProperties.Create(Self);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
destructor TPortableDeviceServiceFTM.Destroy;
|
|
begin
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
FProps.Free;
|
|
{$ENDIF}
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
function TPortableDeviceServiceFTM.GetServerProperties: TPortableDeviceServiceFTMProperties;
|
|
begin
|
|
Result := FProps;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function TPortableDeviceServiceFTM.Open(pszPnPServiceID: PWideChar;
|
|
const pClientInfo: IPortableDeviceValues): HResult;
|
|
begin
|
|
Result := DefaultInterface.Open(pszPnPServiceID, pClientInfo);
|
|
end;
|
|
|
|
function TPortableDeviceServiceFTM.Capabilities(out ppCapabilities: IPortableDeviceServiceCapabilities): HResult;
|
|
begin
|
|
Result := DefaultInterface.Capabilities(ppCapabilities);
|
|
end;
|
|
|
|
function TPortableDeviceServiceFTM.Content(out ppContent: IPortableDeviceContent2): HResult;
|
|
begin
|
|
Result := DefaultInterface.Content(ppContent);
|
|
end;
|
|
|
|
function TPortableDeviceServiceFTM.Methods(out ppMethods: IPortableDeviceServiceMethods): HResult;
|
|
begin
|
|
Result := DefaultInterface.Methods(ppMethods);
|
|
end;
|
|
|
|
function TPortableDeviceServiceFTM.Cancel: HResult;
|
|
begin
|
|
Result := DefaultInterface.Cancel;
|
|
end;
|
|
|
|
function TPortableDeviceServiceFTM.Close: HResult;
|
|
begin
|
|
Result := DefaultInterface.Close;
|
|
end;
|
|
|
|
function TPortableDeviceServiceFTM.GetServiceObjectID(out ppszServiceObjectID: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetServiceObjectID(ppszServiceObjectID);
|
|
end;
|
|
|
|
function TPortableDeviceServiceFTM.GetPnPServiceID(out ppszPnPServiceID: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.GetPnPServiceID(ppszPnPServiceID);
|
|
end;
|
|
|
|
function TPortableDeviceServiceFTM.Advise(dwFlags: LongWord;
|
|
const pCallback: IPortableDeviceEventCallback;
|
|
const pParameters: IPortableDeviceValues;
|
|
out ppszCookie: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.Advise(dwFlags, pCallback, pParameters, ppszCookie);
|
|
end;
|
|
|
|
function TPortableDeviceServiceFTM.Unadvise(pszCookie: PWideChar): HResult;
|
|
begin
|
|
Result := DefaultInterface.Unadvise(pszCookie);
|
|
end;
|
|
|
|
function TPortableDeviceServiceFTM.SendCommand(dwFlags: LongWord;
|
|
const pParameters: IPortableDeviceValues;
|
|
out ppResults: IPortableDeviceValues): HResult;
|
|
begin
|
|
Result := DefaultInterface.SendCommand(dwFlags, pParameters, ppResults);
|
|
end;
|
|
|
|
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
|
|
constructor TPortableDeviceServiceFTMProperties.Create(AServer: TPortableDeviceServiceFTM);
|
|
begin
|
|
inherited Create;
|
|
FServer := AServer;
|
|
end;
|
|
|
|
function TPortableDeviceServiceFTMProperties.GetDefaultInterface: IPortableDeviceService;
|
|
begin
|
|
Result := FServer.DefaultInterface;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
// TIEPortableDevices Helper Methods
|
|
|
|
// Return the ID of the root
|
|
function GetFirstStorageID(PortableDev: IPortableDevice): WideString;
|
|
var
|
|
Content: IPortableDeviceContent;
|
|
ObjectIDs: IEnumPortableDeviceObjectIDs;
|
|
ObjectID: PWideChar;
|
|
iFetched: Cardinal;
|
|
begin
|
|
Result := WPD_DEVICE_OBJECT_ID;
|
|
if PortableDev.Content( Content ) <> S_OK then
|
|
exit;
|
|
|
|
if Content.EnumObjects( 0, '', nil, ObjectIDs ) = S_OK then
|
|
begin
|
|
ObjectIDs.Reset;
|
|
ObjectIDs.Next( 1, ObjectID, iFetched );
|
|
if iFetched > 0 then
|
|
Result := ObjectID;
|
|
end
|
|
end;
|
|
|
|
|
|
// Connect to the specified device and fill PortableDev
|
|
function ConnectToDevice(sDeviceID: WideString; var PortableDev: IPortableDevice; var sLastError: string; Logger: TLogger): Boolean;
|
|
const
|
|
CLIENT_NAME : WideString = 'MyClient';
|
|
CLIENT_MAJOR_VER = 1;
|
|
CLIENT_MINOR_VER = 0;
|
|
CLIENT_REVISION = 0;
|
|
var
|
|
DeviceValues: IPortableDeviceValues;
|
|
hRes: HResult;
|
|
PropKey: _WPDtagpropertykey;
|
|
begin
|
|
Result := False;
|
|
Logger( 'Connecting to: ' + sDeviceID );
|
|
|
|
PortableDev := CoPortableDevice.Create;
|
|
try
|
|
// Create device value
|
|
DeviceValues := CreateComObject( CLASS_PortableDeviceValues ) as IPortableDeviceValues;
|
|
if VarIsClear( DeviceValues ) then
|
|
begin
|
|
Logger( 'DeviceValues: Invalid' );
|
|
Exit;
|
|
end;
|
|
Logger( 'DeviceValues: Valid' );
|
|
|
|
// Set properties
|
|
PropKey.fmtid := WPD_CLIENT_NAME_FMTID;
|
|
PropKey.pid := WPD_CLIENT_NAME_PID;
|
|
DeviceValues.SetStringValue( PropKey, PWideChar( CLIENT_NAME ));
|
|
|
|
PropKey.fmtid := WPD_CLIENT_MAJOR_VERSION_FMTID;
|
|
PropKey.pid := WPD_CLIENT_MAJOR_VERSION_PID;
|
|
DeviceValues.SetUnsignedIntegerValue( PropKey, CLIENT_MAJOR_VER );
|
|
|
|
PropKey.fmtid := WPD_CLIENT_MINOR_VERSION_FMTID;
|
|
PropKey.pid := WPD_CLIENT_MINOR_VERSION_PID;
|
|
DeviceValues.SetUnsignedIntegerValue( PropKey, CLIENT_MINOR_VER );
|
|
|
|
PropKey.fmtid := WPD_CLIENT_REVISION_FMTID;
|
|
PropKey.pid := WPD_CLIENT_REVISION_PID;
|
|
DeviceValues.SetUnsignedIntegerValue( PropKey, CLIENT_REVISION );
|
|
|
|
// Open device
|
|
hRes := PortableDev.Open( PWideChar( sDeviceID ), DeviceValues );
|
|
if hRes = E_ACCESSDENIED then
|
|
begin
|
|
// Attempt to open for read-only access
|
|
PropKey.fmtid := WPD_CLIENT_DESIRED_ACCESS_FMTID;
|
|
PropKey.pid := WPD_CLIENT_DESIRED_ACCESS_PID;
|
|
DeviceValues.SetUnsignedIntegerValue(PropKey, GENERIC_READ );
|
|
hRes := PortableDev.Open( PWideChar( sDeviceID ), DeviceValues );
|
|
end;
|
|
|
|
Result := hRes = S_OK;
|
|
if Result then
|
|
Logger( 'Connected to: ' + sDeviceID )
|
|
else
|
|
begin
|
|
Logger( 'PortableDev.Open Failure: ' + IntToStr( hRes ));
|
|
sLastError := format( 'Unable to open device (%d)', [ hRes ] );
|
|
end;
|
|
finally
|
|
DeviceValues := nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Return the friendly name for a device
|
|
function GetDeviceFriendlyName(PMan: TPortableDeviceManager; sDeviceID: WideString): WideString;
|
|
var
|
|
iLength: LongWord;
|
|
iResult: Integer;
|
|
begin
|
|
Result := '';
|
|
|
|
iLength := 0;
|
|
iResult := PMan.GetDeviceFriendlyName( PWideChar( sDeviceID ), Word( nil^ ), iLength );
|
|
if iResult = S_OK then
|
|
begin
|
|
if iLength > 0 then
|
|
begin
|
|
SetLength( Result, iLength );
|
|
ZeroMemory( PWideChar( Result ), iLength );
|
|
PMan.GetDeviceFriendlyName( PWideChar( sDeviceID ), PWord(PWideChar( Result ))^, iLength );
|
|
Result := Trim( Result );
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Return the description for a device
|
|
function GetDeviceDescription(PMan: TPortableDeviceManager; sDeviceID: WideString): WideString;
|
|
var
|
|
iLength: LongWord;
|
|
iResult: Integer;
|
|
begin
|
|
Result := '';
|
|
|
|
iLength := 0;
|
|
iResult := PMan.GetDeviceDescription( PWideChar( sDeviceID ), Word( nil^ ), iLength );
|
|
if iResult = S_OK then
|
|
begin
|
|
if iLength > 0 then
|
|
begin
|
|
SetLength( Result, iLength );
|
|
ZeroMemory( PWideChar( Result ), iLength );
|
|
PMan.GetDeviceDescription( PWideChar( sDeviceID ), PWord( PWideChar( Result ))^, iLength );
|
|
Result := Trim( Result );
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Return the manufacturer for a device
|
|
function GetDeviceManufacturer(PMan: TPortableDeviceManager; sDeviceID: WideString): WideString;
|
|
var
|
|
iLength: LongWord;
|
|
iResult: Integer;
|
|
begin
|
|
Result := '';
|
|
|
|
iLength := 0;
|
|
iResult := PMan.GetDeviceManufacturer(PWideChar( sDeviceID ), Word( nil^ ), iLength );
|
|
if iResult = S_OK then
|
|
begin
|
|
if iLength > 0 then
|
|
begin
|
|
SetLength( Result, iLength );
|
|
ZeroMemory( PWideChar( Result ), iLength );
|
|
PMan.GetDeviceManufacturer( PWideChar( sDeviceID ), PWord( PWideChar( Result ))^, iLength );
|
|
Result := Trim( Result );
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Determine if PropValues for object returns folder content type
|
|
function IsFolder(PropValues: IPortableDeviceValues): Boolean;
|
|
var
|
|
PropKey: _WPDtagpropertykey;
|
|
PropGuid: TGUID;
|
|
begin
|
|
Result := False;
|
|
if VarIsClear( PropValues ) then
|
|
exit;
|
|
|
|
PropKey.fmtid := WPD_OBJECT_CONTENT_TYPE_FMTID;
|
|
PropKey.pid := WPD_OBJECT_CONTENT_TYPE_PID;
|
|
if PropValues.GetGuidValue( PropKey, PropGuid ) = S_OK then
|
|
begin
|
|
if IsEqualGUID( PropGuid, WPD_CONTENT_TYPE_FOLDER ) or
|
|
IsEqualGUID( PropGuid, WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT ) then
|
|
Result := True;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Return a TIEWPDObject for an object
|
|
function GetObjectProperties(Prop: IPortableDeviceProperties; ObjectID: PWideChar) : TIEWPDObject;
|
|
var
|
|
ObjectName, ObjectOriginalName : PWideChar;
|
|
Keys: IPortableDeviceKeyCollection;
|
|
PropValues: IPortableDeviceValues;
|
|
PropKey: _WPDtagpropertykey;
|
|
begin
|
|
ObjectName := '';
|
|
ObjectOriginalName := '';
|
|
|
|
Prop.GetSupportedProperties( ObjectID, Keys );
|
|
Prop.GetValues( ObjectID, Keys, PropValues );
|
|
|
|
// Get the name of the object
|
|
if not VarIsClear( PropValues ) then
|
|
begin
|
|
PropKey.fmtid := WPD_OBJECT_ORIGINAL_FILE_NAME_FMTID;
|
|
PropKey.pid := WPD_OBJECT_ORIGINAL_FILE_NAME_PID;
|
|
|
|
PropValues.GetStringValue( PropKey, ObjectOriginalName );
|
|
if Length( Trim( ObjectOriginalName )) = 0 then
|
|
ObjectOriginalName := ObjectID;
|
|
|
|
PropKey.fmtid := WPD_OBJECT_NAME_FMTID;
|
|
PropKey.pid := WPD_OBJECT_NAME_PID;
|
|
|
|
PropValues.GetStringValue( PropKey, ObjectName );
|
|
end;
|
|
|
|
Result.ID := ObjectID;
|
|
Result.FriendlyName := ObjectName;
|
|
Result.Filename := ObjectOriginalName;
|
|
Result.Path := ObjectName; // Filled correctly later
|
|
|
|
if IsFolder( PropValues ) then
|
|
Result.ObjectType := iewFolder
|
|
else
|
|
Result.ObjectType := iewFile;
|
|
end;
|
|
|
|
|
|
// Return true if sText contains/equals sSearchText
|
|
// sSearchText can be FIND (exact match), FIND* (match at start) or *FIND* (match anywhere in filename)
|
|
// NOT case-sensitive
|
|
function IsSearchMatch(const sSearchText, sText : WideString) : boolean;
|
|
var
|
|
sPosText: WideString;
|
|
begin
|
|
Result := ( sSearchText <> '' ) and ( sText <> '' );
|
|
if Result = False then
|
|
exit;
|
|
|
|
sPosText := WideUpperCase( sSearchText );
|
|
if sPosText[ 1 ] = '*' then
|
|
Delete( sPosText, 1, 1 );
|
|
if sPosText[ Length( sPosText ) ] = '*' then
|
|
SetLength( sPosText, Length( sPosText ) - 1 );
|
|
|
|
// MATCH TEXT ANYWHERE
|
|
if sSearchText[ 1 ] = '*' then
|
|
Result := Pos( sPosText, WideUpperCase( sText )) > 0
|
|
else
|
|
// MATCH AT BEGINING
|
|
if sSearchText[ Length( sSearchText ) ] = '*' then
|
|
Result := Pos( sPosText, WideUpperCase( sText )) = 1
|
|
else
|
|
// EXACT MATCH
|
|
Result := sPosText = WideUpperCase( sText );
|
|
end;
|
|
|
|
|
|
// INTERNAL FOLDER ENUMERATION METHOD
|
|
// iCurrentDepth = 0: First leve, 1: second level, etc
|
|
// iMaxDepth = 0, current folder only. iMaxDepth = 1. Current folder and first level of children, iMaxDepth = -1 all folders
|
|
function _EnumerateFolder(Content: IPortableDeviceContent; var aObjects: TList;
|
|
sParentID: WideString; sParentPath: WideString;
|
|
iCurrentDepth, iMaxDepth : Integer; GetTypes: TIEWPDObjectTypes;
|
|
var sLastError : string; Logger: TLogger;
|
|
const sSearchText : WideString = ''; const sFileExtensions : String = '') : Boolean;
|
|
var
|
|
ObjectIDs: IEnumPortableDeviceObjectIDs;
|
|
ObjectID : PWideChar;
|
|
iFetched : Cardinal;
|
|
Prop: IPortableDeviceProperties;
|
|
ObjectPath: WideString;
|
|
iResult: Integer;
|
|
aObject : TIEWPDObject;
|
|
pIEObject: PIEWPDObject;
|
|
bDoAdd: Boolean;
|
|
begin
|
|
Result := True;
|
|
if VarIsClear( Content ) then
|
|
exit;
|
|
|
|
// Retrieve content properties
|
|
Content.Properties( Prop );
|
|
|
|
// Enumerate objects
|
|
iResult := Content.EnumObjects( 0, PWideChar( sParentID ), nil, ObjectIDs );
|
|
if iResult <> S_OK then
|
|
begin
|
|
Logger( 'EnumObjects Failure: ' + IntToStr( iResult ));
|
|
sLastError := format( 'Unable to enumerate objects (%d)', [ iResult ] );
|
|
if iCurrentDepth = 0 then
|
|
Result := False;
|
|
exit;
|
|
end;
|
|
|
|
// Parse objects
|
|
Logger( 'Enumerate Folder: ' + sParentID );
|
|
ObjectIDs.Reset;
|
|
ObjectIDs.Next( 1, ObjectID, iFetched );
|
|
While iFetched > 0 do
|
|
begin
|
|
// Retrieve object properties
|
|
aObject := GetObjectProperties( Prop, ObjectID );
|
|
|
|
if Length( sParentPath ) > 0 then
|
|
ObjectPath := IncludeTrailingPathDelimiter( sParentPath ) + aObject.FriendlyName
|
|
else
|
|
ObjectPath := aObject.FriendlyName;
|
|
|
|
bDoAdd := aObject.ObjectType in GetTypes;
|
|
if bDoAdd and ( sFileExtensions <> '' ) then
|
|
bDoAdd := IEFilenameInExtensions( aObject.Filename, sFileExtensions );
|
|
if bDoAdd and ( sSearchText <> '' ) then
|
|
begin
|
|
// Use full filename for files (as has extension), but friendly name for folders
|
|
if aObject.ObjectType = iewFile then
|
|
bDoAdd := IsSearchMatch( sSearchText, aObject.Filename )
|
|
else
|
|
bDoAdd := IsSearchMatch( sSearchText, aObject.FriendlyName );
|
|
end;
|
|
|
|
if bDoAdd then
|
|
begin
|
|
New( pIEObject );
|
|
pIEObject^.ID := ObjectID; // Object id - full path to object
|
|
pIEObject^.FriendlyName := aObject.FriendlyName; // Object name
|
|
pIEObject^.Filename := aObject.Filename; // Folder/file name
|
|
pIEObject^.Path := ObjectPath; // Full path to object
|
|
pIEObject^.ObjectType := aObject.ObjectType; // Folder or file?
|
|
aObjects.add( pIEObject );
|
|
end;
|
|
|
|
// Enumerate sub-folder?
|
|
if ( aObject.ObjectType = iewFolder ) then
|
|
if ( iMaxDepth = -1 ) or ( iCurrentDepth < iMaxDepth ) then
|
|
begin
|
|
Logger( format( 'Process sub-folder at depth %d', [ iCurrentDepth + 1 ] ));
|
|
Result := _EnumerateFolder( Content, aObjects, ObjectID, ObjectPath,
|
|
iCurrentDepth + 1, iMaxDepth, GetTypes,
|
|
sLastError, Logger,
|
|
sSearchText, sFileExtensions );
|
|
end;
|
|
|
|
// Fetch next
|
|
ObjectIDs.Next( 1, ObjectID, iFetched );
|
|
end;
|
|
end;
|
|
|
|
|
|
// Translate a path and return a folder ID if found
|
|
function _LocateFolderPath( Content: IPortableDeviceContent; const sParentID: WideString;
|
|
sFindPath, sParentPath: WideString;
|
|
var sDestFolderID: WideString; Logger: TLogger): Boolean;
|
|
var
|
|
ObjectIDs: IEnumPortableDeviceObjectIDs;
|
|
ObjectID : PWideChar;
|
|
iFetched: Cardinal;
|
|
Prop: IPortableDeviceProperties;
|
|
sCurrent: WideString;
|
|
iResult: Integer;
|
|
aObject : TIEWPDObject;
|
|
begin
|
|
Result := False;
|
|
if VarIsClear( content ) then
|
|
exit;
|
|
|
|
// Retrieve content properties
|
|
Content.Properties( Prop );
|
|
|
|
iResult := Content.EnumObjects( 0, PWideChar( sParentID ), nil, ObjectIDs );
|
|
if iResult <> S_OK then
|
|
begin
|
|
Logger( 'EnumObjects Failure: ' + IntToStr( iResult ));
|
|
exit;
|
|
end;
|
|
|
|
// Parse objects
|
|
Logger( 'Enumerate Folder: ' + sParentID );
|
|
ObjectIDs.Reset;
|
|
ObjectIDs.Next( 1, ObjectID, iFetched );
|
|
While iFetched > 0 do
|
|
begin
|
|
// Retrieve object properties
|
|
aObject := GetObjectProperties( Prop, ObjectID );
|
|
|
|
// We only care about folders
|
|
if aObject.ObjectType = iewFolder then
|
|
begin
|
|
sCurrent := IncludeTrailingPathDelimiter( sParentPath + aObject.FriendlyName );
|
|
|
|
if SameText( sCurrent, sFindPath ) then
|
|
begin
|
|
sDestFolderID := ObjectID;
|
|
Result := True;
|
|
exit;
|
|
end
|
|
else
|
|
// is this folder on the right path?
|
|
if Pos( WideUpperCase( sCurrent ), WideUpperCase( sFindPath )) = 1 then
|
|
begin
|
|
// Check sub-folders
|
|
Logger( 'Process sub-folder...' );
|
|
Result := _LocateFolderPath( Content, ObjectID, sFindPath, sCurrent, sDestFolderID, Logger );
|
|
if Result then
|
|
exit;
|
|
end;
|
|
end;
|
|
|
|
// Fetch next
|
|
ObjectIDs.Next( 1, ObjectID, iFetched );
|
|
end;
|
|
end;
|
|
|
|
|
|
// Convert a WideString value to a tag_inner_PROPVARIANT
|
|
procedure WideStringToPropVariant(sVal: WideString; var PropVarValue: tag_inner_PROPVARIANT);
|
|
var
|
|
pValues: IPortableDeviceValues;
|
|
PropKey: _WPDtagpropertykey;
|
|
begin
|
|
pValues := CreateComObject( CLASS_PortableDeviceValues ) as IPortableDeviceValues;
|
|
if VarIsClear( pValues ) then
|
|
Exit;
|
|
|
|
try
|
|
// Convert WideString value to IPortableDeviceValues object
|
|
PropKey.fmtid := WPD_OBJECT_ID_FMTID;
|
|
PropKey.pid := WPD_OBJECT_ID_PID;
|
|
pValues.SetStringValue( PropKey, PWideChar( sVal ));
|
|
|
|
// Return as a PROPVARIANT
|
|
pValues.GetValue( PropKey, PropVarValue );
|
|
|
|
finally
|
|
pValues := nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Convert a tag_inner_PROPVARIANT value to a WideString
|
|
procedure PropVariantToString(PropVarValue: tag_inner_PROPVARIANT; var sVal: WideString);
|
|
var
|
|
pValues: IPortableDeviceValues;
|
|
PropKey: _WPDtagpropertykey;
|
|
hRes: HResult;
|
|
pVal: PWideChar;
|
|
begin
|
|
sVal := '';
|
|
pValues := CreateComObject( CLASS_PortableDeviceValues ) as IPortableDeviceValues;
|
|
if VarIsClear( pValues ) then
|
|
Exit;
|
|
|
|
try
|
|
// Convert PROPVARIANT to IPortableDeviceValues object
|
|
PropKey.fmtid := WPD_OBJECT_ID_FMTID;
|
|
PropKey.pid := WPD_OBJECT_ID_PID;
|
|
pValues.SetValue( PropKey, PropVarValue );
|
|
|
|
// Check for error
|
|
if PropVarValue.vt = VT_ERROR then
|
|
begin
|
|
pValues.GetErrorValue( PropKey, hRes );
|
|
sVal := SysErrorMessage( hRes );
|
|
end
|
|
else
|
|
begin
|
|
// Return as WideString
|
|
pValues.GetStringValue( PropKey, pVal );
|
|
sVal := pVal;
|
|
end;
|
|
|
|
finally
|
|
pValues := nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Null a PROPVARIANT var
|
|
procedure InitPropVariant(out pvar: PROPVARIANT);
|
|
begin
|
|
ZeroMemory( @pvar, SizeOf( PROPVARIANT ));
|
|
end;
|
|
|
|
|
|
// Specify a sFileID for one file (ssFileIDs must be nil) or ssFileIDs for multiple files
|
|
// Note: Can delete folder if bDeleteSubObjects = true
|
|
function _DeleteFromDevice(const sDeviceID : WideString; sFileID: WideString; ssFileIDs : TStrings; bDeleteSubObjects: Boolean;
|
|
var sResultText: WideString; var sLastError : string; Logger: TLogger): Integer;
|
|
var
|
|
bSuccess: Boolean;
|
|
PortableDev: IPortableDevice;
|
|
Content: IPortableDeviceContent;
|
|
PropKey: tag_inner_PROPVARIANT;
|
|
pFiles, pRes: IPortableDevicePropVariantCollection;
|
|
iCount: Cardinal;
|
|
dwOptions: LongWord;
|
|
I: Integer;
|
|
|
|
// Add file name to deletion list
|
|
procedure _AddFile(const sID: WideString);
|
|
begin
|
|
InitPropVariant( ActiveX.PROPVARIANT( PropKey ));
|
|
WideStringToPropVariant( sID, PropKey );
|
|
pFiles.Add( PropKey );
|
|
end;
|
|
|
|
begin
|
|
Result := -1;
|
|
sLastError := '';
|
|
sResultText := '';
|
|
try
|
|
if ConnectToDevice( sDeviceID, PortableDev, sLastError, Logger ) = False then
|
|
exit;
|
|
|
|
try
|
|
// Read Content of device
|
|
if PortableDev.Content( Content ) <> S_OK then
|
|
exit;
|
|
|
|
pFiles := CreateComObject( CLASS_PortableDevicePropVariantCollection ) as IPortableDevicePropVariantCollection;
|
|
if VarIsClear( pFiles ) then
|
|
Exit;
|
|
|
|
pRes := CreateComObject( CLASS_PortableDevicePropVariantCollection ) as IPortableDevicePropVariantCollection;
|
|
if VarIsClear( pRes ) then
|
|
Exit;
|
|
|
|
// TStrings?
|
|
if assigned( ssFileIDs ) = False then
|
|
// Just one file to delete
|
|
_AddFile( sFileID )
|
|
else
|
|
// Delete list of files
|
|
for I := 0 to ssFileIDs.Count - 1 do
|
|
_AddFile( ssFileIDs[ I ] );
|
|
|
|
// DELETE
|
|
Logger( 'Deleting file: ' + sFileID );
|
|
// With recursion?
|
|
dwOptions := 0;
|
|
if bDeleteSubObjects then
|
|
dwOptions := 1;
|
|
bSuccess := Content.Delete( dwOptions, pFiles, pRes ) = S_OK;
|
|
|
|
pRes.GetCount( iCount );
|
|
if bSuccess then
|
|
Result := iCount;
|
|
if iCount > 0 then
|
|
begin
|
|
InitPropVariant( ActiveX.PROPVARIANT( PropKey ));
|
|
pRes.GetAt( 0, PropKey );
|
|
PropVariantToString( PropKey, sResultText );
|
|
|
|
Logger( 'Delete: ' + sResultText );
|
|
end;
|
|
finally
|
|
PortableDev.Close;
|
|
end;
|
|
finally
|
|
pFiles := nil;
|
|
pRes := nil;
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
{ TIEPortableDevices }
|
|
|
|
constructor TIEPortableDevices.Create;
|
|
begin
|
|
inherited Create;
|
|
fDevicesInitialized := False;
|
|
fObjectsInitialized := False;
|
|
fSorted := True;
|
|
fHideEmptyDevices := False;
|
|
end;
|
|
|
|
|
|
destructor TIEPortableDevices.Destroy();
|
|
begin
|
|
Clear;
|
|
FreeAndNil( fObjects );
|
|
FreeAndNil( fDevices );
|
|
inherited;
|
|
end;
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.DeviceIDToIndex
|
|
|
|
<FM>Declaration<FC>
|
|
function DeviceIDToIndex(const sDeviceID: WideString): Integer;
|
|
|
|
<FM>Description<FN>
|
|
Return the index of the device in the <L TIEPortableDevices.Devices>Devices list</L> with the specified ID.
|
|
|
|
Result is -1 if the ID is not valid.
|
|
|
|
<FM>Example<FC>
|
|
// Get the friendly name of the selected device in a listbox
|
|
sFriendlyName := Devices[ DeviceIDToIndex( lbxDevices.Items[ lbxDevices.ItemIndex ] ) ].FriendlyName;<FN>
|
|
!!}
|
|
function TIEPortableDevices.DeviceIDToIndex(const sDeviceID: WideString): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := -1;
|
|
CheckDevicesInitialized;
|
|
for I := 0 to fDevices.Count - 1 do
|
|
if PIEPortableDevice( fDevices[ I ] )^.ID = sDeviceID then
|
|
begin
|
|
Result := I;
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.Objects
|
|
|
|
<FM>Declaration<FC>
|
|
property Objects[Index: Integer]: <A TIEWPDObject>; (read-only)
|
|
|
|
<FM>Description<FN>
|
|
An array of all objects found in the <L TIEPortableDevices.ActiveFolderID>current folder</L> of the <L TIEPortableDevices.ActiveDeviceID>active device</L>.
|
|
|
|
The <L TIEPortableDevices.Objects>objects list</L> is filled after a successful call to any of the following:
|
|
- <A TIEPortableDevices.NavigateToFolderID>
|
|
- <A TIEPortableDevices.NavigateToFolderPath>
|
|
- <A TIEPortableDevices.NavigateToParent>
|
|
- <A TIEPortableDevices.FindFilesByName>
|
|
- <A TIEPortableDevices.FindFilesOfType>
|
|
- Or by setting <A TIEPortableDevices.ActiveFolderID>
|
|
|
|
<FM>Examples<FC>
|
|
// Navigate to folder and fill list box with its object IDs
|
|
procedure TfrmMain.OpenFolder(const sFolderID : WideString);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
fPortableDevices.ActiveFolderID := sFolderID;
|
|
lbxObjects.Items.Clear;
|
|
for I := 0 to fPortableDevices.ObjectCount - 1 do
|
|
lbxObjects.Items.Add( fPortableDevices.Objects[ I ].ID );
|
|
end;
|
|
|
|
// Save the selection to a file and launch it
|
|
Idx := fPortableDevices.ObjectIDToIndex( lbxObjects.Items[ lbxObjects.ItemIndex ] );
|
|
aObject := fPortableDevices.Objects[ Idx ];
|
|
if aObject.ObjectType <> iewFolder then
|
|
begin
|
|
sFilename := IncludeTrailingBackSlash( ExtractFilePath( Application.ExeName )) + aObject.Filename;
|
|
if fPortableDevices.CopyFileFromDevice(SelectedDeviceID, aObject.ID, sFileName) then
|
|
ShellExecute( Handle, 'open', PChar( sFileName ), nil, nil, SW_MAXIMIZE );
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.GetObjects(Index: Integer): TIEWPDObject;
|
|
begin
|
|
CheckObjectsInitialized;
|
|
|
|
if assigned( fObjects ) and ( Index >= 0 ) and ( Index < fObjects.Count ) then
|
|
begin
|
|
Result := TIEWPDObject( fObjects[ Index ]^ );
|
|
end
|
|
else
|
|
begin
|
|
Result.ID := '';
|
|
Result.FriendlyName := '';
|
|
Result.Filename := '';
|
|
Result.Path := '';
|
|
Result.ObjectType := iewFile;
|
|
end;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.ObjectCount
|
|
|
|
<FM>Declaration<FC>
|
|
property ObjectCount : Integer; (read-only)
|
|
|
|
<FM>Description<FN>
|
|
Returns the number of objects in the <L TIEPortableDevices.Objects>Object list</L>.
|
|
|
|
<FM>Example<FC>
|
|
// Navigate to folder and fill listbox with its object IDs
|
|
procedure TfrmMain.OpenFolder(const sFolderID : WideString);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
fPortableDevices.ActiveFolderID := sFolderID;
|
|
lbxObjects.Items.Clear;
|
|
for I := 0 to fPortableDevices.ObjectCount - 1 do
|
|
lbxObjects.Items.Add( fPortableDevices.Objects[ I ].ID );
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.GetObjectCount: Integer;
|
|
begin
|
|
Result := 0;
|
|
CheckObjectsInitialized;
|
|
if assigned( fObjects ) then
|
|
result := fObjects.Count;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.ObjectIDToIndex
|
|
|
|
<FM>Declaration<FC>
|
|
function ObjectIDToIndex(const sObjectID: WideString): Integer;
|
|
|
|
<FM>Description<FN>
|
|
Returns the index of the object in the <L TIEPortableDevices.Objects>Objects list</L> with the specified ID.
|
|
|
|
Result is -1 if the ID is not valid.
|
|
|
|
<FM>Example<FC>
|
|
// Get the friendly name of the selected object in listbox
|
|
sFriendlyName := Objects[ ObjectIDToIndex( lbxObjects.Items[ lbxObjects.ItemIndex ] ) ].FriendlyName;<FN>
|
|
!!}
|
|
function TIEPortableDevices.ObjectIDToIndex(const sObjectID: WideString): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := -1;
|
|
CheckObjectsInitialized;
|
|
if assigned( fObjects ) = False then
|
|
exit;
|
|
for I := 0 to fObjects.Count - 1 do
|
|
if PIEWPDObject( fObjects[ I ] )^.ID = sObjectID then
|
|
begin
|
|
Result := I;
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.ObjectIsFolder
|
|
|
|
<FM>Declaration<FC>
|
|
function ObjectIsFolder(const sObjectID : WideString) : Boolean; overload;
|
|
function ObjectIsFolder(Index: Integer): Boolean; overload;
|
|
|
|
<FM>Description<FN>
|
|
Returns true if the object of the specified ID or index in the <L TIEPortableDevices.Objects>objects list</L> is a folder (i.e. <L TIEWPDObject>ObjectType</L> is iewFolder).
|
|
|
|
This is the same as calling:
|
|
<FC>bIsFolder := IEPortableDevices.Objects[ ObjectIDToIndex( sObjectID ) ].ObjectType = iewFolder;<FN>
|
|
|
|
<FM>Example<FC>
|
|
// Open folder on double click
|
|
procedure TfrmMain.lbxObjectsDblClick(Sender: TObject);
|
|
var
|
|
Idx: Integer;
|
|
aObject: TIEWPDObject;
|
|
begin
|
|
if ( lbxObjects.ItemIndex >= 0 ) and
|
|
fPortableDevices.ObjectIsFolder( lbxObjects.Items[ lbxObjects.ItemIndex ] ) then
|
|
begin
|
|
// Fill Objects with items in this folder
|
|
if fPortableDevices.NavigateToFolderID( lbxObjects.Items[ lbxObjects.ItemIndex ] ) then
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
for I := 0 to fPortableDevices.ObjectCount - 1 do
|
|
lbxObjects.Items.Add( fPortableDevices.Objects[ I ].ID );
|
|
end;
|
|
end;
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.ObjectIsFolder(const sObjectID: WideString): Boolean;
|
|
begin
|
|
Result := ObjectIsFolder( ObjectIDToIndex( sObjectID ));
|
|
end;
|
|
|
|
function TIEPortableDevices.ObjectIsFolder(Index: Integer): Boolean;
|
|
begin
|
|
result := False;
|
|
CheckObjectsInitialized;
|
|
if assigned( fObjects ) and ( Index >= 0 ) and ( Index < fObjects.Count ) then
|
|
Result := TIEWPDObject( fObjects[ Index ]^ ).ObjectType = iewFolder;
|
|
end;
|
|
|
|
|
|
// Sort method: Alphabetical by name, folders before files
|
|
function CompareNames(Object1, Object2: Pointer): Integer;
|
|
var
|
|
bObject1IsFolder, bObject2IsFolder : Boolean;
|
|
begin
|
|
bObject1IsFolder := PIEWPDObject( Object1 )^.ObjectType = iewFolder;
|
|
bObject2IsFolder := PIEWPDObject( Object2 )^.ObjectType = iewFolder;
|
|
|
|
// Folders always appear before files
|
|
if bObject1IsFolder <> bObject2IsFolder then
|
|
begin
|
|
if bObject1IsFolder then
|
|
Result := -1
|
|
else
|
|
Result := 1;
|
|
end
|
|
else
|
|
begin
|
|
// Sort by friendly name (so folders sort correctly)
|
|
Result := CompareText( PIEWPDObject( Object1 )^.FriendlyName, PIEWPDObject( Object2 )^.FriendlyName );
|
|
end;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.NavigateToFolderID
|
|
|
|
<FM>Declaration<FC>
|
|
function NavigateToFolderID(const sFolderID : WideString; bIncludeSubFolders : Boolean = False; GetTypes: <A TIEWPDObjectTypes> = [iewFile, iewFolder]) : Boolean; overload;
|
|
function NavigateToFolderID(const sDeviceID, sFolderID : WideString; bIncludeSubFolders : Boolean = False; GetTypes: <A TIEWPDObjectTypes> = [iewFile, iewFolder]) : Boolean; overload;
|
|
|
|
<FM>Description<FN>
|
|
Navigates to a folder specified by an Object ID and fills the <L TIEPortableDevices.Objects>objects list</L>.
|
|
|
|
The ID can be any object in the <L TIEPortableDevices.Objects>objects list</L> of ObjectType = iewFolder.
|
|
|
|
<TABLE>
|
|
<R> <H>Parameter</H> <H>Description</H> </R>
|
|
<R> <C>sDeviceID</C> <C>The device to open (if not specified then the <L TIEPortableDevices.ActiveDeviceID>active device</L> is used)</C> </R>
|
|
<R> <C>sFolderID</C> <C>The ID of a folder object to open. Can be '' to open the device root folder</C> </R>
|
|
<R> <C>bIncludeSubFolders</C> <C>Whether to also retrieve objects in sub-folders</C> </R>
|
|
<R> <C>GetTypes</C> <C>They type of objects to returns, files (iewFile), folders (iewFolder) or both</C> </R>
|
|
</TABLE>
|
|
|
|
Result is false if an error was detected. You can check <A TIEPortableDevices.LastError> for detail on the failure.
|
|
|
|
<FC>ActiveDeviceID<FN> and <FC>ActiveFolderID<FN> will be updated after calling <FC>NavigateToFolderID<FN>. Use of <FC>NavigateToFolderID(const sDeviceID, sFolderID );<FN> is the same as setting:
|
|
<FC>ActiveDeviceID := sDeviceID;
|
|
ActiveFolderID := sFolderID;<FN>
|
|
|
|
<FM>Example<FC>
|
|
// Open folder on double click
|
|
procedure TfrmMain.lbxObjectsDblClick(Sender: TObject);
|
|
var
|
|
Idx: Integer;
|
|
aObject: TIEWPDObject;
|
|
begin
|
|
if ( lbxObjects.ItemIndex >= 0 ) and
|
|
fPortableDevices.ObjectIsFolder( lbxObjects.Items[ lbxObjects.ItemIndex ] ) then
|
|
begin
|
|
// Fill Objects with items in this folder
|
|
if fPortableDevices.NavigateToFolderID( lbxObjects.Items[ lbxObjects.ItemIndex ] ) then
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
for I := 0 to fPortableDevices.ObjectCount - 1 do
|
|
lbxObjects.Items.Add( fPortableDevices.Objects[ I ].ID );
|
|
end;
|
|
end;
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.NavigateToFolderID(const sDeviceID, sFolderID: WideString; bIncludeSubFolders : Boolean = False; GetTypes: TIEWPDObjectTypes = [iewFile, iewFolder]): Boolean;
|
|
var
|
|
PortableDev: IPortableDevice;
|
|
Content: IPortableDeviceContent;
|
|
iMaxDepth: Integer;
|
|
begin
|
|
Result := False;
|
|
fLastError := '';
|
|
if sDeviceID <> '' then
|
|
fActiveDeviceID := sDeviceID;
|
|
fActiveFolderID := sFolderID;
|
|
fObjectsInitialized := True;
|
|
ClearObjectList;
|
|
try
|
|
if ConnectToDevice( fActiveDeviceID, PortableDev, fLastError, AddToLog ) = False then
|
|
exit;
|
|
|
|
try
|
|
// Read content of device
|
|
if PortableDev.Content( Content ) = S_OK then
|
|
begin
|
|
iMaxDepth := 0;
|
|
if bIncludeSubFolders then
|
|
iMaxDepth := -1;
|
|
|
|
// if sFolderID = '' then navigate to root
|
|
if sFolderID = '' then
|
|
Result := _EnumerateFolder( Content, fObjects, GetFirstStorageID( PortableDev ), '', 0, iMaxDepth, GetTypes, fLastError, AddToLog )
|
|
else
|
|
Result := _EnumerateFolder( Content, fObjects, sFolderID, sFolderID, 0, iMaxDepth, GetTypes, fLastError, AddToLog );
|
|
end;
|
|
finally
|
|
PortableDev.Close;
|
|
end;
|
|
|
|
// Don't sort if we are parsing sub-folders as it will take too long
|
|
if fSorted and ( bIncludeSubFolders = False ) then
|
|
fObjects.Sort( @CompareNames );
|
|
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
function TIEPortableDevices.NavigateToFolderID(const sFolderID : WideString; bIncludeSubFolders : Boolean = False; GetTypes: TIEWPDObjectTypes = [iewFile, iewFolder]) : Boolean;
|
|
begin
|
|
Result := NavigateToFolderID( '', sFolderID, bIncludeSubFolders, GetTypes );
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.NavigateToFolderPath
|
|
|
|
<FM>Declaration<FC>
|
|
function NavigateToFolderPath(const sPath : WideString; bIncludeSubFolders : Boolean = False; GetTypes: <A TIEWPDObjectTypes> = [iewFile, iewFolder]) : Boolean; overload;
|
|
function NavigateToFolderPath(const sDeviceID, sPath : WideString; bIncludeSubFolders : Boolean = False; GetTypes: <A TIEWPDObjectTypes> = [iewFile, iewFolder]) : Boolean; overload;
|
|
|
|
<FM>Description<FN>
|
|
Navigates to a device folder specified by a path and fills the <L TIEPortableDevices.Objects>objects list</L>. A path is a list of folders specified by their FriendlyName and delimited by a slash. e.g. Card\DCIM\ for the image folder on a smartphone.
|
|
|
|
<TABLE>
|
|
<R> <H>Parameter</H> <H>Description</H> </R>
|
|
<R> <C>sDeviceID</C> <C>The device to open (if not specified then the <L TIEPortableDevices.ActiveDeviceID>active device</L> is used)</C> </R>
|
|
<R> <C>sPath</C> <C>The path to open on that device</C> </R>
|
|
<R> <C>bIncludeSubFolders</C> <C>Whether to also retrieve objects in sub-folders</C> </R>
|
|
<R> <C>GetTypes</C> <C>They type of objects to returns, files (iewFile), folders (iewFolder) or both</C> </R>
|
|
</TABLE>
|
|
|
|
Result is false if an error was detected. You can check <A TIEPortableDevices.LastError> for detail on the failure.
|
|
|
|
<FM>Example<FC>
|
|
// Add all files in the DCIM folder and its sub-folders
|
|
if fPortableDevices.NavigateToFolderPath( 'Card\DCIM\', True, iewFile ) then
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
for I := 0 to fPortableDevices.ObjectCount - 1 do
|
|
lbxObjects.Items.Add( fPortableDevices.Objects[ I ].ID );
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.NavigateToFolderPath(const sDeviceID, sPath : WideString; bIncludeSubFolders : Boolean = False; GetTypes: TIEWPDObjectTypes = [iewFile, iewFolder]) : Boolean;
|
|
var
|
|
PortableDev: IPortableDevice;
|
|
Content: IPortableDeviceContent;
|
|
sFoundFolderID : WideString;
|
|
sParentID: WideString;
|
|
begin
|
|
Result := False;
|
|
fLastError := '';
|
|
sFoundFolderID := '';
|
|
if sPath = '' then
|
|
exit;
|
|
if sDeviceID <> '' then
|
|
fActiveDeviceID := sDeviceID;
|
|
try
|
|
if ConnectToDevice( fActiveDeviceID, PortableDev, fLastError, AddToLog ) = False then
|
|
exit;
|
|
|
|
try
|
|
// Read content of device
|
|
if PortableDev.Content( Content ) = S_OK then
|
|
begin
|
|
sParentID := GetFirstStorageID( PortableDev );
|
|
|
|
// Note: Find Path must have trailing backslash!
|
|
if _LocateFolderPath( Content, sParentID, IEAddBackSlash( sPath ), '', sFoundFolderID, AddToLog ) then
|
|
Result := NavigateToFolderID( fActiveDeviceID, sFoundFolderID, bIncludeSubFolders )
|
|
else
|
|
fLastError := 'Unable to locate path: ' + sPath;
|
|
end;
|
|
finally
|
|
PortableDev.Close;
|
|
end;
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
function TIEPortableDevices.NavigateToFolderPath(const sPath : WideString; bIncludeSubFolders : Boolean = False; GetTypes: TIEWPDObjectTypes = [iewFile, iewFolder]) : Boolean;
|
|
begin
|
|
Result := NavigateToFolderPath( '', sPath, bIncludeSubFolders, GetTypes );
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.NavigateToParent
|
|
|
|
<FM>Declaration<FC>
|
|
function NavigateToParent : Boolean;
|
|
|
|
<FM>Description<FN>
|
|
Opens the parent of the <L TIEPortableDevices.ActiveFolderID>active folder</L>.
|
|
|
|
The <L TIEPortableDevices.Objects>objects list</L> will be filled if this method succeeds
|
|
|
|
Result is false if an error was detected. You can check <A TIEPortableDevices.LastError> for detail on the failure.
|
|
|
|
Note: Use <A TIEPortableDevices.CanNavigateToParent> to check whether the current folder has a parent
|
|
|
|
<FM>Example<FC>
|
|
// Go to the parent of the displayed folder
|
|
procedure TfrmMain.btnOpenParentClick(Sender: TObject);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if fPortableDevices.NavigateToParent() then
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
for I := 0 to fPortableDevices.ObjectCount - 1 do
|
|
lbxObjects.Items.Add( fPortableDevices.Objects[ I ].ID );
|
|
end;
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.NavigateToParent() : Boolean;
|
|
var
|
|
aProps : TIEWPDObjectAdvancedProps;
|
|
begin
|
|
Result := False;
|
|
if fActiveFolderID = '' then
|
|
exit;
|
|
if GetObjectAdvancedProps( fActiveFolderID, aProps ) then
|
|
Result := NavigateToFolderID( fActiveDeviceID, aProps.ParentID );
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.FindFilesOfType
|
|
|
|
<FM>Declaration<FC>
|
|
function FindFilesOfType(const sDeviceID, sFolderID: WideString; sFileExtensions: String; iMaxDepth : Integer = 0): Boolean; overload;
|
|
function FindFilesOfType(const sFolderID: WideString; sFileExtensions: String; iMaxDepth : Integer = 0): Boolean; overload;
|
|
|
|
<FM>Description<FN>
|
|
Searches for files of the specified file extensions and fills the <L TIEPortableDevices.Objects>objects list</L>.
|
|
|
|
<TABLE>
|
|
<R> <H>Parameter</H> <H>Description</H> </R>
|
|
<R> <C>sDeviceID</C> <C>The device to open (if not specified then the <L TIEPortableDevices.ActiveDeviceID>active device</L> is used)</C> </R>
|
|
<R> <C>sFolderID</C> <C>The ID of a folder to search. Can be '' to search the whole device</C> </R>
|
|
<R> <C>sFileExtensions</C> <C>The file types to return, in the format '*.jpg;*.jpeg;*.bmp;'</C> </R>
|
|
<R> <C>iMaxDepth</C> <C>How many folders to search below the current folder, -1: Search all sub-folders, 0: Search only the specified folder, 1: Search the specified folder and the next level of sub-folders, etc.</C> </R>
|
|
</TABLE>
|
|
|
|
Result is false if an error was detected. You can check <A TIEPortableDevices.LastError> for detail on the failure.
|
|
|
|
Note: Will only return files, i.e. objects of type iewFile
|
|
|
|
<FM>Example<FC>
|
|
// Return all images in the camera folder of a smart phone
|
|
sFolderID := PathToFolderID( 'Card\DCIM\';
|
|
if sFolderID <> '' then
|
|
if FindFilesOfType( sFolderID, '*.jpg;*.jpeg' ) then
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
for I := 0 to fPortableDevices.ObjectCount - 1 do
|
|
lbxObjects.Items.Add( fPortableDevices.Objects[ I ].ID );
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.FindFilesOfType(const sDeviceID, sFolderID: WideString; sFileExtensions: String; iMaxDepth : Integer = 0): Boolean;
|
|
var
|
|
PortableDev: IPortableDevice;
|
|
Content: IPortableDeviceContent;
|
|
begin
|
|
Result := False;
|
|
fLastError := '';
|
|
if sDeviceID <> '' then
|
|
fActiveDeviceID := sDeviceID;
|
|
fActiveFolderID := sFolderID;
|
|
fObjectsInitialized := True;
|
|
ClearObjectList;
|
|
if fActiveDeviceID = '' then
|
|
exit;
|
|
try
|
|
if ConnectToDevice( fActiveDeviceID, PortableDev, fLastError, AddToLog ) = False then
|
|
exit;
|
|
|
|
try
|
|
// Read content of device
|
|
if PortableDev.Content( Content ) = S_OK then
|
|
begin
|
|
// if sFolderID = '' then navigate to root
|
|
if sFolderID = '' then
|
|
Result := _EnumerateFolder( Content, fObjects, GetFirstStorageID( PortableDev ), '', 0, iMaxDepth, [ iewFile ], fLastError, AddToLog, '', sFileExtensions )
|
|
else
|
|
Result := _EnumerateFolder( Content, fObjects, sFolderID, sFolderID, 0, iMaxDepth, [ iewFile ], fLastError, AddToLog, '', sFileExtensions );
|
|
end;
|
|
finally
|
|
PortableDev.Close;
|
|
end;
|
|
|
|
// Don't sort if we are parsing too many Objects as it will take too long
|
|
if fSorted and ( fObjects.Count < 5000 ) then
|
|
fObjects.Sort( @CompareNames );
|
|
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
function TIEPortableDevices.FindFilesOfType(const sFolderID: WideString; sFileExtensions: String; iMaxDepth : Integer = 0): Boolean;
|
|
begin
|
|
Result := FindFilesOfType( '', sFolderID, sFileExtensions, iMaxDepth );
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.FindFilesByName
|
|
|
|
<FM>Declaration<FC>
|
|
function FindFilesByName(const sFolderID, sSearchText: WideString; GetTypes: <A TIEWPDObjectTypes> = [iewFile, iewFolder]; iMaxDepth : Integer = 0): Boolean; overload;
|
|
function FindFilesByName(const sDeviceID, sFolderID, sSearchText: WideString; GetTypes: <A TIEWPDObjectTypes> = [iewFile, iewFolder]; iMaxDepth : Integer = 0): Boolean; overload;
|
|
|
|
<FM>Description<FN>
|
|
Searches for files with the specified text and fill the <L TIEPortableDevices.Objects>objects list</L>.
|
|
|
|
<TABLE>
|
|
<R> <H>Parameter</H> <H>Description</H> </R>
|
|
<R> <C>sDeviceID</C> <C>The device to open (if not specified then the <L TIEPortableDevices.ActiveDeviceID>active device</L> is used)</C> </R>
|
|
<R> <C>sFolderID</C> <C>The ID of a folder to search. Can be '' to search the whole device</C> </R>
|
|
<R> <C>sSearchText</C> <C>The text to search for, including wildcards. *TEXT* returns objects containing TEXT, TEXT* returns objects starting with TEXT, TEXT returns only objects with TEXT as their whole name</C> </R>
|
|
<R> <C>GetTypes</C> <C>They type of objects to returns, files (iewFile), folders (iewFolder) or both</C> </R>
|
|
<R> <C>iMaxDepth</C> <C>How many folders to search below the current folder, -1: Search all sub-folders, 0: Search only the specified folder, 1: Search the specified folder and the next level of sub-folders, etc.</C> </R>
|
|
</TABLE>
|
|
|
|
Result is false if an error was detected. You can check <A TIEPortableDevices.LastError> for detail on the failure.
|
|
|
|
Note: Searches are NOT case-sensitive. File objects are checked using the "FileName" property, folder objects are checked against their "FriendlyName"
|
|
|
|
<FM>Example<FC>
|
|
// Return all files and folders in the current folder containing the word "Potato"
|
|
if FindFilesByName( sFolderID, '*potato*', [iewFile, iewFolder], 0 ) then
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
for I := 0 to fPortableDevices.ObjectCount - 1 do
|
|
lbxObjects.Items.Add( fPortableDevices.Objects[ I ].ID );
|
|
end;
|
|
|
|
// Return all files on the device of the exact filename "Image.jpg"
|
|
if FindFilesByName( sFolderID, 'Image.jpg' ) then
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
for I := 0 to fPortableDevices.ObjectCount - 1 do
|
|
lbxObjects.Items.Add( fPortableDevices.Objects[ I ].ID );
|
|
end;
|
|
|
|
// Return all folders that start with the word "Temp"
|
|
if FindFilesByName( sFolderID, 'Temp*', iewFolder ) then
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
for I := 0 to fPortableDevices.ObjectCount - 1 do
|
|
lbxObjects.Items.Add( fPortableDevices.Objects[ I ].ID );
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.FindFilesByName(const sDeviceID, sFolderID, sSearchText: WideString; GetTypes: TIEWPDObjectTypes = [iewFile, iewFolder]; iMaxDepth : Integer = 0): Boolean;
|
|
var
|
|
PortableDev: IPortableDevice;
|
|
Content: IPortableDeviceContent;
|
|
begin
|
|
Result := False;
|
|
fLastError := '';
|
|
if sDeviceID <> '' then
|
|
fActiveDeviceID := sDeviceID;
|
|
fActiveFolderID := sFolderID;
|
|
fObjectsInitialized := True;
|
|
ClearObjectList;
|
|
if fActiveDeviceID = '' then
|
|
exit;
|
|
try
|
|
if ConnectToDevice( fActiveDeviceID, PortableDev, fLastError, AddToLog ) = False then
|
|
exit;
|
|
|
|
try
|
|
// Read content of device
|
|
if PortableDev.Content( Content ) = S_OK then
|
|
begin
|
|
// if sFolderID = '' then navigate to root
|
|
if sFolderID = '' then
|
|
Result := _EnumerateFolder( Content, fObjects, GetFirstStorageID( PortableDev ), '', 0, iMaxDepth, GetTypes, fLastError, AddToLog, sSearchText, '' )
|
|
else
|
|
Result := _EnumerateFolder( Content, fObjects, sFolderID, sFolderID, 0, iMaxDepth, GetTypes, fLastError, AddToLog, sSearchText, '' );
|
|
end;
|
|
finally
|
|
PortableDev.Close;
|
|
end;
|
|
|
|
// Don't sort if we are parsing too many Objects as it will take too long
|
|
if fSorted and ( fObjects.Count < 5000 ) then
|
|
fObjects.Sort( @CompareNames );
|
|
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
function TIEPortableDevices.FindFilesByName(const sFolderID, sSearchText: WideString; GetTypes: TIEWPDObjectTypes = [iewFile, iewFolder]; iMaxDepth : Integer = 0): Boolean;
|
|
begin
|
|
Result := FindFilesByName( '', sFolderID, sSearchText, GetTypes, iMaxDepth );
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.PathToFolderID
|
|
|
|
<FM>Declaration<FC>
|
|
function PathToFolderID(const sPath : WideString) : WideString; overload;
|
|
function PathToFolderID(const sDeviceID, sPath : WideString) : WideString; overload;
|
|
|
|
<FM>Description<FN>
|
|
Locate a folder by path and returns its ID. A path is a list of folders specified by their FriendlyName and delimited by a slash. e.g. Card\DCIM\ for the image folder on a smartphone.
|
|
|
|
<TABLE>
|
|
<R> <H>Parameter</H> <H>Description</H> </R>
|
|
<R> <C>sDeviceID</C> <C>The device to check (if not specified then the <L TIEPortableDevices.ActiveDeviceID>active device</L> is used)</C> </R>
|
|
<R> <C>sPath</C> <C>The path to locate on that device</C> </R>
|
|
</TABLE>
|
|
|
|
Result is '' if the path could not be found.
|
|
|
|
<FM>Example<FC>
|
|
// Return all images in the camera folder of a smart phone
|
|
sFolderID := PathToFolderID( 'Card\DCIM\';
|
|
if sFolderID <> '' then
|
|
if FindFilesOfType( sFolderID', '*.jpg;*.jpeg' ) then
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
for I := 0 to fPortableDevices.ObjectCount - 1 do
|
|
lbxObjects.Items.Add( fPortableDevices.Objects[ I ].ID );
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.PathToFolderID(const sDeviceID, sPath : WideString) : WideString;
|
|
var
|
|
PortableDev: IPortableDevice;
|
|
Content: IPortableDeviceContent;
|
|
sFoundFolderID : WideString;
|
|
sParentID: WideString;
|
|
begin
|
|
Result := '';
|
|
fLastError := '';
|
|
sFoundFolderID := '';
|
|
if sPath = '' then
|
|
exit;
|
|
if sDeviceID <> '' then
|
|
fActiveDeviceID := sDeviceID;
|
|
try
|
|
if ConnectToDevice( fActiveDeviceID, PortableDev, fLastError, AddToLog ) = False then
|
|
exit;
|
|
|
|
try
|
|
// Read content of device
|
|
if PortableDev.Content( Content ) = S_OK then
|
|
begin
|
|
sParentID := GetFirstStorageID( PortableDev );
|
|
|
|
// Note: Find Path must have trailing backslash!
|
|
if _LocateFolderPath( Content, sParentID, IEAddBackSlash( sPath ), '', sFoundFolderID, AddToLog ) then
|
|
Result := sFoundFolderID
|
|
else
|
|
fLastError := 'Unable to locate path: ' + sPath;
|
|
end;
|
|
finally
|
|
PortableDev.Close;
|
|
end;
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
function TIEPortableDevices.PathToFolderID(const sPath : WideString) : WideString;
|
|
begin
|
|
Result := PathToFolderID( '', sPath );
|
|
end;
|
|
|
|
|
|
// Dispose of all Objects in object list and clear
|
|
procedure TIEPortableDevices.ClearObjectList();
|
|
var
|
|
i: Integer;
|
|
begin
|
|
if assigned( fObjects ) then
|
|
begin
|
|
for i := fObjects.Count - 1 downto 0 do
|
|
Dispose( fObjects[ i ] );
|
|
fObjects.Clear;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Dispose of all objects in device and object lists and clear
|
|
procedure TIEPortableDevices.Clear();
|
|
var
|
|
i: Integer;
|
|
begin
|
|
ClearObjectList;
|
|
if fDevicesInitialized then
|
|
begin
|
|
for i := fDevices.Count - 1 downto 0 do
|
|
Dispose( fDevices[ i ] );
|
|
fDevices.Clear;
|
|
fDevicesInitialized := False;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Wrapper for OnLog event
|
|
procedure TIEPortableDevices.AddToLog(const sMsg : String);
|
|
begin
|
|
if assigned( fOnLog ) then
|
|
fOnLog( Self, sMsg );
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.CanNavigateToParent
|
|
|
|
<FM>Declaration<FC>
|
|
property CanNavigateToParent : Boolean; (read-only)
|
|
|
|
<FM>Description<FN>
|
|
Returns true if there is a parent of the <L TIEPortableDevices.ActiveFolderID>active folder</L>. I.e. so that <A TIEPortableDevices.NavigateToParent> will succeed.
|
|
|
|
<FM>Example<FC>
|
|
// Enable the "Go Up" button if there is a parent of the current folder
|
|
btnOpenParent.Enabled := IEPortableDevices.CanNavigateToParent;
|
|
!!}
|
|
function TIEPortableDevices.GetCanNavigateToParent: Boolean;
|
|
begin
|
|
Result := ( fActiveFolderID <> '' ) and ( fActiveFolderID <> WPD_DEVICE_OBJECT_ID );
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.Devices
|
|
|
|
<FM>Declaration<FC>
|
|
property Devices[Index: Integer]: <A TIEPortableDevice>; (read-only)
|
|
|
|
<FM>Description<FN>
|
|
An array of all devices connected to the PC. It is filled automatically or can be refreshed by calling <A TIEPortableDevices.RefreshDevices>.
|
|
|
|
<FM>Example<FC>
|
|
// Refresh the list of devices
|
|
procedure TfrmMain.RefreshDeviceList();
|
|
var
|
|
I: Integer;
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
if fPortableDevices.RefreshDevices = False then
|
|
raise Exception.create( 'Unable to get devices: ' + fPortableDevices.LastError);
|
|
|
|
lbxDevices.Items.Clear;
|
|
for I := 0 to fPortableDevices.DeviceCount - 1 do
|
|
lbxDevices.Items.Add( fPortableDevices.Devices[ I ].ID );
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.GetDevices(Index: Integer): TIEPortableDevice;
|
|
begin
|
|
CheckDevicesInitialized;
|
|
|
|
if ( Index >= 0 ) and ( Index < fDevices.Count ) then
|
|
begin
|
|
Result := TIEPortableDevice( fDevices[ Index ]^ );
|
|
end
|
|
else
|
|
begin
|
|
Result.ID := '';
|
|
Result.FriendlyName := '';
|
|
Result.Description := '';
|
|
Result.Manufacturer := '';
|
|
Result.IsDrive := False;
|
|
end;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.DeviceCount
|
|
|
|
<FM>Declaration<FC>
|
|
property DeviceCount : Integer; (read-only)
|
|
|
|
<FM>Description<FN>
|
|
Returns the number of devices in the <L TIEPortableDevices.Devices>device list</L>.
|
|
|
|
<FM>Example<FC>
|
|
// Refresh the list of devices
|
|
procedure TfrmMain.RefreshDeviceList();
|
|
var
|
|
I: Integer;
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
if fPortableDevices.RefreshDevices = False then
|
|
raise Exception.create( 'Unable to get devices: ' + fPortableDevices.LastError);
|
|
|
|
lbxDevices.Items.Clear;
|
|
for I := 0 to fPortableDevices.DeviceCount - 1 do
|
|
lbxDevices.Items.Add( fPortableDevices.Devices[ I ].ID );
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.GetDeviceCount: Integer;
|
|
begin
|
|
CheckDevicesInitialized;
|
|
Result := fDevices.Count;
|
|
end;
|
|
|
|
|
|
// Fill the device list if its empty
|
|
procedure TIEPortableDevices.CheckDevicesInitialized();
|
|
begin
|
|
if ( fDevicesInitialized = False ) or ( fDevices.Count = 0 ) then
|
|
RefreshDevices();
|
|
end;
|
|
|
|
|
|
// Fill the object list if its empty
|
|
procedure TIEPortableDevices.CheckObjectsInitialized;
|
|
begin
|
|
if fObjectsInitialized = False then
|
|
NavigateToFolderID( fActiveDeviceID, fActiveFolderID );
|
|
end;
|
|
|
|
// Return true if any objects are found on the specified device
|
|
function TIEPortableDevices.DeviceContainsObjects(const sDeviceID : WideString) : Boolean;
|
|
var
|
|
PortableDev: IPortableDevice;
|
|
Content: IPortableDeviceContent;
|
|
sParentID: WideString;
|
|
Prop: IPortableDeviceProperties;
|
|
ObjectIDs: IEnumPortableDeviceObjectIDs;
|
|
ObjectID : PWideChar;
|
|
iFetched : Cardinal;
|
|
begin
|
|
Result := False;
|
|
if sDeviceID = '' then
|
|
exit;
|
|
try
|
|
if ConnectToDevice( sDeviceID, PortableDev, fLastError, AddToLog ) = False then
|
|
exit;
|
|
|
|
try
|
|
if PortableDev.Content( Content ) = S_OK then
|
|
begin
|
|
if VarIsClear( Content ) then
|
|
exit;
|
|
|
|
// Retrieve content properties
|
|
Content.Properties( Prop );
|
|
|
|
// Enumerate objects
|
|
sParentID := GetFirstStorageID( PortableDev );
|
|
if Content.EnumObjects( 0, PWideChar( sParentID ), nil, ObjectIDs ) <> S_OK then
|
|
exit;
|
|
|
|
// Any objects found?
|
|
ObjectIDs.Reset;
|
|
ObjectIDs.Next( 1, ObjectID, iFetched );
|
|
Result := iFetched > 0;
|
|
end;
|
|
|
|
finally
|
|
PortableDev.Close;
|
|
end;
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.RefreshDevices
|
|
|
|
<FM>Declaration<FC>
|
|
function RefreshDevices() : Boolean;
|
|
|
|
<FM>Description<FN>
|
|
Forces a recheck for connected devices.
|
|
|
|
The <L TIEPortableDevices.Devices>device list</L> is filled automatically, but will not detect newly connected or disconnected devices. Calling <FC>RefreshDevices<FN> will force the list to be refreshed.
|
|
|
|
Result is false if an error was detected. You can check <A TIEPortableDevices.LastError> for detail on the failure.
|
|
|
|
<FM>Example<FC>
|
|
// Refresh the list of devices
|
|
procedure TfrmMain.RefreshDeviceList();
|
|
var
|
|
I: Integer;
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
if fPortableDevices.RefreshDevices = False then
|
|
raise Exception.create( 'Unable to get devices: ' + fPortableDevices.LastError );
|
|
|
|
lbxDevices.Items.Clear;
|
|
for I := 0 to fPortableDevices.DeviceCount - 1 do
|
|
lbxDevices.Items.Add( fPortableDevices.Devices[ I ].ID );
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.RefreshDevices() : Boolean;
|
|
var
|
|
i, iResult: Integer;
|
|
WPDManager: TPortableDeviceManager;
|
|
iDeviceCount: LongWord;
|
|
pDevices: array of PWideChar;
|
|
sDeviceID : WideString;
|
|
pIEDevice: PIEPortableDevice;
|
|
bAddDevice: Boolean;
|
|
begin
|
|
Result := False;
|
|
fLastError := '';
|
|
if not assigned( fDevices ) then
|
|
begin
|
|
fDevices := TList.Create;
|
|
fObjects := TList.Create;
|
|
end;
|
|
Clear;
|
|
fDevicesInitialized := True;
|
|
fObjectsInitialized := False;
|
|
|
|
try
|
|
WPDManager := TPortableDeviceManager.Create( nil );
|
|
try
|
|
iResult := WPDManager.RefreshDeviceList;
|
|
if iResult <> S_OK then
|
|
raise EIEException.create( format( 'Failed to refresh device list (%d)', [ iResult ] ));
|
|
|
|
iDeviceCount := 1;
|
|
iResult := WPDManager.GetDevices( PWideChar( nil^ ), iDeviceCount );
|
|
if iResult <> S_OK then
|
|
raise EIEException.create( format( 'Failed to get device (%d)', [ iResult ] ));
|
|
|
|
AddToLog( 'Device count: '+ IntToStr( iDeviceCount ));
|
|
if iDeviceCount > 0 then
|
|
begin
|
|
SetLength( pDevices, iDeviceCount );
|
|
iResult := WPDManager.GetDevices( pDevices[ 0 ], iDeviceCount );
|
|
if iResult <> S_OK then
|
|
raise EIEException.create( format( 'Failed to get device (%d)', [ iResult ] ));
|
|
|
|
AddToLog( 'Enumerate devices' );
|
|
for i := 0 to iDeviceCount - 1 do
|
|
begin
|
|
sDeviceID := Trim( pDevices[ i ] );
|
|
AddToLog( 'Device ID: ' + sDeviceID );
|
|
|
|
bAddDevice := sDeviceID <> '';
|
|
if bAddDevice and fHideEmptyDevices then
|
|
bAddDevice := DeviceContainsObjects( sDeviceID );
|
|
|
|
if bAddDevice then
|
|
begin
|
|
New( pIEDevice );
|
|
|
|
pIEDevice^.ID := sDeviceID;
|
|
pIEDevice^.FriendlyName := GetDeviceFriendlyName( WPDManager, pDevices[ i ] );
|
|
AddToLog( 'FriendlyName: ' + pIEDevice^.FriendlyName );
|
|
pIEDevice^.Description := GetDeviceDescription ( WPDManager, pDevices[ i ] );
|
|
AddToLog( 'DeviceDescription: ' + pIEDevice^.Description );
|
|
pIEDevice^.Manufacturer := GetDeviceManufacturer( WPDManager, pDevices[ i ] );
|
|
AddToLog( 'DeviceManufacturer: ' + pIEDevice^.Manufacturer );
|
|
pIEDevice^.IsDrive := Pos( WideString(':\'), pIEDevice^.FriendlyName ) > 0;
|
|
if pIEDevice^.FriendlyName = '' then
|
|
pIEDevice^.FriendlyName := pIEDevice^.ID;
|
|
|
|
fDevices.add( pIEDevice );
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
Result := True;
|
|
finally
|
|
WPDManager.Free;
|
|
end;
|
|
except
|
|
on E: Exception do
|
|
begin
|
|
AddToLog( 'Exception: (' + e.Message + ')' );
|
|
fLastError := e.message;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.ActiveDeviceID
|
|
|
|
<FM>Declaration<FC>
|
|
property ActiveDeviceID : WideString; (read/write)
|
|
|
|
<FM>Description<FN>
|
|
Returns the ID of the device that is currently being read. I.e. if you have called <A TIEPortableDevices.NavigateToFolderPath> then <FC>ActiveDeviceID<FN> will be the Device ID that you passed.
|
|
|
|
You can also specify a device ID to navigate to the root of that device. I.e.
|
|
<FC>ActiveDeviceID := sDevice;<FN>
|
|
|
|
Is the same as:
|
|
<FC>NavigateToFolderPath( sDevice, '' );<FN>
|
|
|
|
Will return '' if no device is active.
|
|
|
|
<FM>Example<FC>
|
|
// Display the active device
|
|
edtCurrentDevice.Text := IEPortableDevices.LookupDeviceFriendlyName( IEPortableDevices.ActiveDeviceID );
|
|
!!}
|
|
procedure TIEPortableDevices.SetActiveDeviceID(const Value: WideString);
|
|
begin
|
|
if fActiveDeviceID <> Value then
|
|
begin
|
|
fActiveDeviceID := Value;
|
|
fActiveFolderID := '';
|
|
fObjectsInitialized := False;
|
|
end;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.ActiveFolderID
|
|
|
|
<FM>Declaration<FC>
|
|
property ActiveFolderID : WideString; (read/write)
|
|
|
|
<FM>Description<FN>
|
|
Returns the ID of the folder that is currently being read (the source of <A TIEPortableDevices.Objects>). I.e. if you have called <A TIEPortableDevices.NavigateToFolderPath> then <FC>ActiveFolderID<FN> will be the Folder ID that you passed.
|
|
|
|
You can also specify a folder ID to navigate to that folder on the <L TIEPortableDevices.ActiveDeviceID>active device</L>.
|
|
<FC>ActiveDeviceID := sFolderID;<FN>
|
|
|
|
Is the same as:
|
|
<FC>NavigateToFolderPath( ActiveDeviceID, sFolderID); <FN>
|
|
|
|
If '' is returned then the active folder is the device root
|
|
|
|
<FM>Example<FC>
|
|
// Display the current folder
|
|
edtCurrentFolder.Text := fPortableDevices.LookupItemFriendlyName( fPortableDevices.ActiveFolderID );
|
|
!!}
|
|
// can be '' for root!
|
|
procedure TIEPortableDevices.SetActiveFolderID(const Value: WideString);
|
|
begin
|
|
if fActiveFolderID <> Value then
|
|
begin
|
|
fActiveFolderID := Value;
|
|
fObjectsInitialized := False;
|
|
end;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.CopyFileFromDevice
|
|
|
|
<FM>Declaration<FC>
|
|
function CopyFileFromDevice(const sDeviceID, sObjectID, sDestFilename: WideString): Boolean;
|
|
|
|
<FM>Description<FN>
|
|
Copy a file of the specified <FC>sObjectID<FN> from a device to a local filename
|
|
|
|
<TABLE>
|
|
<R> <H>Parameter</H> <H>Description</H> </R>
|
|
<R> <C>sDeviceID</C> <C>The ID of the device to copy from (e.g. <A TIEPortableDevices.ActiveDeviceID></C> </R>
|
|
<R> <C>sFileID</C> <C>The ID of the file to copy (ID cannot point to a folder)</C> </R>
|
|
<R> <C>sDestFilename</C> <C>The local filename to copy the file to</C> </R>
|
|
</TABLE>
|
|
|
|
Note: Only files are supported, not folders.
|
|
|
|
<FM>Example<FC>
|
|
// Prompt the user to specify a destination file to copy to
|
|
procedure TfrmMain.btnCopyFromDeviceClick(Sender: TObject);
|
|
var
|
|
Idx: Integer;
|
|
aObject: TIEWPDObject;
|
|
begin
|
|
if lbxObjects.ItemIndex < 0 then
|
|
exit;
|
|
|
|
Idx := IEPortableDevices.ObjectIDToIndex( lbxObjects.Items[ lbxObjects.ItemIndex ] );
|
|
aObject := IEPortableDevices.Objects[ Idx ];
|
|
if aObject.ObjectType = iewFolder then
|
|
exit;
|
|
|
|
SaveDialog1.FileName := aObject.Filename;
|
|
if SaveDialog1.Execute then
|
|
IEPortableDevices.CopyFileFromDevice( IEPortableDevices.ActiveDeviceID, aObject.ID, SaveDialog1.FileName );
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.CopyFileFromDevice(const sDeviceID, sObjectID, sDestFilename: WideString): Boolean;
|
|
var
|
|
PortableDev: IPortableDevice;
|
|
Content: IPortableDeviceContent;
|
|
Resources: IPortableDeviceResources;
|
|
iTransferSize, iReadBytes: Cardinal;
|
|
PropKey: _WPDtagpropertykey;
|
|
DevStream: IStream;
|
|
FileStream: TFileStream;
|
|
Buff: array[0..(1024-1)] of Byte;
|
|
begin
|
|
Result := False;
|
|
fLastError := '';
|
|
try
|
|
if ConnectToDevice( sDeviceID, PortableDev, fLastError, AddToLog ) = False then
|
|
exit;
|
|
|
|
try
|
|
// Read content of device
|
|
if PortableDev.Content( Content ) <> S_OK then
|
|
exit;
|
|
|
|
AddToLog( 'Content: Valid' );
|
|
if Content.Transfer( Resources ) = S_OK then
|
|
begin
|
|
iTransferSize := 0;
|
|
PropKey.fmtid := WPD_RESOURCE_DEFAULT_FMTID;
|
|
PropKey.pid := WPD_RESOURCE_DEFAULT_PID;
|
|
|
|
// Request stream
|
|
if Resources.GetStream( PWideChar( sObjectID ), PropKey, 0, iTransferSize, DevStream ) = S_OK then
|
|
begin
|
|
AddToLog( 'Stream: Valid' );
|
|
|
|
FileStream := TFileStream.Create( sDestFilename, fmCreate );
|
|
try
|
|
//read source stream using buffer
|
|
repeat
|
|
DevStream.RemoteRead( Buff[ 0 ], 1024, iReadBytes );
|
|
if iReadBytes > 0 then
|
|
FileStream.Write( Buff[ 0 ], iReadBytes );
|
|
until ( iReadBytes = 0 );
|
|
|
|
Result := True;
|
|
finally
|
|
FileStream.Free;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
finally
|
|
DevStream := nil;
|
|
PortableDev.Close;
|
|
end;
|
|
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.CopyStreamFromDevice
|
|
|
|
<FM>Declaration<FC>
|
|
function CopyStreamFromDevice(const sDeviceID, sObjectID: Widestring; var ssDestStream: TMemoryStream): Boolean;
|
|
|
|
<FM>Description<FN>
|
|
Copy a file of the specified <FC>sObjectID<FN> from a device to a stream.
|
|
|
|
<TABLE>
|
|
<R> <H>Parameter</H> <H>Description</H> </R>
|
|
<R> <C>sDeviceID</C> <C>The ID of the device to copy from (e.g. <A TIEPortableDevices.ActiveDeviceID></C> </R>
|
|
<R> <C>sFileID</C> <C>The ID of the file to copy (ID cannot point to a folder)</C> </R>
|
|
<R> <C>ssDestStream</C> <C>The stream that will be filled filename to copy the file to</C> </R>
|
|
</TABLE>
|
|
|
|
Note: Ensure sObjectID points to a file, not a folder. ssDestStream will be created if it is nil and its position is reset to zero after it is filled.
|
|
|
|
<FM>Example<FC>
|
|
// Display the selected image in an ImageEnView
|
|
Idx := IEPortableDevices.ObjectIDToIndex( lbxObjects.Items[ lbxObjects.ItemIndex ] );
|
|
aObject := IEPortableDevices.Objects[ Idx ];
|
|
if ( aObject.ObjectType <> iewFolder ) and IsKnownFormat( aObject.Filename ) the
|
|
begin
|
|
aMemStream := TMemoryStream.create;
|
|
try
|
|
if IEPortableDevices.CopyStreamFromDevice( SelectedDeviceID, aObject.ID, aMemStream ) then
|
|
ImageEnView1.IO.LoadFromStream(aMemStream);
|
|
finally
|
|
aMemStream.free;
|
|
end;
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.CopyStreamFromDevice(const sDeviceID, sObjectID: Widestring; var ssDestStream: TMemoryStream): Boolean;
|
|
var
|
|
PortableDev: IPortableDevice;
|
|
Content: IPortableDeviceContent;
|
|
Resources: IPortableDeviceResources;
|
|
iTransferSize, iReadBytes: Cardinal;
|
|
PropKey: _WPDtagpropertykey;
|
|
DevStream: IStream;
|
|
Buff: array[0..(1024-1)] of Byte;
|
|
begin
|
|
Result := False;
|
|
fLastError := '';
|
|
try
|
|
if ConnectToDevice( sDeviceID, PortableDev, fLastError, AddToLog ) = False then
|
|
exit;
|
|
|
|
try
|
|
// Read content of device
|
|
if PortableDev.Content( Content ) <> S_OK then
|
|
exit;
|
|
|
|
AddToLog( 'Content: Valid' );
|
|
if Content.Transfer( Resources ) = S_OK then
|
|
begin
|
|
iTransferSize := 0;
|
|
PropKey.fmtid := WPD_RESOURCE_DEFAULT_FMTID;
|
|
PropKey.pid := WPD_RESOURCE_DEFAULT_PID;
|
|
|
|
// Request stream
|
|
if Resources.GetStream( PWideChar( sObjectID ), PropKey, 0, iTransferSize, DevStream ) = S_OK then
|
|
begin
|
|
AddToLog( 'Stream: Valid' );
|
|
|
|
if ssDestStream = nil then
|
|
ssDestStream := TMemoryStream.Create;
|
|
|
|
//read source stream using buffer
|
|
repeat
|
|
DevStream.RemoteRead( Buff[ 0 ], 1024, iReadBytes );
|
|
if iReadBytes > 0 then
|
|
ssDestStream.Write( Buff[ 0 ], iReadBytes );
|
|
until ( iReadBytes = 0 );
|
|
|
|
ssDestStream.Position := 0;
|
|
Result := True;
|
|
end;
|
|
end;
|
|
|
|
finally
|
|
DevStream := nil;
|
|
PortableDev.Close;
|
|
end;
|
|
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.Cancel
|
|
|
|
<FM>Declaration<FC>
|
|
function Cancel(): Boolean;
|
|
|
|
<FM>Description<FN>
|
|
Abort any active processing on the current device.
|
|
|
|
<FM>Example<FC>
|
|
procedure TfrmMain.btnCancel(Sender: TObject);
|
|
begin
|
|
IEPortableDevices.Cancel();
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.Cancel(): Boolean;
|
|
var
|
|
PortableDev: IPortableDevice;
|
|
begin
|
|
Result := False;
|
|
if fActiveDeviceID = '' then
|
|
exit;
|
|
try
|
|
if ConnectToDevice( fActiveDeviceID, PortableDev, fLastError, AddToLog ) then
|
|
try
|
|
Result := PortableDev.Cancel() = S_OK;
|
|
finally
|
|
PortableDev.Close;
|
|
end;
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.CopyFileToDevice
|
|
|
|
<FM>Declaration<FC>
|
|
function CopyFileToDevice(const sDeviceID, sFolderID, sSourceFilename: WideString): Boolean;
|
|
|
|
<FM>Description<FN>
|
|
Copy a local file to a the folder of the specified <FC>sFolderID<FN> on a device.
|
|
|
|
<TABLE>
|
|
<R> <H>Parameter</H> <H>Description</H> </R>
|
|
<R> <C>sDeviceID</C> <C>The ID of the device to copy to (e.g. <A TIEPortableDevices.ActiveDeviceID></C> </R>
|
|
<R> <C>sFolderID</C> <C>The ID of the folder to copy to (ID cannot point to a file)</C> </R>
|
|
<R> <C>sSourceFilename</C> <C>The local filename to copy to the device</C> </R>
|
|
</TABLE>
|
|
|
|
Note: Only files can be copied, not folders.
|
|
|
|
<FM>Example<FC>
|
|
// Prompt the user to specify a file to copy to the current folder
|
|
procedure TfrmMain.btnCopyToDeviceClick(Sender: TObject);
|
|
begin
|
|
// No active folder (or root)
|
|
if IEPortableDevices.ActiveFolderID = '' then
|
|
exit;
|
|
|
|
// Prompt for a file to copy
|
|
if OpenDialog1.Execute = False then
|
|
exit;
|
|
|
|
// Copy to folder on device
|
|
if IEPortableDevices.CopyFileToDevice( IEPortableDevices.ActiveDeviceID, IEPortableDevices.ActiveFolderID, OpenDialog1.FileName) then
|
|
ShowMessage( 'File successfully copied to device' )
|
|
else
|
|
ShowMessage( 'Failed to copy file to device!' );
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.CopyFileToDevice(const sDeviceID, sFolderID, sSourceFilename: WideString): Boolean;
|
|
var
|
|
PortableDev: IPortableDevice;
|
|
Content: IPortableDeviceContent;
|
|
iTransferSize, iReadBytes, iWritten: Cardinal;
|
|
DevStream: IStream;
|
|
PropValues: IPortableDeviceValues;
|
|
FileStream: TFileStream;
|
|
Buff: array[0..(1024-1)] of Byte;
|
|
pCookie: PWideChar;
|
|
iResult: Integer;
|
|
PropKey: _WPDtagpropertykey;
|
|
sFilename : WideString;
|
|
begin
|
|
Result := False;
|
|
fLastError := '';
|
|
try
|
|
if ConnectToDevice( sDeviceID, PortableDev, fLastError, AddToLog ) = False then
|
|
exit;
|
|
|
|
try
|
|
// Read content of device
|
|
if PortableDev.Content( Content ) <> S_OK then
|
|
exit;
|
|
|
|
// Required properties of content
|
|
PropValues := CreateComObject( CLASS_PortableDeviceValues ) as IPortableDeviceValues;
|
|
if VarIsClear( PropValues ) then
|
|
Exit;
|
|
|
|
AddToLog( 'Copying ' + sSourceFilename + ' to folder: '+sFolderID );
|
|
|
|
FileStream := TFileStream.Create( sSourceFilename, fmOpenRead );
|
|
try
|
|
sFilename := ExtractFileName( sSourceFilename );
|
|
|
|
// Parent ID
|
|
PropKey.fmtid := WPD_OBJECT_PARENT_ID_FMTID;
|
|
PropKey.pid := WPD_OBJECT_PARENT_ID_PID;
|
|
PropValues.SetStringValue( PropKey, PWideChar( sFolderID ));
|
|
|
|
// Object name
|
|
PropKey.fmtid := WPD_OBJECT_NAME_FMTID;
|
|
PropKey.pid := WPD_OBJECT_NAME_PID;
|
|
PropValues.SetStringValue( PropKey, PWideChar( sFilename ));
|
|
|
|
// Filename
|
|
PropKey.fmtid := WPD_OBJECT_ORIGINAL_FILE_NAME_FMTID;
|
|
PropKey.pid := WPD_OBJECT_ORIGINAL_FILE_NAME_PID;
|
|
PropValues.SetStringValue( PropKey, PWideChar( sFilename ));
|
|
|
|
// Stream size
|
|
PropKey.fmtid := WPD_OBJECT_SIZE_FMTID;
|
|
PropKey.pid := WPD_OBJECT_SIZE_PID;
|
|
PropValues.SetUnsignedLargeIntegerValue( PropKey, FileStream.Size );
|
|
|
|
// Create device stream
|
|
iTransferSize := 0;
|
|
Content.CreateObjectWithPropertiesAndData( PropValues, DevStream, iTransferSize, pCookie );
|
|
if VarIsClear( DevStream ) then
|
|
Exit;
|
|
AddToLog( 'Stream: Valid' );
|
|
|
|
// Read source stream using buffer. Transfer to device stream
|
|
repeat
|
|
iReadBytes := FileStream.Read( Buff[ 0 ], 1024 );
|
|
AddToLog( 'Bytes read: ' + IntToStr( iReadBytes ));
|
|
if iReadBytes > 0 then
|
|
begin
|
|
iResult := DevStream.RemoteWrite( Buff[ 0 ], iReadBytes, iWritten );
|
|
if iResult <> S_OK then
|
|
AddToLog( 'Write failure: ' + IntToStr( iResult ));
|
|
end;
|
|
until ( iReadBytes = 0 );
|
|
|
|
// Commit stream
|
|
Result := DevStream.Commit( 0 ) = S_OK;
|
|
if Result then
|
|
AddToLog( 'File copied' )
|
|
else
|
|
AddToLog( 'Commit failure!' );
|
|
finally
|
|
FileStream.Free;
|
|
end;
|
|
|
|
finally
|
|
DevStream := nil;
|
|
PortableDev.Close;
|
|
end;
|
|
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.DeleteFromDevice
|
|
|
|
<FM>Declaration<FC>
|
|
function DeleteFromDevice(const sDeviceID, sObjectID : WideString; bDeleteSubObjects: Boolean = True): Integer; overload;
|
|
function DeleteFromDevice(const sDeviceID, sObjectID : WideString; bDeleteSubObjects: Boolean; var sResultText: WideString): Integer; overload;
|
|
function DeleteFromDevice(const sDeviceID : WideString; ssObjectIDs : TStrings; bDeleteSubObjects: Boolean = True): Integer; overload;
|
|
function DeleteFromDevice(const sDeviceID : WideString; ssObjectIDs : TStrings; bDeleteSubObjects: Boolean; var sResultText: WideString): Integer; overload;
|
|
|
|
<FM>Description<FN>
|
|
Delete files or folders from a device.
|
|
|
|
<TABLE>
|
|
<R> <H>Parameter</H> <H>Description</H> </R>
|
|
<R> <C>sDeviceID</C> <C>The ID of the device to delete from (e.g. <A TIEPortableDevices.ActiveDeviceID></C> </R>
|
|
<R> <C>sObjectID or ssObjectIDs</C> <C>The ID(s) of the file(s) or folder(s) to delete (e.g. <A TIEPortableDevices.ActiveFolderID></C> </R>
|
|
<R> <C>bDeleteSubObjects</C> <C>If <FC>sObjectID<FN> is a folder, then enabling <FC>bDeleteSubObjects<FN> will also delete all objects in sub-folders</C> </R>
|
|
<R> <C>sResultText</C> <C>Is filled with a response from the WPD API regarding the success or failure of the action (e.g. "1 file was successfully deleted)</C> </R>
|
|
</TABLE>
|
|
|
|
Result is a count of the files deleted, or -1 if an error was encountered.
|
|
|
|
<FM>Examples<FC>
|
|
// Delete the current folder and all sub-folders
|
|
IEPortableDevices.DeleteFromDevice( IEPortableDevices.ActiveDeviceID, IEPortableDevices.ActiveFolderID, True );
|
|
|
|
// Delete the selected file or folder
|
|
procedure TfrmMain.btnDeleteFromDeviceClick(Sender: TObject);
|
|
var
|
|
sResultText: WideString;
|
|
Idx: Integer;
|
|
aObject: TIEWPDObject;
|
|
begin
|
|
if lbxObjects.ItemIndex < 0 then
|
|
exit;
|
|
|
|
Idx := fPortableDevices.ObjectIDToIndex( lbxObjects.Items[ lbxObjects.ItemIndex ] );
|
|
aObject := fPortableDevices.Objects[ Idx ];
|
|
|
|
if MessageDlg( 'Are you sure you want to delete the file: ' + aObject.Filename, mtConfirmation, [ mbYes, mbNo ], 0 ) = mrYes then
|
|
begin
|
|
ShowTempHourglass;
|
|
// Note: bDeleteSubObjects is true, so if a folder is selected it will also delete any files in it
|
|
if IEPortableDevices.DeleteFromDevice( IEPortableDevices.ActiveDeviceID, aObject.ID, True, sResultText ) > -1 then
|
|
lbxObjects.Items.Delete( lbxObjects.ItemIndex );
|
|
ShowMessage( sResultText );
|
|
end;
|
|
end;
|
|
|
|
// Delete all displayed files
|
|
procedure TfrmMain.btnDeleteAllClick(Sender: TObject);
|
|
var
|
|
sResultText: WideString;
|
|
iCount: Integer;
|
|
begin
|
|
if lbxObjects.Items.Count = 0 then
|
|
exit;
|
|
|
|
if MessageDlg( format( 'Are you sure you want to delete the %d files in this folder?', [ lbxObjects.Items.Count ] ),
|
|
mtConfirmation, [ mbYes, mbNo ], 0 ) = mrYes then
|
|
begin
|
|
ShowTempHourglass;
|
|
iCount := IEPortableDevices.DeleteFromDevice( IEPortableDevices.ActiveDeviceID, lbxObjects.Items, True, sResultText );
|
|
if iCount = -1 then
|
|
ShowMessage( sResultText )
|
|
else
|
|
begin
|
|
lbxObjects.Items.Clear;
|
|
ShowMessage( format( '%d files were successfully deleted', [ iCount ] ));
|
|
end;
|
|
end;
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.DeleteFromDevice(const sDeviceID : WideString; ssObjectIDs : TStrings; bDeleteSubObjects: Boolean; var sResultText: WideString): Integer;
|
|
begin
|
|
Result := _DeleteFromDevice( sDeviceID, '', ssObjectIDs, bDeleteSubObjects, sResultText, fLastError, AddToLog );
|
|
end;
|
|
|
|
function TIEPortableDevices.DeleteFromDevice(const sDeviceID : WideString; ssObjectIDs : TStrings; bDeleteSubObjects: Boolean = True): Integer;
|
|
var
|
|
sResultText: WideString;
|
|
begin
|
|
Result := _DeleteFromDevice( sDeviceID, '', ssObjectIDs, bDeleteSubObjects, sResultText, fLastError, AddToLog );
|
|
end;
|
|
|
|
function TIEPortableDevices.DeleteFromDevice(const sDeviceID, sObjectID : WideString; bDeleteSubObjects: Boolean = True): Integer;
|
|
var
|
|
sResultText: WideString;
|
|
begin
|
|
Result := _DeleteFromDevice( sDeviceID, sObjectID, nil, bDeleteSubObjects, sResultText, fLastError, AddToLog );
|
|
end;
|
|
|
|
function TIEPortableDevices.DeleteFromDevice(const sDeviceID, sObjectID : WideString; bDeleteSubObjects: Boolean; var sResultText: WideString): Integer;
|
|
begin
|
|
Result := _DeleteFromDevice( sDeviceID, sObjectID, nil, bDeleteSubObjects, sResultText, fLastError, AddToLog );
|
|
end;
|
|
|
|
|
|
// Convert a GUID value to TWPDObjectFormat
|
|
function StrToObjectFormat(const sFormatID: WideString): TWPDObjectFormat;
|
|
var
|
|
g: TGuid;
|
|
begin
|
|
Result := _WPD_OBJECT_FORMAT_UNKNOWN;
|
|
if sFormatID = '' then
|
|
Exit;
|
|
|
|
try
|
|
g := StringToGUID( sFormatID );
|
|
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_3GP, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_3GP
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_AAC, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_AAC
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_ABSTRACT_CONTACT, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_ABSTRACT_CONTACT
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_ABSTRACT_CONTACT_GROUP, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_ABSTRACT_CONTACT_GROUP
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_ABSTRACT_MEDIA_CAST, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_ABSTRACT_MEDIA_CAST
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_AIFF, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_AIFF
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_ALL, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_ALL
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_ASF, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_ASF
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_ASXPLAYLIST, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_ASXPLAYLIST
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_AUDIBLE, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_AUDIBLE
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_AVI, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_AVI
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_BMP, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_BMP
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_CIFF, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_CIFF
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_DPOF, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_DPOF
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_EXECUTABLE, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_EXECUTABLE
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_EXIF, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_EXIF
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_FLAC, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_FLAC
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_FLASHPIX, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_FLASHPIX
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_GIF, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_GIF
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_HTML, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_HTML
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_ICALENDAR, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_ICALENDAR
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_ICON, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_ICON
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_JFIF, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_JFIF
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_JP2, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_JP2
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_JPX, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_JPX
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_M3UPLAYLIST, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_M3UPLAYLIST
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_M4A, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_M4A
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_MHT_COMPILED_HTML, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_MHT_COMPILED_HTML
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_MICROSOFT_EXCEL, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_MICROSOFT_EXCEL
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_MICROSOFT_POWERPOINT, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_MICROSOFT_POWERPOINT
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_MICROSOFT_WFC, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_MICROSOFT_WFC
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_MICROSOFT_WORD, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_MICROSOFT_WORD
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_MP2, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_MP2
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_MP3, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_MP3
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_MP4, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_MP4
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_MPEG, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_MPEG
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_MPLPLAYLIST, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_MPLPLAYLIST
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_OGG, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_OGG
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_PCD, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_PCD
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_PICT, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_PICT
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_PLSPLAYLIST, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_PLSPLAYLIST
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_PNG, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_PNG
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_PROPERTIES_ONLY, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_PROPERTIES_ONLY
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_SCRIPT, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_SCRIPT
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_TEXT, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_TEXT
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_TIFF, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_TIFF
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_TIFFEP, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_TIFFEP
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_TIFFIT, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_TIFFIT
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_UNSPECIFIED, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_UNSPECIFIED
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_VCALENDAR1, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_VCALENDAR1
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_VCARD2, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_VCARD2
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_VCARD3, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_VCARD3
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_WAVE, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_WAVE
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_WINDOWSIMAGEFORMAT, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_WINDOWSIMAGEFORMAT
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_WMA, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_WMA
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_WMV, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_WMV
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_WPLPLAYLIST, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_WPLPLAYLIST
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_X509V3CERTIFICATE, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_X509V3CERTIFICATE
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_XML, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_XML
|
|
else
|
|
if IsEqualGUID( WPD_OBJECT_FORMAT_WMV, g ) then
|
|
Result := _WPD_OBJECT_FORMAT_WMV
|
|
except
|
|
// ERROR
|
|
end;
|
|
end;
|
|
|
|
|
|
// Convert a GUID value to TWPDContentType
|
|
function StrToContentType(const sContentID : WideString): TWPDContentType;
|
|
var
|
|
g: TGuid;
|
|
begin
|
|
Result := _WPD_CONTENT_TYPE_UNKNOWN;
|
|
if sContentID = '' then
|
|
Exit;
|
|
|
|
try
|
|
g := StringToGUID( sContentID );
|
|
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_ALL, g ) then
|
|
Result := _WPD_CONTENT_TYPE_ALL
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_APPOINTMENT, g ) then
|
|
Result := _WPD_CONTENT_TYPE_APPOINTMENT
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_AUDIO, g ) then
|
|
Result := _WPD_CONTENT_TYPE_AUDIO
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_AUDIO_ALBUM, g ) then
|
|
Result := _WPD_CONTENT_TYPE_AUDIO_ALBUM
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_CALENDAR, g ) then
|
|
Result := _WPD_CONTENT_TYPE_CALENDAR
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_CERTIFICATE, g ) then
|
|
Result := _WPD_CONTENT_TYPE_CERTIFICATE
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_CONTACT, g ) then
|
|
Result := _WPD_CONTENT_TYPE_CONTACT
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_CONTACT_GROUP, g ) then
|
|
Result := _WPD_CONTENT_TYPE_CONTACT_GROUP
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_DOCUMENT, g ) then
|
|
Result := _WPD_CONTENT_TYPE_DOCUMENT
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_EMAIL, g ) then
|
|
Result := _WPD_CONTENT_TYPE_EMAIL
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT, g ) then
|
|
Result := _WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_GENERIC_FILE, g ) then
|
|
Result := _WPD_CONTENT_TYPE_GENERIC_FILE
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_GENERIC_MESSAGE, g ) then
|
|
Result := _WPD_CONTENT_TYPE_GENERIC_MESSAGE
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_IMAGE, g ) then
|
|
Result := _WPD_CONTENT_TYPE_IMAGE
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_IMAGE_ALBUM, g ) then
|
|
Result := _WPD_CONTENT_TYPE_IMAGE_ALBUM
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_MEDIA_CAST, g ) then
|
|
Result := _WPD_CONTENT_TYPE_MEDIA_CAST
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_MEMO, g ) then
|
|
Result := _WPD_CONTENT_TYPE_MEMO
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_MIXED_CONTENT_ALBUM, g ) then
|
|
Result := _WPD_CONTENT_TYPE_MIXED_CONTENT_ALBUM
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_NETWORK_ASSOCIATION, g ) then
|
|
Result := _WPD_CONTENT_TYPE_NETWORK_ASSOCIATION
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_PLAYLIST, g ) then
|
|
Result := _WPD_CONTENT_TYPE_PLAYLIST
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_PROGRAM, g ) then
|
|
Result := _WPD_CONTENT_TYPE_PROGRAM
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_SECTION, g ) then
|
|
Result := _WPD_CONTENT_TYPE_SECTION
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_TASK, g ) then
|
|
Result := _WPD_CONTENT_TYPE_TASK
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_TELEVISION, g ) then
|
|
Result := _WPD_CONTENT_TYPE_TELEVISION
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_UNSPECIFIED, g ) then
|
|
Result := _WPD_CONTENT_TYPE_UNSPECIFIED
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_VIDEO, g ) then
|
|
Result := _WPD_CONTENT_TYPE_VIDEO
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_VIDEO_ALBUM, g ) then
|
|
Result := _WPD_CONTENT_TYPE_VIDEO_ALBUM
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_WIRELESS_PROFILE, g ) then
|
|
Result := _WPD_CONTENT_TYPE_WIRELESS_PROFILE
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_FOLDER, g ) then
|
|
Result := _WPD_CONTENT_TYPE_FOLDER;
|
|
except
|
|
// ERROR
|
|
end;
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.GetObjectAdvancedProps
|
|
|
|
<FM>Declaration<FC>
|
|
function GetObjectAdvancedProps(const sDeviceID, sObjectID: WideString; out DestProps : <A TIEWPDObjectAdvancedProps>): Boolean; overload;
|
|
function GetObjectAdvancedProps(const sObjectID: WideString; out DestProps : <A TIEWPDObjectAdvancedProps>): Boolean; overload;
|
|
function GetObjectAdvancedProps(Index: Integer; out DestProps : <A TIEWPDObjectAdvancedProps>): Boolean; overload;
|
|
|
|
<FM>Description<FN>
|
|
Returns more detail about an object on the device, such as its size, date, etc. You can specify either the ID of an object on the <L TIEPortableDevices.ActiveDeviceID>active device</L> or its index in the <A TIEPortableDevices.Objects> list.
|
|
|
|
Result is false if retrieval of details failed.
|
|
|
|
<FM>Example<FC>
|
|
procedure TfrmMain.btnShowObjectPropsClick(Sender: TObject);
|
|
var
|
|
aProps: TIEWPDObjectAdvancedProps;
|
|
begin
|
|
if IEPortableDevices.GetObjectAdvancedProps( SelectedObjectID, aProps ) = False then
|
|
raise Exception.create( 'Cannot access object properties' );
|
|
|
|
memInfo.Clear;;
|
|
memInfo.Lines.Add( 'WPD_OBJECT_ID: ' + aProps.ObjectID );
|
|
memInfo.Lines.Add( 'WPD_OBJECT_PARENT_ID: ' + aProps.ParentID );
|
|
memInfo.Lines.Add( 'WPD_OBJECT_NAME: ' + aProps.ObjectName );
|
|
memInfo.Lines.Add( 'WPD_OBJECT_PERSISTENT_UNIQUE_ID: ' + aProps.PersistentUniqueID );
|
|
memInfo.Lines.Add( 'WPD_OBJECT_FORMAT: '+ IntToStr( ord( aProps.ObjectFormat )));
|
|
memInfo.Lines.Add( 'WPD_OBJECT_CONTENT_TYPE: '+ IntToStr( ord( aProps.ContentType )));
|
|
memInfo.Lines.Add( 'WPD_OBJECT_ISHIDDEN: ' + BoolToStr( aProps.IsHidden ));
|
|
memInfo.Lines.Add( 'WPD_OBJECT_ISSYSTEM: ' + BoolToStr( aProps.IsSystem ));
|
|
memInfo.Lines.Add( 'WPD_OBJECT_DATE_CREATED: ' + DateTimeToStr( aProps.DateCreated ));
|
|
memInfo.Lines.Add( 'WPD_OBJECT_DATE_MODIFIED: ' + DateTimeToStr( aProps.DateModified ));
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.GetObjectAdvancedProps(const sDeviceID, sObjectID: WideString; out DestProps : TIEWPDObjectAdvancedProps): Boolean;
|
|
var
|
|
PropKeys: IPortableDeviceKeyCollection;
|
|
PropValues: IPortableDeviceValues;
|
|
|
|
procedure _AddProperty(fmtid: TGUID; pid: LongWord);
|
|
var
|
|
PropKey: _WPDtagpropertykey;
|
|
begin
|
|
PropKey.fmtid := fmtid;
|
|
PropKey.pid := pid;
|
|
propKeys.Add( PropKey );
|
|
end;
|
|
|
|
function _GetStringValue(fmtid: TGUID; pid: LongWord) : PWideChar;
|
|
var
|
|
PropKey: _WPDtagpropertykey;
|
|
begin
|
|
PropKey.fmtid := fmtid;
|
|
PropKey.pid := pid;
|
|
PropValues.GetStringValue( PropKey, Result );
|
|
end;
|
|
|
|
function _GetBoolValue(fmtid: TGUID; pid: LongWord) : Boolean;
|
|
var
|
|
PropKey: _WPDtagpropertykey;
|
|
iBool: Integer;
|
|
begin
|
|
PropKey.fmtid := fmtid;
|
|
PropKey.pid := pid;
|
|
PropValues.GetBoolValue( PropKey, iBool );
|
|
Result := iBool > 0;
|
|
end;
|
|
|
|
function _GetDateTimeValue(fmtid: TGUID; pid: LongWord) : TDateTime;
|
|
var
|
|
PropKey: _WPDtagpropertykey;
|
|
aValue: tag_inner_PROPVARIANT;
|
|
begin
|
|
PropKey.fmtid := fmtid;
|
|
PropKey.pid := pid;
|
|
PropValues.GetValue( PropKey, aValue );
|
|
Result := aValue.AsVariant.date;
|
|
end;
|
|
|
|
function _GetUnsignedLargeIntegerValue(fmtid: TGUID; pid: LongWord) : Largeuint;
|
|
var
|
|
PropKey: _WPDtagpropertykey;
|
|
pValue: Largeuint;
|
|
begin
|
|
PropKey.fmtid := fmtid;
|
|
PropKey.pid := pid;
|
|
PropValues.GetUnsignedLargeIntegerValue( PropKey, pValue );
|
|
Result := pValue;
|
|
end;
|
|
|
|
var
|
|
PortableDev: IPortableDevice;
|
|
Content: IPortableDeviceContent;
|
|
Prop: IPortableDeviceProperties;
|
|
begin
|
|
Result := False;
|
|
if sDeviceID = '' then
|
|
exit;
|
|
|
|
try
|
|
if ConnectToDevice( sDeviceID, PortableDev, fLastError, AddToLog ) = False then
|
|
exit;
|
|
|
|
try
|
|
// Read content of device
|
|
if ( PortableDev.Content( Content ) <> S_OK ) or
|
|
VarIsClear( Content ) then
|
|
exit;
|
|
|
|
Content.Properties( Prop );
|
|
if VarIsClear( prop ) then
|
|
exit;
|
|
|
|
PropKeys := CreateComObject( CLSID_PortableDeviceKeyCollection ) as IPortableDeviceKeyCollection;
|
|
if VarIsClear( PropKeys ) then
|
|
Exit;
|
|
|
|
// Add each property we are interested in
|
|
_AddProperty( WPD_OBJECT_PARENT_ID_FMTID, WPD_OBJECT_PARENT_ID_PID );
|
|
_AddProperty( WPD_OBJECT_NAME_FMTID, WPD_OBJECT_NAME_PID );
|
|
_AddProperty( WPD_OBJECT_ORIGINAL_FILE_NAME_FMTID, WPD_OBJECT_ORIGINAL_FILE_NAME_PID );
|
|
_AddProperty( WPD_OBJECT_PERSISTENT_UNIQUE_ID_FMTID, WPD_OBJECT_PERSISTENT_UNIQUE_ID_PID );
|
|
_AddProperty( WPD_OBJECT_FORMAT_FMTID, WPD_OBJECT_FORMAT_PID );
|
|
_AddProperty( WPD_OBJECT_CONTENT_TYPE_FMTID, WPD_OBJECT_CONTENT_TYPE_PID );
|
|
_AddProperty( WPD_OBJECT_ISHIDDEN_FMTID, WPD_OBJECT_ISHIDDEN_PID );
|
|
_AddProperty( WPD_OBJECT_ISSYSTEM_FMTID, WPD_OBJECT_ISSYSTEM_PID );
|
|
_AddProperty( WPD_OBJECT_DATE_CREATED_FMTID, WPD_OBJECT_DATE_CREATED_PID );
|
|
_AddProperty( WPD_OBJECT_DATE_MODIFIED_FMTID, WPD_OBJECT_DATE_MODIFIED_PID );
|
|
_AddProperty( WPD_OBJECT_SIZE_FMTID, WPD_OBJECT_SIZE_PID );
|
|
|
|
prop.GetValues( PWideChar( sObjectID ), propKeys, PropValues );
|
|
if VarIsClear( PropValues ) then
|
|
exit;
|
|
|
|
DestProps.ObjectID := sObjectID;
|
|
DestProps.ParentID := _GetStringValue( WPD_OBJECT_PARENT_ID_FMTID, WPD_OBJECT_PARENT_ID_PID );
|
|
DestProps.FriendlyName := _GetStringValue( WPD_OBJECT_NAME_FMTID, WPD_OBJECT_NAME_PID );
|
|
DestProps.Filename := _GetStringValue( WPD_OBJECT_ORIGINAL_FILE_NAME_FMTID, WPD_OBJECT_ORIGINAL_FILE_NAME_PID );
|
|
DestProps.PersistentUniqueID := _GetStringValue( WPD_OBJECT_PERSISTENT_UNIQUE_ID_FMTID, WPD_OBJECT_PERSISTENT_UNIQUE_ID_PID );
|
|
DestProps.ObjectFormat := StrToObjectFormat( _GetStringValue( WPD_OBJECT_FORMAT_FMTID, WPD_OBJECT_FORMAT_PID ));
|
|
DestProps.ContentType := StrToContentType( _GetStringValue( WPD_OBJECT_CONTENT_TYPE_FMTID, WPD_OBJECT_CONTENT_TYPE_PID ));
|
|
DestProps.IsHidden := _GetBoolValue( WPD_OBJECT_ISHIDDEN_FMTID, WPD_OBJECT_ISHIDDEN_PID );
|
|
DestProps.IsSystem := _GetBoolValue( WPD_OBJECT_ISSYSTEM_FMTID, WPD_OBJECT_ISSYSTEM_PID );
|
|
DestProps.DateCreated := _GetDateTimeValue( WPD_OBJECT_DATE_CREATED_FMTID, WPD_OBJECT_DATE_CREATED_PID );
|
|
DestProps.DateModified := _GetDateTimeValue( WPD_OBJECT_DATE_MODIFIED_FMTID, WPD_OBJECT_DATE_MODIFIED_PID );
|
|
DestProps.SizeBytes := _GetUnsignedLargeIntegerValue( WPD_OBJECT_DATE_MODIFIED_FMTID, WPD_OBJECT_DATE_MODIFIED_PID );
|
|
|
|
result := True;
|
|
finally
|
|
PortableDev.Close;
|
|
end;
|
|
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
function TIEPortableDevices.GetObjectAdvancedProps(const sObjectID: WideString; out DestProps : TIEWPDObjectAdvancedProps): Boolean;
|
|
begin
|
|
Result := GetObjectAdvancedProps( fActiveDeviceID, sObjectID, DestProps );
|
|
end;
|
|
|
|
function TIEPortableDevices.GetObjectAdvancedProps(Index: Integer; out DestProps: TIEWPDObjectAdvancedProps): Boolean;
|
|
begin
|
|
CheckObjectsInitialized;
|
|
Result := GetObjectAdvancedProps( fActiveDeviceID, Objects[ Index ].ID, DestProps );
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.LookupObjectFriendlyName
|
|
|
|
<FM>Declaration<FC>
|
|
function LookupObjectFriendlyName(const sObjectID : WideString): WideString; overload;
|
|
function LookupObjectFriendlyName(const sDeviceID, sObjectID : WideString): WideString; overload;
|
|
|
|
<FM>Description<FN>
|
|
Returns the friendly name for a file or folder on a device.
|
|
|
|
Same as <L TIEWPDObject>TIEWPDObject.FriendlyName</L>. If <FC>sDeviceID<FN> is not specified it assumes the <L TIEPortableDevices.ActiveDeviceID>active device</L>.
|
|
|
|
<FM>Example<FC>
|
|
// Display the current folder name
|
|
edtCurrentFolder.Text := IEPortableDevices.LookupObjectFriendlyName( IEPortableDevices.ActiveDeviceID, IEPortableDevices.ActiveFolderID );
|
|
!!}
|
|
function TIEPortableDevices.LookupObjectFriendlyName(const sDeviceID, sObjectID : WideString): WideString;
|
|
var
|
|
PropKeys: IPortableDeviceKeyCollection;
|
|
PropValues: IPortableDeviceValues;
|
|
PropKey: _WPDtagpropertykey;
|
|
PortableDev: IPortableDevice;
|
|
Content: IPortableDeviceContent;
|
|
Prop: IPortableDeviceProperties;
|
|
pValue: PWideChar;
|
|
begin
|
|
Result := '';
|
|
if sDeviceID <> '' then
|
|
fActiveDeviceID := sDeviceID;
|
|
if fActiveDeviceID = '' then
|
|
exit;
|
|
|
|
try
|
|
if ConnectToDevice( fActiveDeviceID, PortableDev, fLastError, AddToLog ) = False then
|
|
exit;
|
|
|
|
try
|
|
// Read content of device
|
|
if ( PortableDev.Content( Content ) <> S_OK ) or
|
|
VarIsClear( Content ) then
|
|
exit;
|
|
|
|
Content.Properties( Prop );
|
|
if VarIsClear( prop ) then
|
|
exit;
|
|
|
|
PropKeys := CreateComObject( CLSID_PortableDeviceKeyCollection ) as IPortableDeviceKeyCollection;
|
|
if VarIsClear( PropKeys ) then
|
|
Exit;
|
|
|
|
PropKey.fmtid := WPD_OBJECT_NAME_FMTID;
|
|
PropKey.pid := WPD_OBJECT_NAME_PID;
|
|
propKeys.Add( PropKey );
|
|
|
|
prop.GetValues( PWideChar( sObjectID ), propKeys, PropValues );
|
|
if VarIsClear( PropValues ) = False then
|
|
begin
|
|
PropKey.fmtid := WPD_OBJECT_NAME_FMTID;
|
|
PropKey.pid := WPD_OBJECT_NAME_PID;
|
|
PropValues.GetStringValue( PropKey, pValue );
|
|
Result := pValue;
|
|
end;
|
|
finally
|
|
PortableDev.Close;
|
|
end;
|
|
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
|
|
function TIEPortableDevices.LookupObjectFriendlyName(const sObjectID : WideString): WideString;
|
|
begin
|
|
Result := LookupObjectFriendlyName( '', sObjectID );
|
|
end;
|
|
|
|
|
|
{!!
|
|
<FS>TIEPortableDevices.LookupDeviceFriendlyName
|
|
|
|
<FM>Declaration<FC>
|
|
function LookupDeviceFriendlyName(const sDeviceID : WideString): WideString;
|
|
|
|
<FM>Description<FN>
|
|
Returns the friendly name for a device.
|
|
|
|
The same result could be achieved using:
|
|
|
|
<FC>sFriendlyName := Devices[ DeviceIDToIndex( sDeviceID ) ].FriendlyName;<FN>
|
|
|
|
<FM>Example<FC>
|
|
// Custom drawing of a listbox that contains Device IDs
|
|
procedure TfrmMain.lbxDevicesDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
|
|
var
|
|
sDeviceID: WideString;
|
|
begin
|
|
sDeviceID := lbxDevices.Items[ Index ];
|
|
IEDrawComboListBoxItem(TListBox(Control ), Rect, fPortableDevices.LookUpDeviceFriendlyName( sDeviceID ), imlGlyphs, IMG_DEVICE );
|
|
end;
|
|
!!}
|
|
function TIEPortableDevices.LookupDeviceFriendlyName(const sDeviceID : WideString): WideString;
|
|
var
|
|
Idx: Integer;
|
|
begin
|
|
Result := '';
|
|
Idx := DeviceIDToIndex( sDeviceID );
|
|
if Idx >= 0 then
|
|
Result := Devices[ Idx ].FriendlyName;
|
|
end;
|
|
|
|
|
|
{$IFDEF DEBUG}
|
|
// Converts a GUID to a description
|
|
function FunctionalCategoryToStr(const sCategoryID: WideString): WideString;
|
|
var
|
|
g: TGuid;
|
|
begin
|
|
Result := sCategoryID;
|
|
if sCategoryID = '' then
|
|
Exit;
|
|
|
|
try
|
|
g := StringToGUID( sCategoryID );
|
|
|
|
if IsEqualGUID( WPD_FUNCTIONAL_CATEGORY_ALL, g ) then
|
|
Result := 'WPD_FUNCTIONAL_CATEGORY_ALL'
|
|
else
|
|
if IsEqualGUID( WPD_FUNCTIONAL_CATEGORY_AUDIO_CAPTURE, g ) then
|
|
Result := 'WPD_FUNCTIONAL_CATEGORY_AUDIO_CAPTURE'
|
|
else
|
|
if IsEqualGUID( WPD_FUNCTIONAL_CATEGORY_DEVICE, g ) then
|
|
Result := 'WPD_FUNCTIONAL_CATEGORY_DEVICE'
|
|
else
|
|
if IsEqualGUID( WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, g ) then
|
|
Result := 'WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION'
|
|
else
|
|
if IsEqualGUID( WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, g ) then
|
|
Result := 'WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION'
|
|
else
|
|
if IsEqualGUID( WPD_FUNCTIONAL_CATEGORY_SMS, g ) then
|
|
Result := 'WPD_FUNCTIONAL_CATEGORY_SMS'
|
|
else
|
|
if IsEqualGUID( WPD_FUNCTIONAL_CATEGORY_STILL_IMAGE_CAPTURE, g ) then
|
|
Result := 'WPD_FUNCTIONAL_CATEGORY_STILL_IMAGE_CAPTURE'
|
|
else
|
|
if IsEqualGUID( WPD_FUNCTIONAL_CATEGORY_STORAGE, g ) then
|
|
Result := 'WPD_FUNCTIONAL_CATEGORY_STORAGE'
|
|
else
|
|
if IsEqualGUID( WPD_FUNCTIONAL_CATEGORY_VIDEO_CAPTURE, g ) then
|
|
Result := 'WPD_FUNCTIONAL_CATEGORY_VIDEO_CAPTURE';
|
|
except
|
|
// ERROR
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
{$IFDEF DEBUG}
|
|
// Converts a GUID to a description
|
|
function SupportedCommandToStr(g: TGuid): WideString;
|
|
begin
|
|
Result := GUIDToString( g );
|
|
|
|
try
|
|
if IsEqualGUID( WPD_CATEGORY_COMMON, g ) then
|
|
Result := 'WPD_CATEGORY_COMMON'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_CAPABILITIES, g ) then
|
|
Result := 'WPD_CATEGORY_CAPABILITIES'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_DEVICE_HINTS, g ) then
|
|
Result := 'WPD_CATEGORY_DEVICE_HINTS'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_MEDIA_CAPTURE, g ) then
|
|
Result := 'WPD_CATEGORY_MEDIA_CAPTURE'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_NETWORK_CONFIGURATION, g ) then
|
|
Result := 'WPD_CATEGORY_NETWORK_CONFIGURATION'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_NULL, g ) then
|
|
Result := 'WPD_CATEGORY_NULL'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_OBJECT_ENUMERATION, g ) then
|
|
Result := 'WPD_CATEGORY_OBJECT_ENUMERATION'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_OBJECT_MANAGEMENT, g ) then
|
|
Result := 'WPD_CATEGORY_OBJECT_MANAGEMENT'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_OBJECT_PROPERTIES, g ) then
|
|
Result := 'WPD_CATEGORY_OBJECT_PROPERTIES'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_OBJECT_PROPERTIES_BULK, g ) then
|
|
Result := 'WPD_CATEGORY_OBJECT_PROPERTIES_BULK'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_OBJECT_RESOURCES, g ) then
|
|
Result := 'WPD_CATEGORY_OBJECT_RESOURCES'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_SERVICE_CAPABILITIES, g ) then
|
|
Result := 'WPD_CATEGORY_SERVICE_CAPABILITIES'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_SERVICE_COMMON, g ) then
|
|
Result := 'WPD_CATEGORY_SERVICE_COMMON'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_SERVICE_METHODS, g ) then
|
|
Result := 'WPD_CATEGORY_SERVICE_METHODS'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_SMS, g ) then
|
|
Result := 'WPD_CATEGORY_SMS'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_STILL_IMAGE_CAPTURE, g ) then
|
|
Result := 'WPD_CATEGORY_STILL_IMAGE_CAPTURE'
|
|
else
|
|
if IsEqualGUID( WPD_CATEGORY_STORAGE, g ) then
|
|
Result := 'WPD_CATEGORY_STORAGE';
|
|
except
|
|
// ERROR
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
{$IFDEF DEBUG}
|
|
// Converts a GUID to a description
|
|
function ContentTypeToStr(const sContentID : WideString): WideString;
|
|
var
|
|
g: TGuid;
|
|
begin
|
|
Result := sContentID;
|
|
if sContentID = '' then
|
|
Exit;
|
|
|
|
try
|
|
g := StringToGUID( sContentID );
|
|
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_ALL, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_ALL'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_APPOINTMENT, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_APPOINTMENT'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_AUDIO, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_AUDIO'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_AUDIO_ALBUM, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_AUDIO_ALBUM'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_CALENDAR, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_CALENDAR'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_CERTIFICATE, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_CERTIFICATE'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_CONTACT, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_CONTACT'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_CONTACT_GROUP, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_CONTACT_GROUP'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_DOCUMENT, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_DOCUMENT'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_EMAIL, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_EMAIL'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_GENERIC_FILE, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_GENERIC_FILE'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_GENERIC_MESSAGE, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_GENERIC_MESSAGE'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_IMAGE, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_IMAGE'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_IMAGE_ALBUM, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_IMAGE_ALBUM'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_MEDIA_CAST, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_MEDIA_CAST'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_MEMO, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_MEMO'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_MIXED_CONTENT_ALBUM, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_MIXED_CONTENT_ALBUM'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_NETWORK_ASSOCIATION, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_NETWORK_ASSOCIATION'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_PLAYLIST, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_PLAYLIST'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_PROGRAM, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_PROGRAM'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_SECTION, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_SECTION'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_TASK, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_TASK'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_TELEVISION, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_TELEVISION'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_UNSPECIFIED, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_UNSPECIFIED'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_VIDEO, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_VIDEO'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_VIDEO_ALBUM, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_VIDEO_ALBUM'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_WIRELESS_PROFILE, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_WIRELESS_PROFILE'
|
|
else
|
|
if IsEqualGUID( WPD_CONTENT_TYPE_FOLDER, g ) then
|
|
Result := 'WPD_CONTENT_TYPE_FOLDER';
|
|
except
|
|
// ERROR
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
{$IFDEF DEBUG}
|
|
// Return a comma separated list of content types
|
|
function GetContentTypes(Capabilities: IPortableDeviceCapabilities; sCategory : WideString) : WideString;
|
|
var
|
|
sContentID: WideString;
|
|
ContentTypes: IPortableDevicePropVariantCollection;
|
|
iCount, i: Cardinal;
|
|
PropVar: tag_inner_PROPVARIANT;
|
|
gCat: TGuid;
|
|
begin
|
|
Result := '';
|
|
if ( sCategory = '' ) or
|
|
VarIsClear( Capabilities ) then
|
|
exit;
|
|
|
|
gCat := StringToGUID( sCategory );
|
|
try
|
|
ContentTypes := CreateComObject( CLASS_PortableDevicePropVariantCollection ) as IPortableDevicePropVariantCollection;
|
|
if VarIsClear( ContentTypes ) then
|
|
Exit;
|
|
|
|
Capabilities.GetSupportedContentTypes( gCat, ContentTypes );
|
|
|
|
ContentTypes.GetCount( iCount );
|
|
if iCount > 0 then
|
|
for i := 0 to iCount - 1 do
|
|
begin
|
|
InitPropVariant( ActiveX.PROPVARIANT( PropVar ));
|
|
ContentTypes.GetAt( i, PropVar );
|
|
PropVariantToString( PropVar, sContentID );
|
|
if i > 0 then
|
|
Result := Result + ',';
|
|
Result := Result + ContentTypeToStr( sContentID );
|
|
end;
|
|
|
|
except
|
|
// ERROR
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
{$IFDEF DEBUG}
|
|
// Return a comma separated list of supported commands
|
|
function GetSupportedCommands(Capabilities: IPortableDeviceCapabilities) : WideString;
|
|
var
|
|
CmdKeys: IPortableDeviceKeyCollection;
|
|
iCount, i: Cardinal;
|
|
CmdKey: _WPDtagpropertykey;
|
|
begin
|
|
Result := '';
|
|
if VarIsClear( Capabilities ) then
|
|
exit;
|
|
|
|
try
|
|
CmdKeys := CreateComObject( CLSID_PortableDeviceKeyCollection ) as IPortableDeviceKeyCollection;
|
|
if VarIsClear( CmdKeys ) then
|
|
Exit;
|
|
|
|
Capabilities.GetSupportedCommands( CmdKeys );
|
|
|
|
CmdKeys.GetCount( iCount );
|
|
if iCount > 0 then
|
|
for i := 0 to iCount - 1 do
|
|
begin
|
|
CmdKeys.GetAt( i, CmdKey );
|
|
if i > 0 then
|
|
Result := Result + ',';
|
|
Result := Result + SupportedCommandToStr( CmdKey.fmtid );
|
|
end;
|
|
|
|
except
|
|
// ERROR
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
{$IFDEF DEBUG}
|
|
// Output Functional Category Objects detail to a TStrings object
|
|
procedure EnumFunctionalCategoryObjects(Capabilities: IPortableDeviceCapabilities; sCategory: WideString; ssDest : TStrings);
|
|
var
|
|
sResultText: WideString;
|
|
pCategoryObjs: IPortableDevicePropVariantCollection;
|
|
iCount, i: Cardinal;
|
|
prop_var: tag_inner_PROPVARIANT;
|
|
gCat: TGuid;
|
|
begin
|
|
if ( sCategory = '' ) or
|
|
VarIsClear( Capabilities ) then
|
|
exit;
|
|
|
|
gCat := StringToGUID( sCategory );
|
|
try
|
|
pCategoryObjs := CreateComObject( CLASS_PortableDevicePropVariantCollection ) as IPortableDevicePropVariantCollection;
|
|
if VarIsClear( pCategoryObjs ) then Exit;
|
|
|
|
Capabilities.GetFunctionalObjects( gCat, pCategoryObjs );
|
|
|
|
pCategoryObjs.GetCount( iCount );
|
|
ssDest.Add( 'Category Objects Count: ' + IntToStr( iCount ));
|
|
if iCount > 0 then
|
|
for i := 0 to iCount - 1 do
|
|
begin
|
|
InitPropVariant( ActiveX.PROPVARIANT( prop_var ));
|
|
pCategoryObjs.GetAt( i, prop_var );
|
|
PropVariantToString( prop_var, sResultText );
|
|
ssDest.Add( format( 'Category Object %d: %s', [ i + 1, sResultText ] ));
|
|
end;
|
|
|
|
except
|
|
// ERROR
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
{$IFDEF DEBUG}
|
|
// NOTE THIS ENTRY IS NOT SURFACED
|
|
{!!
|
|
<FS>TIEPortableDevices.EnumDeviceProperties
|
|
|
|
<FM>Declaration<FC>
|
|
function EnumDeviceProperties(const sDeviceID : WideString; ssDest : TStrings) : Boolean;
|
|
|
|
<FM>Description<FN>
|
|
A debugging function that outputs details of the specified devices to a TStrings object
|
|
|
|
<FM>Example<FC>
|
|
// Display properties of the current device
|
|
IEPortableDevices.EnumDeviceProperties( IEPortableDevices.ActiveDeviceID, memDevProps.Lines );
|
|
!!}
|
|
function TIEPortableDevices.EnumDeviceProperties(const sDeviceID : WideString; ssDest : TStrings) : Boolean;
|
|
var
|
|
PortableDev: IPortableDevice;
|
|
Capabilities: IPortableDeviceCapabilities;
|
|
pCategories: IPortableDevicePropVariantCollection;
|
|
iCount, i: Cardinal;
|
|
PropVar: tag_inner_PROPVARIANT;
|
|
sCategory : WideString;
|
|
begin
|
|
Result := False;
|
|
ssDest.Clear;
|
|
try
|
|
if ( ConnectToDevice( sDeviceID, PortableDev, fLastError, AddToLog ) = False ) or
|
|
VarIsClear( PortableDev ) then
|
|
exit;
|
|
|
|
try
|
|
PortableDev.Capabilities( Capabilities );
|
|
if not VarIsClear( Capabilities ) then
|
|
begin
|
|
pCategories := CreateComObject( CLASS_PortableDevicePropVariantCollection ) as IPortableDevicePropVariantCollection;
|
|
if VarIsClear( pCategories ) then
|
|
Exit;
|
|
|
|
Capabilities.GetFunctionalCategories( pCategories );
|
|
|
|
pCategories.GetCount( iCount );
|
|
ssDest.Add( 'Category Count: ' + IntToStr( iCount ));
|
|
|
|
if iCount > 0 then
|
|
for i := 0 to iCount-1 do
|
|
begin
|
|
// List categories
|
|
InitPropVariant( ActiveX.PROPVARIANT( PropVar ));
|
|
pCategories.GetAt( i, PropVar );
|
|
PropVariantToString( PropVar, sCategory );
|
|
ssDest.Add( format( 'Category %d: %s', [ i + 1, FunctionalCategoryToStr( sCategory ) ] ));
|
|
|
|
// Category objects....
|
|
EnumFunctionalCategoryObjects( Capabilities, sCategory, ssDest );
|
|
|
|
// Content Types...
|
|
ssDest.Add( 'Content types: ' + GetContentTypes( Capabilities, sCategory ));
|
|
end;
|
|
|
|
// Get commands...
|
|
ssDest.Add( 'Supported Commands: ' + GetSupportedCommands( Capabilities ));
|
|
end;
|
|
finally
|
|
Capabilities := nil;
|
|
end;
|
|
|
|
PortableDev.Close;
|
|
result := True;
|
|
|
|
finally
|
|
PortableDev := nil;
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
|
|
initialization
|
|
OleInitialize( nil );
|
|
|
|
finalization
|
|
OleUninitialize;
|
|
|
|
|
|
{$ELSE} // IEINCLUDEWPD
|
|
interface
|
|
implementation
|
|
{$ENDIF}
|
|
|
|
end.
|
|
|