112 lines
3.5 KiB
ObjectPascal
112 lines
3.5 KiB
ObjectPascal
|
unit dwShellItem;
|
||
|
|
||
|
interface
|
||
|
|
||
|
{$INCLUDE '.\..\Packages\DelphiVersions.inc'}
|
||
|
|
||
|
uses
|
||
|
ActiveX, Windows;
|
||
|
|
||
|
const
|
||
|
SID_IShellItem = '{43826d1e-e718-42ee-bc55-a1e261c37bfe}';
|
||
|
SID_IPropertyStore = '{886d8eeb-8cf2-4446-8d02-cdba1dbdcf99}';
|
||
|
|
||
|
type
|
||
|
TIID = TGUID;
|
||
|
|
||
|
IShellItem = interface(IUnknown)
|
||
|
[SID_IShellItem]
|
||
|
function BindToHandler(const pbc: IUnknown; const bhid: TGUID; const riid: TIID; out ppv): HResult; stdcall;
|
||
|
function GetParent(var ppsi: IShellItem): HResult; stdcall;
|
||
|
function GetDisplayName(sigdnName: DWORD; var ppszName: LPWSTR): HResult; stdcall;
|
||
|
function GetAttributes(sfgaoMask: DWORD; var psfgaoAttribs: DWORD): HResult; stdcall;
|
||
|
function Compare(const psi: IShellItem; hint: DWORD; var piOrder: Integer): HResult; stdcall;
|
||
|
end;
|
||
|
|
||
|
_tagpropertykey = packed record
|
||
|
fmtid: TGUID;
|
||
|
pid: DWORD;
|
||
|
end;
|
||
|
PROPERTYKEY = _tagpropertykey;
|
||
|
PPropertyKey = ^TPropertyKey;
|
||
|
TPropertyKey = _tagpropertykey;
|
||
|
|
||
|
IPropertyStore = interface(IUnknown)
|
||
|
[SID_IPropertyStore]
|
||
|
function GetCount(out cProps: DWORD): HResult; stdcall;
|
||
|
function GetAt(iProp: DWORD; out pkey: TPropertyKey): HResult; stdcall;
|
||
|
function GetValue(const key: TPropertyKey; out pv: TPropVariant): HResult; stdcall;
|
||
|
function SetValue(const key: TPropertyKey; const propvar: TPropVariant): HResult; stdcall;
|
||
|
function Commit: HResult; stdcall;
|
||
|
end;
|
||
|
|
||
|
type
|
||
|
PSHItemID = ^TSHItemID;
|
||
|
_SHITEMID = record
|
||
|
cb: Word;
|
||
|
abID: array[0..0] of Byte;
|
||
|
end;
|
||
|
TSHItemID = _SHITEMID;
|
||
|
SHITEMID = _SHITEMID;
|
||
|
|
||
|
PItemIDList = ^TItemIDList;
|
||
|
_ITEMIDLIST = record
|
||
|
mkid: TSHItemID;
|
||
|
end;
|
||
|
TItemIDList = _ITEMIDLIST;
|
||
|
ITEMIDLIST = _ITEMIDLIST;
|
||
|
|
||
|
function SHCreateItemFromIDList(pidl: PItemIDList; const riid: TIID; out ppv): HResult;
|
||
|
function SHCreateItemFromParsingName(pszPath: LPCWSTR; const pbc: IUnknown; const riid: TIID; out ppv): HResult;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
const
|
||
|
shell32 = 'shell32.dll';
|
||
|
|
||
|
var
|
||
|
Shell32Lib: HModule;
|
||
|
_SHCreateItemFromParsingName: function(pszPath: LPCWSTR; const pbc: IUnknown; const riid: TIID; out ppv): HResult; stdcall;
|
||
|
_SHCreateItemFromIDList: function(pidl: PItemIDList; const riid: TIID; out ppv): HResult; stdcall;
|
||
|
|
||
|
procedure InitShlObj; {$IFDEF Delphi2006_Up} inline; {$ENDIF}
|
||
|
begin
|
||
|
Shell32Lib := GetModuleHandle(shell32);
|
||
|
end;
|
||
|
|
||
|
function SHCreateItemFromParsingName(pszPath: LPCWSTR; const pbc: IUnknown; const riid: TIID; out ppv): HResult;
|
||
|
begin
|
||
|
if Assigned(_SHCreateItemFromParsingName) then
|
||
|
Result := _SHCreateItemFromParsingName(pszPath, pbc, riid, ppv)
|
||
|
else
|
||
|
begin
|
||
|
InitShlObj;
|
||
|
Result := E_NOTIMPL;
|
||
|
if Shell32Lib > 0 then
|
||
|
begin
|
||
|
_SHCreateItemFromParsingName := GetProcAddress(Shell32Lib, 'SHCreateItemFromParsingName'); // Do not localize
|
||
|
if Assigned(_SHCreateItemFromParsingName) then
|
||
|
Result := _SHCreateItemFromParsingName(pszPath, pbc, riid, ppv);
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function SHCreateItemFromIDList(pidl: PItemIDList; const riid: TIID; out ppv): HResult;
|
||
|
begin
|
||
|
if Assigned(_SHCreateItemFromIDList) then
|
||
|
Result := _SHCreateItemFromIDList(pidl, riid, ppv)
|
||
|
else
|
||
|
begin
|
||
|
InitShlObj;
|
||
|
Result := E_NOTIMPL;
|
||
|
if Shell32Lib > 0 then
|
||
|
begin
|
||
|
_SHCreateItemFromIDList := GetProcAddress(Shell32Lib, 'SHCreateItemFromIDList'); // Do not localize
|
||
|
if Assigned(_SHCreateItemFromIDList) then
|
||
|
Result := _SHCreateItemFromIDList(pidl, riid, ppv);
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
end.
|