2.2 拡張シェルオブジェクト用インターフェイス

節で述べたとおり、複雑な動作をする拡張シェルは、「拡張シェルオブジェクト」と呼ばれる COMオブジェクトにより実現されます。
より正確に言うと、まず、用途にあったインターフェイスを実装した拡張シェルオブジェクトを作成し、それを Windowsに登録することで実現されます。
張シェルオブジェクトの Windowsへの登録方法に関しましては前節で解説しましたので、ここでは、拡張シェルオブジェクトの土台となるインターフェイス群及びその各メンバー関数に関しまして解説することにします。
だし、全ての COMオブジェクトの基底インターフェイスである IUnknownインターフェイスに関しましては、数々の書籍で取り上げられていることもありここでは解説を省きました。
したがって、IUnknownインターフェイスに関しましてはそれらの関連書籍を参照するようにして下さい。
た、特に断りを入れていない場合、該当するインターフェイスの宣言は shlobj.pas(C系言語であれば shilobj.h)に存在するものとしましたのでご注意下さい。

お、拡張シェルオブジェクトの具体的な例に関しましては次章にて解説する予定としていますのでそちらを参照して下さい。

2.2.1 IContextMenuインターフェイス

IContextMenuインターフェイスはオブジェクトに関係づけられたコンテキストメニューを生成したり、マージしたりする際に使用されます。
た、IContextMenuインターフェイスによる拡張シェルは IShellExtInitインターフェイスにより初期化されなければなりません。

ェルは以下の3ケースにおいてIContextMenuインターフェイスを使用します。
1.拡張コンテキストメニューを含む場合
 拡張コンテキストメニューが含まれている場合、シェルの名前空間において項目(ファイル等)が右クリックされるとまずその項目タイプに合わせたデフォルトコンテキストメニューが生成されその後その項目タイプで登録されている拡張コンテキストメニューが読込まれ生成されます。

2.拡張名前空間においてサブフォルダのコンテキストメニューを検索する場合
 シェルはエクスプローラの拡張名前空間下のフォルダに対するコンテキストメニューを生成する際IShellFolder.GetUIObjectOfを呼出して該当するIContextMenuオブジェクトを生成します。

3.非デフォルトのドラッグアンドドロップ動作を含む場合
 ファイルシステムフォルダー(ディレクトリ)に対して非デフォルトのドラッグアンドドロップ動作を行う場合、シェルは拡張シェルを呼出します。

下に IContextMenuインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_IContextMenu = '{000214E4-0000-0000-C000-000000000046}';

IContextMenu = interface(IUnknown)
  [SID_IContextMenu]
  function QueryContextMenu(Menu: HMENU;
      indexMenu, idCmdFirst, idCmdLast, uFlags: UINT): HResult; stdcall;
  function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;
  function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
      pszName: LPSTR; cchMax: UINT): HResult; stdcall;
end;


[メンバー関数](全3関数)


QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast, uFlags: UINT)

ンテキストメニューに1つ以上のメニュー項目を挿入します。(挿入しなくても構いません)
入されるメニューの項目IDは idCmdFirst以上 idCmdLast以下の範囲内でなければいけません。

{ パラメータ }
Menu:メニューハンドル
indexMenu:最初のメニュー項目の挿入位置(0ベース)
idCmdFirst:挿入したメニュー項目IDの下限
idCmdLast:挿入したメニュー項目IDの上限
uFlags:ゼロもしくは以下のフラグの組み合わせ
 ・CMF_DEFAULTONLY..... ユーザーがダブルクリック等でデフォルトの動作を起動させていることを示す。この時はメニュー項目を追加してはならない。
 ・CMF_EXPLORER..... 選択されている項目が左側ペインを持っていることを示す。コンテキストメニューハンドラーはこのフラグを無視する。
 ・CMF_NORMAL..... 通常の動作であることを示す。メニュー項目を追加することが出来る。
 ・CMF_VERBSONLY..... 選択されている項目がショートカットであることを示す。コンテキストメニューハンドラーはこのフラグを無視する。

{ 返値 }

 関数が成功すれば、HRESULTを返します。ただし、そのCODEメンバ(low word)は追加したメニュー項目のIDの最大値(idCmdFirst - 1)からのオフセットを表しています。


InvokeCommand( var lpici: TCMInvokeCommandInfo)

QueryContextMenuにより追加されたメニュー項目が選択された時に呼出されます。
LoWord( integer( lpici.lpVerb ) ) [in C++, LOWORD( lpici->lpVerb)]に選択されたメニュー項目のオフセット(MenuItem ID - idCmdFirst)が格納されています。
{ パラメータ }
lpici:選択されたコマンドに関する情報を格納しているTCMInvokeCommandInfo構造体

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

ミニ解説: TCMInvokeCommandInfo構造体

ンテキストメニューのコマンドに関する情報を格納した構造体です。

TCMInvokeCommandInfo = packed record
  cbSize: DWORD;
  fMask: DWORD;
  hwnd: HWND;
  lpVerb: LPCSTR;
  lpParameters: LPCSTR;
  lpDirectory: LPCSTR;
  nShow: Integer;
  dwHotKey: DWORD;
  hIcon: THandle;
end;

[メンバー]
cbSize.....sizeof( TCMInvokeCommandInfo)でなければならない
fMask.....ゼロもしくは以下のフラグの組み合わせ
・CMIC_MASK_HOTKEY---dwHotKeyメンバが有効であることを示す
・CMIC_MASK_ICON---hIconメンバが有効であることを示す
・CMIC_MASK_FLAG_NO_UI---コマンド実行中、システムはUI要素を表示出来ないことを示す
hwnd.....コンテキストメニューのオーナーウィンドウのハンドル
lpVerb.....HiWord( integer( lpVerb))=0の時、LoWord( integer( lpVerb))は選択されたメニュー項目IDの idCmdFirstからのオフセット。HiWord( integer( lpVerb)) <> 0の時(アプリケーションから呼出された場合が典型的)、実行するコマンドの名前(コマンド文字列)を差すヌル終端文字列へのポインタで CMDSTR_NEWFOLDER( = 'NewFolder')、CMDSTR_VIEWLIST( = 'ViewList')、CMDSTR_VIEWDETAILS( = 'ViewDetails')がシステムにより定義済になっている
lpParameters.....パラメータオプション
 (拡張シェルにより追加されたメニュー項目の場合は常に0)
lpDirectory.....作業ディレクトリオプション
 (拡張シェルにより追加されたメニュー項目の場合は常に0)
nShow.....コマンドがウィンドウを表示したりアプリケーションを起動させる場合にShowWindowに渡されるフラグ(SW_*)
dwHotKey.....コマンドにより起動されたアプリケーションに割当てられるホットキー(fMask参照)
hIcon.....コマンドにより起動されたアプリケーションに割当てられるアイコンハンドル(fMask参照)


GetCommandString(idCmd, uType: UINT; pwReserved: PUINT; pszName: LPSTR; cchMax: UINT)

ンテキストメニューに対するコマンド文字列あるいはヘルプ文字列を返します。
ルプ文字列はエクスプローラのステータスバーに表示されます。
{ パラメータ }
idCmd:選択されているメニュー項目IDの idCmdFirstからのオフセット
uType:返値の種類を指定するパラメータ(以下のどれか1つ)
 ・GCS_HELPTEXT.....ヘルプ文字列(ヌル終端文字列)を返すことを示す
 ・GCS_VALIDATE.....メニューアイテムが存在することを確認しているだけであることを示す
 ・GCS_VERB.....コマンド文字列(ヌル終端文字列)を返すことを示す
pwReserved:予約済(呼出す時は必ず0)
pszName:返値を格納するバッファーのアドレス
cchMax:上記バッファーのサイズ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

2.2.2 IShellExtInitインターフェイス

IShellExtInitインターフェイスは、エクスプローラが拡張シェルオブジェクトを初期化する際に使用します。IContextMenuやIPropSheetExtを使用する際はIShellExtInitインターフェイスを実装しなくてはなりません。
クスプローラは拡張シェルオブジェクトを使用する際、
(1)CoCreateInstanceを登録されたCLSIDとIID_IShellExtInitで呼出し、
(2)そのInitializeメンバ関数を呼出し、
(3)そのQueryInterfaceメンバ関数を呼出して特定のインターフェイス(IContextMenuやIPropSheetExt等)を得る、という順序で動作します。

下に IShellExtInitインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_IShellExtInit = '{000214E8-0000-0000-C000-000000000046}';

IShellExtInit = interface( IUnknown)
  [SID_IShellExtInit]
  function Initialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
      hKeyProgID: HKEY): HResult; stdcall;
end;


[メンバー関数](全1関数)


Initialize(pidlFolder: PItemIDList; lpdobj: IDataObject; hKeyProgID: HKEY)

クスプローラが拡張コンテキストメニュー、拡張プロパティシート、非デフォルトドラッグアンドドロップを初期化する際に呼出されます。
{ パラメータ }
pidlFolder:拡張コンテキストメニュー、拡張プロパティシートに対しては親フォルダ、非デフォルトドラッグアンドドロップに対してはターゲットフォルダを示すTItemIDList構造体へのポインタ
lpdobj:1つ以上の選択された(ドロップされた)項目を返すIDataObjectオブジェクトへのポインタ
hkeyProgID:拡張コンテキストメニュー、拡張プロパティシートに対してはフォーカスのあるファイル項目のレジストリキー(ファイルクラス)、非デフォルトドラッグアンドドロップに対してはターゲットフォルダのレジストリキー(ファイルクラス)を示す

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

ミニ解説: TItemIDList構造体

イテムIDの配列です。

PItemIDList = ^TItemIDList;

TItemIDList = packed record
  mkid: TSHItemID;
end;

TSHItemID = packed record
  cb: Word;
  abID: array[0..0] of Byte;
end;

[メンバー]
cb.....項目IDのサイズ(cb自身も含む)
abID.....項目ID(可変長)

2.2.3 IShellPropSheetExtインターフェイス

張プロパティシートや拡張コントロールパネルにプロパティシートページを追加あるいは置換えを行う際、エクスプローラは IShellPropSheetExtインターフェイスを使用します。

下に IShellPropSheetExtインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_IShellPropSheetExt = '{000214E9-0000-0000-C000-000000000046}';

IShellPropSheetExt = interface(IUnknown)
  [SID_IShellPropSheetExt]
  function AddPages(lpfnAddPage: TFNAddPropSheetPage; lParam: LPARAM)
      : HResult; stdcall;
  function ReplacePage(uPageID: UINT; lpfnReplaceWith: TFNAddPropSheetPage;
      lParam: LPARAM): HResult; stdcall;
end;


[メンバー関数](全2関数)


AddPages(lpfnAddPage: TFNAddPropSheetPage; lParam: LPARAM)

クスプローラはプロパティシートを表示させる際、そのオブジェクトに拡張プロパティシートが登録されているとIShellPropSheetExt.AddPagesを呼出します。
{ パラメータ }
lpfnAddPage:プロパティシートにページを追加するために呼出されるTFNAddPropSheetPage型のコールバック関数
lParam:lpfnAddPageを呼出す際に立てられるアプリケーションが利用する任意のパラメータ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

ミニ解説: TFNAddPropSheetPage関数型

ロパティシートページの追加に関するコールバック関数の型です。論理型を返します。

TFNAddPropSheetPage = function( hPSP: HPropSheetPage; lParam: Longint): BOOL stdcall;

[パラメータ]

hPSP:CreatePropertySheetPage関数(Commctrl.pas)によって得られたプロパティシートのハンドル
lParam:任意のパラメータ


ReplacePage( uPageID: UINT; lpfnReplaceWith: TFNAddPropSheetPage; lParam: LPARAM)

張コントロールパネルのプロパティシートページを置き換えます。
{ パラメータ }
uPageID:置き換えるページID(CPLEXT.Hヘッダーファイルに記述)
lpfnReplaceWith:プロパティシートのページを置換えるために呼出されるTFNAddPropSheetPage型のコールバック関数
lParam:lpfnReplaceWidthを呼出す際に立てられる(アプリケーションが利用する)任意のパラメータ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

2.2.4 IPersistFolderインターフェイス

ェルフォルダオブジェクトを初期化します。
IShellFolder.BindToObjectにて使用されます。
ェルの拡張名前空間(IShellFolderインターフェイス)を実装する際に実装しなければならないインターフェイスです。

下に IPersistFolderインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。

[ 継承 ]

 各種パーシステントストレージ(ファイル等の永続的記憶クラス)の基本クラス IPersistインターフェイス( In Delphi, ActiveX.pas. In C++, ActiveX.hにて宣言)を継承しています。

const SID_IPersistFolder = '{000214EA-0000-0000-C000-000000000046}';

IPersistFolder = interface( IPersist)
  [SID_IPersistFolder]
  function Initialize(pidl: PItemIDList): HResult; stdcall;
end;


In ActiveX.pas

IPersist = interface( IUnknown)
  ['{0000010C-0000-0000-C000-000000000046}']
  function GetClassID(out classID: TCLSID): HResult; stdcall;
end;



[メンバー関数](全2関数)


Initialize(pidl: PItemIDList)

クスプローラがシェルフォルダオブジェクトを初期化する際に呼出されます。
{ パラメータ }
pidl:フォルダの絶対位置を指定するTItemIDList構造体

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetClassID(out classID: TCLSID)

ブジェクトのクラスIDを返します。
{ パラメータ }
classID:オブジェクトのクラスID

{ 返値 }

 以下のいずれかを返します。

 ・S_OK.....成功
 ・E_FAIL.....失敗

2.2.5 IExtractIconインターフェイス

IExtractIconインターフェイスは、オブジェクトのアイコンを返します。
IShellFolderインターフェイスを実装する際は IShellFolder.GetUIObjectOfに応答できるように IExtractIconインターフェイスも実装しなくてはなりません。
のインターフェイスに基づく拡張シェルは IPersistFile.Loadにより初期化されます。
いていの場合においてこのインターフェイスに直接アクセスする必要はありませんが、あるオブジェクトに別のオブジェクトのアイコンを送りたい場合などには直接利用することがあります。
クスプローラのスコープペインでフォルダが展開されると、
(1)エクスプローラはそのIShellFolderを得てフォルダにバインドし、
(2)EnumObjectsを呼出してサブフォルダを列挙し、
(3)GetUIObjectOfを呼出してサブフォルダそれぞれの IExtractIconインターフェイスを得る、
という順序で動作します。
た、シェルがファイルからアイコンを取出す時は、
(1)アイコン抽出ハンドラを生成(レジストリ「{ AppID } \shell \ExtractIconHandler」からCLSIDを入手し CoCreateInstanceを呼出す。)し、
(2)GetIconLocationを呼出しアイコンの位置情報を得て、
(3)そのアイコンの位置情報と Indexで Extractを呼出します。
の時、もし NOERROR以外が返ってきた場合は、位置情報が限定的なパスで示されているという前提で同じロジックを繰返します。
の、シェルがファイルからアイコンを抽出する場合をもう少し詳しく見てみますと、 (1)ProgID、ClassIDを探し、
(2)ファイルが ClassIDを持っていればその直下のレジストリキー"DefaultIcon"からアイコンの位置情報を得て、(位置情報はクラス毎のアイコンもしくはインスタンス毎のアイコンのものを表している。)その位置情報がインスタンス毎のアイコンを表している場合、
(3)シェルはアイコン抽出ハンドラを生成しファイルからアイコンを取出す、
という動作をしています。
ェルは、まず IExtractIcon.GetIconLocationを呼出してから、その後で IExtractIcon.Extractを呼出すということは重要です。たいていのアプリケーションではアイコンをファイル内にイメージを直接保存するのではなく位置情報で保存します。この場合、プログラマーは GetIconLocationのみを実装すれば良いことになります。( Extractは単にS_FALSEを返す様にします。)したがって、Extractはアイコンイメージをファイル内や別のデータベースに保存する場合のみ実装します。

下に IExtractIconインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_IExtractIconA = '{000214EB-0000-0000-C000-000000000046}';

IExtractIconA = interface(IUnknown)
  [SID_IExtractIconA]
  function GetIconLocation(uFlags: UINT; szIconFile: PAnsiChar; cchMax: UINT;
    out piIndex: Integer; out pwFlags: UINT): HResult; stdcall;
  function Extract(pszFile: PAnsiChar; nIconIndex: UINT;
    out phiconLarge, phiconSmall: HICON; nIconSize: UINT): HResult; stdcall;
end;

IExtractIcon = IExtractIconA;


[メンバー関数](全2関数)


GetIconLocation(uFlags: UINT; szIconFile: PAnsiChar; cchMax: UINT; out piIndex: Integer; out pwFlags: UINT)

イコンの位置情報を返します。
{ パラメータ }
uFlags(in):ゼロもしくは以下のフラグの組み合わせ
 ・GIL_FORSHELL.....アイコンはシェルフォルダに表示される
 ・GIL_OPENICON.....アイコンは開いているフォルダに対するものである
szIconFile(out):アイコンの位置情報(ヌル終端文字列)が返されるバッファへのポインタ
cchMax(in):バッファの最大サイズ
piIndex(out):アイコンのインデックス
pwFlags(out):返されるゼロもしくは以下のフラグの組み合わせ
 ・GIL_DONTCACHE.....アイコンはキャッシュされていない
 ・GIL_NOTFILENAME.....位置情報はファイルネームではなく、アイコンを抽出するために IExtractIcon.Extractメソッドを呼出す必要がある
 ・GIL_PERCLASS.....このクラスのすべてのファイルオブジェクトは同じアイコンを使用する
 ・GIL_PERINSTANCE.....このクラスのファイルオブジェクトはそれぞれ自身(インスタンス毎)のアイコンを保持している
 ・GIL_SIMULATEDOC.....ドキュメントアイコンを生成する

{ 返値 }

 関数が成功すれば、NOERRORを返します。デフォルトアイコンを使用する場合はS_FALSEを返します。


Extract(pszFile: PAnsiChar; nIconIndex: UINT; out phiconLarge, phiconSmall: HICON; nIconSize: UINT)

ァイルからアイコンイメージを抽出します。
{ パラメータ }
pszFile(in):アイコンの位置情報(典型的にはファイルへのパス)
nIconIndex(in):アイコンインデックス
phiconLarge(out):アイコン(大)のハンドル
phiconSmall(out):アイコン(小)のハンドル
nIconSize(in):アイコン(大)のサイズ(ピクセル)

{ 返値 }

 関数が成功すれば、NOERRORを返します。S_FALSEを返した場合は呼出したアプリケーション側で( pszFile、nIconIndexを基に)アイコンを抽出しなければなりません。

2.2.6 IShellIconインターフェイス

IShellFolderオブジェクトのアイコンインデックスを得るために使用されるインターフェイスです。 フォルダ内のオブジェクトに対するアイコンを返す手っ取り早い方法としては、IShellIconインターフェイスを IShellFolderインターフェイスを用いて実装する、という手があります。
のインターフェイスではアイコンはフォルダに対して一度だけ生成されます。それに対して IExtractIconインターフェイスではオブジェクト毎にアイコンが生成されます。
IShellFolderインターフェイスがこのインターフェイスを実装しなければ、すべてのオブジェクトに対するアイコンを得る際には IShellfolder.GetUIObjectが使用されます。

下に IShellIconインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_IShellIcon = '{000214E5-0000-0000-C000-000000000046}';

IShellIcon = interface(IUnknown)
  [SID_IShellIcon]
  function GetIconOf(pidl: PItemIDList; flags: UINT;
      out IconIndex: Integer): HResult; stdcall;
end;


[メンバー関数](全1関数)


GetIconOf(pidl: PItemIDList; flags: UINT; out IconIndex: Integer)

ォルダ内のオブジェクトに対するアイコンを返します。
{ パラメータ }
pidl:フォルダの相対位置を指定するTItemIDList構造体へのポインタ
flags:ゼロもしくは以下のフラグの組み合わせ
 ・GIL_FORSHELL.....アイコンはシェルフォルダに表示される
 ・GIL_OPENICON.....アイコンは開いているフォルダに対するものである(「開いた状態」「閉じた状態」両方のイメージが設定されている場合、アイコンは「開いた状態」でなければならない。)
IconIndex:アイコンのインデックス

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はS_FALSEを返します。
 また、以下のインデックスを返すことも可能です。
 ・0.....ドキュメント(空白)
 ・1.....ドキュメント(データ有り)
 ・2.....アプリケーション(拡張子は必ず".exe"、".com"、".bat")
 ・3.....フォルダ(閉じ)
 ・4.....フォルダ(開く)

2.2.7 IShellLinkインターフェイス

ェルリンクとは、シェルの名前空間上のオブジェクト(つまりはエクスプローラ上のオブジェクト)に関する情報を保持したオブジェクトのことをいいます。
ェルリンクはオブジェクトの「エイリアス(別名)」のように扱えますので、ユーザーやアプリケーションは、オブジェクトの現在の名前や位置を知らなくても(名前空間のどこからでも)オブジェクトにアクセスすることができます。

下に IShellLinkインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_IShellLinkA = '{000214EE-0000-0000-C000-000000000046}';

IShellLinkA = interface(IUnknown)
  [SID_IShellLinkA]
  function GetPath(pszFile: PAnsiChar; cchMaxPath: Integer;
    var pfd: TWin32FindData; fFlags: DWORD): HResult; stdcall;
  function GetIDList(var ppidl: PItemIDList): HResult; stdcall;
  function SetIDList(pidl: PItemIDList): HResult; stdcall;
  function GetDescription(pszName: PAnsiChar; cchMaxName: Integer): HResult; stdcall;
  function SetDescription(pszName: PAnsiChar): HResult; stdcall;
  function GetWorkingDirectory(pszDir: PAnsiChar; cchMaxPath: Integer): HResult; stdcall;
  function SetWorkingDirectory(pszDir: PAnsiChar): HResult; stdcall;
  function GetArguments(pszArgs: PAnsiChar; cchMaxPath: Integer): HResult; stdcall;
  function SetArguments(pszArgs: PAnsiChar): HResult; stdcall;
  function GetHotkey(var pwHotkey: Word): HResult; stdcall;
  function SetHotkey(wHotkey: Word): HResult; stdcall;
  function GetShowCmd(out piShowCmd: Integer): HResult; stdcall;
  function SetShowCmd(iShowCmd: Integer): HResult; stdcall;
  function GetIconLocation(pszIconPath: PAnsiChar; cchIconPath: Integer;
    out piIcon: Integer): HResult; stdcall;
  function SetIconLocation(pszIconPath: PAnsiChar; iIcon: Integer): HResult; stdcall;
  function SetRelativePath(pszPathRel: PAnsiChar; dwReserved: DWORD): HResult; stdcall;
  function Resolve(Wnd: HWND; fFlags: DWORD): HResult; stdcall;
  function SetPath(pszFile: PAnsiChar): HResult; stdcall;
end;

IShellLink = IShellLinkA;


[メンバー関数](全18関数)


GetPath(pszFile: PAnsiChar; cchMaxPath: Integer; var pfd: TWin32FindData; fFlags: DWORD)

ェルリンクオブジェクトのパスとファイルネームを返します。
{ パラメータ }
pszFile:シェルリンクオブジェクトのパスとファイルネームが返されるバッファへのポインタ
cchMaxPath:バッファの最大サイズ
pfd:シェルリンクオブジェクトに関する情報を格納したTWin32FindData構造体
fFlags:返されるパス情報のタイプ(以下のフラグの組合わせ)
 ・SLGP_SHORTPATH.....標準ショートファイルネーム(8.3形式)
 ・SLGP_UNCPRIORITY.....ファイルのUNCパスネーム
{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

ミニ解説: TWin32FindData構造体

FindFirstFile、FindNextFile関数によって返されるファイル情報です。
ァイルがロングファイルネームを持っていれば、cFileNameにそれが格納されます。ショートファイルネームはcAlternateFileNameに格納されます。
しもcAlternateFileNameが空であれば、GetShortPathName関数でショートファイルネームを得ることが出来ます。

TWin32FindDataA = record
  dwFileAttributes: DWORD;
  ftCreationTime: TFileTime;
  ftLastAccessTime: TFileTime;
  ftLastWriteTime: TFileTime;
  nFileSizeHigh: DWORD;
  nFileSizeLow: DWORD;
  dwReserved0: DWORD;
  dwReserved1: DWORD;
  cFileName: array[0..MAX_PATH - 1] of AnsiChar;
  cAlternateFileName: array[0..13] of AnsiChar;
end;

TWin32FindData = TWin32FindDataA;

[メンバー]
dwFileAttributes.....見つかったファイルの属性(以下のフラグの組合せ)
・FILE_ATTRIBUTE_ARCHIVE---アーカイブファイル
(アプリケーションはこのフラグをバックアップファイルや削除ファイルに対して付与します)
・FILE_ATTRIBUTE_COMPRESSED---圧縮ファイル(圧縮フォルダ)
・FILE_ATTRIBUTE_DIRECTORY---ディレクトリ
・FILE_ATTRIBUTE_HIDDEN---隠しファイル
・FILE_ATTRIBUTE_NORMAL---属性無し(このフラグは単独で使用される)
・FILE_ATTRIBUTE_OFFLINE---ファイルのデータをすぐには利用できない
(ファイルがデータがオフラインストレージに物理的に移動されたことを示す)
・FILE_ATTRIBUTE_READONLY---読込み専用
・FILE_ATTRIBUTE_SYSTEM---システムファイル
(OSの一部かあるいはOSにより排他的に使用されるファイル)
・FILE_ATTRIBUTE_TEMPORARY---テンポラリファイル
(メディアにフラッシュされない限りデータのほとんどがメモリ上に存在する)
ftCreationTime.....ファイルの作成日時が格納されたTFileTime構造体
ftLastAccessTime.....ファイルの最終アクセス日時が格納されたTFileTime構造体
ftLastWriteTime.....ファイルの最終更新日時が格納されたTFileTime構造体
nFileSizeHigh.....ファイルサイズの上位4バイト
(正確なファイルサイズ = ( nFileSizeHigh * MAXDWORD) + nFileSizeLow )
nFileSizeLow.....ファイルサイズの下位4バイト
(正確なファイルサイズ = ( nFileSizeHigh * MAXDWORD) + nFileSizeLow )
dwReserved0.....予約済み
dwReserved1.....予約済み
cFileName.....ロングファイル名(ヌル終端文字列)
cAlternateFileName.....ショートファイル名(ヌル終端文字列)

ミニ解説: TFileTime構造体

100ナノ秒を単位とした1601年1月1日からの経過時間を64ビットで表します。(UTCフォーマット)
FindFirstFile、FindNextFile関数では、このUTCフォーマットを含んでいないファイルシステムに対してTFileTime構造体をゼロに設定します。その場合、FileTimeToLocalFileTime関数を用いてUTCからローカルタイムを生成出来ます。
た、FileTimeToSystemTime関数を用いてローカルタイムからTSystemTime構造体を生成できます。

TFileTime = record
  dwLowDateTime: DWORD;
  dwHighDateTime: DWORD;
end;

[メンバー]
dwLowDateTime.....下32ビット
dwHighDateTime.....上32ビット


GetIDList(var ppidl: PItemIDList)

ェルリンクオブジェクトに対するアイテムIDリスト(TItemIDList構造体)を返します。
{ パラメータ }
ppidl:アイテムIDリスト(TItemIDList構造体)へのポインタ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SetIDList(pidl: PItemIDList)

ェルリンクオブジェクトに対してアイテムIDリスト(TItemIDList構造体)を設定します。
の関数は、ファイルではないオブジェクト(コントロールパネル、プリンタ、他のコンピュータ等)にシェルリンクを設定する必要がある場合に有用です。
{ パラメータ }
pidl:アイテムIDリスト(TItemIDList構造体)へのポインタ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetDescription(pszName: PAnsiChar; cchMaxName: Integer)

ェルリンクオブジェクトに関する記述(コメント)を返します。
{ パラメータ }
pszName:記述が返されるバッファへのポインタ
cchMaxName:バッファの最大サイズ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SetDescription(pszName: PAnsiChar)

ェルリンクオブジェクトに記述(コメント)を設定します。
{ パラメータ }
pszName:設定する記述を指すポインタ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetWorkingDirectory(pszDir: PAnsiChar; cchMaxPath: Integer)

ェルリンクオブジェクトに対して作業ディレクトリ名を返します。
{ パラメータ }
pszDir:作業ディレクトリ名が返されるバッファへのポインタ
cchMaxPath::バッファの最大サイズ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SetWorkingDirectory(pszDir: PAnsiChar)

ェルリンクオブジェクトに対して作業ディレクトリを設定します。
業ディレクトリは設定されるよう要求されている場合のみ設定する必要があります。例えば、別のディレクトリにあるテンプレートを使用しているワープロ文書ファイルへシェルリンクを設定する場合などに作業ディレクトリの設定が必要です。
{ パラメータ }
pszDir:作業ディレクトリ名を指すポインタ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetArguments(pszArgs: PAnsiChar; cchMaxPath: Integer)

ェルリンクオブジェクトに関連するコマンドラインパラメータを返します。
{ パラメータ }
pszArgs:コマンドラインパラメータが返されるバッファへのポインタ
cchMaxPath:バッファの最大サイズ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SetArguments(pszArgs: PAnsiChar)

ェルリンクオブジェクトにコマンドラインパラメータを設定します。
ンパイラのような特別なパラメータ(フラグ)をとるアプリケーションへシェルリンクを設定する場合等に有用です。
{ パラメータ }
pszArgs:コマンドラインパラメータを指すポインタ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetHotkey(var pwHotkey: Word)

ェルリンクオブジェクトに対するホットキーを返します。
{ パラメータ }
pwHotkey:ホットキー(下位バイトは仮想キーコード、上位バイトは以下のフラグの組合せ)
 ・HOTKEYF_ALT.....ALTキー
 ・HOTKEYF_CONTROL.....CTRLキー
 ・HOTKEYF_EXT.....Extendedキー
 ・HOTKEYF_SHIFT.....SHIFTキー

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SetHotkey(wHotkey: Word)

ェルリンクオブジェクトにホットキーを設定します。
ブジェクトを特定のキーの組合せで起動させたい場合に使用します。
{ パラメータ }
wHotkey:ホットキー(GetHotkey参照)

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetShowCmd(out piShowCmd: Integer)

ェルリンクオブジェクトに対するShowコマンドを返します。
{ パラメータ }
piShowCmd:Showコマンド(以下のどれか1つ)
 ・SW_SHOWDEFAULT.....アプリケーションを起動させたプログラムによってCreateProcess関数に渡されたTStartupInfo構造体に指定された、 SW_フラグを基にして表示状態を設定します。アプリケーションはこのフラグとともにShowWindowを呼び出して、 自身のメイン ウィンドウの初期表示状態を設定しなければなりません。
 ・SW_HIDE.....ウィンドウを非表示にし、 ほかのウィンドウをアクティブ化します。
 ・SW_MINIMIZE.....指定されたウィンドウをアイコン化し、 Z順序で次のトップ レベル ウィンドウをアクティブ化します。
 ・SW_RESTORE.....ウィンドウをアクティブ化して表示します。ウィンドウがアイコン化されていたり最大化されているときには、 Windowsが元のサイズと位置に復元します。アプリケーションは、 アイコン化されているウィンドウを復元ときにこのフラグを指定します。
 ・SW_SHOW.....ウィンドウをアクティブ化し、 現在のサイズと位置で表示します。
 ・SW_SHOWMAXIMIZED.....ウィンドウをアクティブ化し、 最大表示ウィンドウとして表示します。
 ・SW_SHOWMINIMIZED.....ウィンドウをアクティブ化し、 アイコン表示します。
 ・SW_SHOWMINNOACTIVE.....ウィンドウをアイコン表示します。アクティブ ウィンドウはアクティブな状態のままです。
 ・SW_SHOWNA.....ウィンドウを現在の状態で表示します。アクティブ ウィンドウはアクティブな状態のままです。
 ・SW_SHOWNOACTIVATE.....直前のサイズと位置でウィンドウを表示します。アクティブ ウィンドウはアクティブな状態のままです。
 ・SW_SHOWNORMAL.....ウィンドウをアクティブ化して表示します。ウィンドウがアイコン化されていたり最大化されているときには、 Windowsが元のサイズと位置に復元します。アプリケーションは、 最初にウィンドウを表示するときにこのフラグを指定します。

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SetShowCmd(iShowCmd: Integer)

ェルリンクオブジェクトに対してShowコマンドを設定します。これにより、オブジェクト起動時の状態が設定されます。
{ パラメータ }
iShowCmd:Showコマンド(GetShowCmd参照)

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetIconLocation(pszIconPath: PAnsiChar; cchIconPath: Integer; out piIcon: Integer)

ェルリンクオブジェクトに対するアイコンのパス、インデックスを返します。
{ パラメータ }
pszIconPath:アイコンを含むファイルのパスが返されるバッファへのポインタ
cchIconPath:バッファの最大サイズ
piIcon:アイコンのインデックス

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SetIconLocation(pszIconPath: PAnsiChar; iIcon: Integer)

ェルリンクオブジェクトに対するアイコンのパス、インデックスを設定します。
{ パラメータ }
pszIconPath:アイコンを含むファイルのパスへのポインタ
iIcon:アイコンのインデックス

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SetRelativePath(pszPathRel: PAnsiChar; dwReserved: DWORD)

ェルリンクオブジェクトへの相対パスを設定します。
{ パラメータ }
pszPathRel:新しい相対パスへのポインタ
dwReserved:オブジェクトを識別するアイテムIDリスト(TItemIDList構造体

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


Resolve(Wnd: HWND; fFlags: DWORD)

ェルリンクを解決します。システムはシェルリンクオブジェクトを探し、必要があればそのパスとアイテムIDリスト(TItemIDList構造体)を更新します。
のメソッドが呼ばれると、システムは現在のリンクオブジェクトに関連付けられたパスを返し、そのパスにあるオブジェクトを探します。システムがオブジェクトを見つけるとリンクを解決しますが、もしオブジェクトが見つからなければ、同じディレクトリのファイル名が違うが生成日時と属性が同じファイルを探します。
れでも見つからなければ、サブディレクトリに対しても再帰的に同様の動作をします。
終的にオブジェクトが見つからなければ、ユーザーにオブジェクトの位置を指定させるダイアログボックスを表示します。アプリケーションではSLR_NO_UIフラグによりこのダイアログボックスを非表示にすることが出来ます。
{ パラメータ }
Wnd::最終的にシェルリンクの解決に失敗した場合に表示するダイアログボックスの親ウィンドウとして使用するウィンドウハンドル
fFlags:以下に示すフラグの組合せ
 ・SLR_ANY_MATCH.....リンクを解決し、ユーザーからの情報が必要な場合にはダイアログボックスを表示する
 ・SLR_NO_UI.....ユーザーからの情報が必要な場合でもダイアログボックスを表示しない(このフラグが指定された場合、fFlagsの上位ワードはタイムアウトまでの時間をミリ秒単位で指定します。これがゼロの時は、デフォルトとして3秒がタイムアウト時間となります。タイムアウト時間中にオブジェクトが見つからなかった場合、そのまま関数から帰ります。)
 ・SLR_UPDATE.....リンクオブジェクトが変更されていた場合、リンクへのパスとアイテムIDリストを更新します

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SetPath(pszFile: PAnsiChar)

ェルリンクオブジェクトのパスとファイル名を設定します。
{ パラメータ }
pszFile:新しいパスへのポインタ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

2.2.8 IShellExecuteHookインターフェイス

ShellExecute、ShellExecuteExの動作を拡張するインターフェイスです。

下に IShellExecuteHookインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_IShellExecuteHookA = '{000214F5-0000-0000-C000-000000000046}';

IShellExecuteHookA = interface(IUnknown)
  [SID_IShellExecuteHookA]
  function Execute(var ShellExecuteInfo: TShellExecuteInfo): HResult; stdcall;
end;

IShellExecuteHook = IShellExecuteHookA;


[メンバー関数](全1関数)


Execute(var ShellExecuteInfo: TShellExecuteInfo)

マンドを横取りし、別の動作をさせるフックを提供します。
{ パラメータ }
ShellExecuteInfo:ShellExecuteEx関数に渡すTShellExecuteInfo構造体

{ 返値 }

 フックが実装されていればNOERRORを、実装されていなければS_FALSEが返されます。これら以外のエラーの場合はOLEで定義されたエラーコードを返します。

2.2.9 ICopyHookインターフェイス

ピーフックは、シェルを通してファイルシステムがディレクトリもしくはプリンターオブジェクトをコピー、移動、削除、リネームしようとする場合に呼出されます。
れはシェルの操作前に呼出されるので、その操作を不実行、キャンセルすることが出来ます。
た、一つのフォルダに対して複数のコピーフックを設定することが出来ます。
お、シェルはコピーフックを直接初期化しますので、IShellExtInitインターフェイス等は必要ありません。

下に ICopyHookインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_IShellCopyHookA = '{000214EF-0000-0000-C000-000000000046}';

ICopyHookA = interface(IUnknown)
  [SID_IShellCopyHookA]
  function CopyCallback(Wnd: HWND; wFunc, wFlags: UINT; pszSrcFile: PAnsiChar;
    dwSrcAttribs: DWORD; pszDestFile: PAnsiChar; dwDestAttribs: DWORD): UINT; stdcall;
end;

ICopyHook = ICopyHookA;


[メンバー関数](全1関数)


CopyCallback(Wnd: HWND; wFunc, wFlags: UINT; pszSrcFile: PAnsiChar; dwSrcAttribs: DWORD; pszDestFile: PAnsiChar; dwDestAttribs: DWORD)

ェルによるディレクトリもしくはプリンタオブジェクトのコピー、移動、削除、リネーム操作の可否を返します。
{ パラメータ }
Wnd:ユーザーインターフェイスを表示する必要がある場合のその親ウィンドウのハンドル
wFunc:操作の種類(以下のどれか1つ)
 ・FO_COPY.....pszSrcFileのファイルをpszDestFileの位置へコピー
 ・FO_DELETE.....pszSrcFileのファイルを削除
 ・FO_MOVE.....pszSrcFileのファイルをpszDestFileの位置へ移動
 ・FO_RENAME.....pszSrcFileのファイルをリネーム
 ・PO_DELETE.....pszSrcFileのプリンタを削除
 ・PO_PORTCHANGE.....プリンタポートを変更(pszSrcFile及びpszDestFileは2重ヌル終端文字列で、プリンタ名に続いてポート名が含まれている)
 ・PO_RENAME.....pszSrcFileのプリンタをリネーム
 ・PO_REN_PORT.....PO_RENAME + PO_PORTCHANGE
wFlags:操作をコントロールする以下のフラグの組合せ
 ・FOF_ALLOWUNDO.....可能であればアンドゥを可能にする
 ・FOF_CONFIRMMOUSE.....未実装
 ・FOF_FILESONLY.....未実装
 ・FOF_MULTIDESTFILES.....コピーフックハンドラはこの値を無視する
 ・FOF_NOCONFIRMATION.....ダイアログボックスに「全てはい」を返す
 ・FOF_NOCONFIRMMKDIR.....ディレクトリの新規作成をユーザーに確かめない
 ・FOF_RENAMEONCOLLISION.....ファイル名の同じものが既に存在する場合、「~のコピー」といった新しい名称にする
 ・FOF_SILENT.....ユーザーに対するダイアログボックスを表示しない
 ・FOF_SIMPLEPROGRESS.....プログレスダイアログボックスを表示する(ただしファイル名は表示しない)
pszSrcFile:ソースファイル名へのポインタ
dwSrcAttribs:ソースファイルに関する以下に示す属性の組合せ
 ・FILE_ATTRIBUTE_ARCHIVE.....アーカイブファイル(アプリケーションはこのフラグをバックアップファイルや削除ファイルに対して付与します)
 ・FILE_ATTRIBUTE_COMPRESSED.....圧縮ファイル(圧縮フォルダ)
 ・FILE_ATTRIBUTE_DIRECTORY.....ディレクトリ
 ・FILE_ATTRIBUTE_HIDDEN.....隠しファイル
 ・FILE_ATTRIBUTE_NORMAL.....属性無し(このフラグは単独で使用される)
 ・FILE_ATTRIBUTE_OFFLINE.....ファイルのデータをすぐには利用できない(ファイルがデータがオフラインストレージに物理的に移動されたことを示す)
 ・FILE_ATTRIBUTE_READONLY.....読込み専用
 ・FILE_ATTRIBUTE_SYSTEM.....システムファイル(OSの一部かあるいはOSにより排他的に使用されるファイル)
 ・FILE_ATTRIBUTE_TEMPORARY.....テンポラリファイル(メディアにフラッシュされない限りデータのほとんどがメモリ上に存在する)
pszDestFile:デスティネイションファイル名へのポインタ
dwDestAttribs:デスティネイションファイルに関する属性(dwSrcAttribs参照)

{ 返値 }

 シェルによる操作の可否を返します。(以下のどれか1つ)
 ・IDYES.....操作を許可
 ・IDNO.....操作を不許可(ただし、続く別の操作は続行)
 ・IDCANCEL.....操作をキャンセル

2.2.10 IFileViewerSiteインターフェイス

のインターフェイスはファイルビューワが現在のピンドウィンドウのハンドルを返したり新しいピンドウィンドウをセットしたり出来るようにするインターフェイスです。ピンドウィンドウとは現在のファイルビューワがファイルを表示しているウィンドウのことです。
ーザーが新しいファイルを表示させようとする時、シェルは新しいウィンドウを生成するのではなくピンドウィンドウに新しいファイルを表示させます。

下に IFileViewerSiteインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_IFileViewerSite = '{000214F3-0000-0000-C000-000000000046}';

IFileViewerSite = interface(IUnknown)
  [SID_IFileViewerSite]
  function SetPinnedWindow(Wnd: HWND): HResult; stdcall;
  function GetPinnedWindow(var Wnd: HWND): HResult; stdcall;
end;


[メンバー関数](全2関数)


SetPinnedWindow(Wnd: HWND)

しいピンドウィンドウをセットします。
れによりユーザーが新しいファイルを表示しようとする際、シェルは新しいウィンドウを生成するのではなくピンドウィンドウ内にそのファイルを表示します。
{ パラメータ }
Wnd:新しいピンドウィンドウのハンドル(ピンドウィンドウが存在していない時はヌル)

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetPinnedWindow(var Wnd: HWND)

し存在すれば現在のピンドウィンドウのハンドルを返します。
{ パラメータ }
Wnd:現在のピンドウィンドウのハンドル(ピンドウィンドウが存在しない時はヌル)

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

2.2.11 IFileViewerインターフェイス

ァイルを表示、印刷しなければならない場合に、そのファイルタイプに登録されたファイルビューワにそのことを通知するインターフェイスです。
ェルは、ユーザーがファイルのコンテキストメニューから「クイックビューワ」を選択し、そのファイルタイプがファイルビューワに認識されるものである場合にこのインターフェイスを呼出します。

下に IFileViewerインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_IFileViewerA = '{000214F0-0000-0000-C000-000000000046}';

IFileViewerA = interface(IUnknown)
  [SID_IFileViewerA]
  function ShowInitialize(fsi: IFileViewerSite): HResult; stdcall;
  function Show(var pvsi: TFVShowInfo): HResult; stdcall;
  function PrintTo(pszDriver: PAnsiChar; fSuppressUI: BOOL): HResult; stdcall;
end;

IFileViewer = IFileViewerA;


[メンバー関数](全3関数)


ShowInitialize(fsi: IFileViewerSite)

ァイルビューワがファイルを表示できるかどうか決定し、もし表示できるのであればぞの表示前に初期化作業を行います。
ェルはIFileViewer.Showに先立ってこのインターフェイスを呼出します。また、シェルは表示するファイルのファイル名をファイルビューワのIPersistFile.Loadを呼出して特定します。
の関数ですべての必要な操作をしておくことで、IFileViewer.Showが成功するようにしなければなりません。
{ パラメータ }
fsi:ファイルビューワが現在のピンドウィンドウもしくは新しいピンドウィンドウを得るためのIFileViewerSiteインターフェイス

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


Show(var pvsi: TFVShowInfo)

ァイルを表示します。
ェルはIPersistFile.Loadを呼出して表示するファイル名を得ます。
{ パラメータ }
pvsi:ファイルビューワがファイルの表示に使用する情報が格納されたTFVShowInfo構造体(ファイルビューワはこの構造体のメンバーを修正してシェルに返すことが出来る)

{ 返値 }

 関数が成功すればNOERRORを返します。IFileViewer.ShowInitialize関数があらかじめ呼出されていない場合はE_UNEXPECTEDを返します。

ミニ解説: TFVShowInfo構造体

ァイルビューワがファイルを表示する際使用する情報を格納した構造体です。

TFVShowInfo = packed record
{ Stuff passed into viewer (in) }
  cbSize: DWORD; { Size of structure for future expansion... }
  hwndOwner: HWND; { who is the owner window. }
  iShow: Integer; { The show command }

{ Passed in and updated (in/Out) }
  dwFlags: DWORD; { flags }
  rect: TRECT; { Where to create the window may have defaults }
  punkRel: IUNKNOWN; { Relese this interface when window is visible }

{ Stuff that might be returned from viewer (out) }
  strNewFile: array[0..MAX_PATH-1] of TOleChar; { New File to view. }
end;

[メンバー]
cbSize.....構造体のサイズ
hwndOwner.....ファイル表示に生成するウィンドウのオーナーウィンドウハンドル
iShow.....Showコマンド(以下のどれか1つ)
・SW_SHOWDEFAULT---アプリケーションを起動させたプログラムによってCreateProcess関数に渡されたTStartupInfo構造体に指定された、 SW_フラグを基にして表示状態を設定します。アプリケーションはこのフラグとともにShowWindowを呼び出して、 自身のメイン ウィンドウの初期表示状態を設定しなければなりません。
・SW_HIDE---ウィンドウを非表示にし、 ほかのウィンドウをアクティブ化します。
・SW_MINIMIZE---指定されたウィンドウをアイコン化し、 Z順序で次のトップ レベル ウィンドウをアクティブ化します。
・SW_RESTORE---ウィンドウをアクティブ化して表示します。ウィンドウがアイコン化されていたり最大化されているときには、 Windowsが元のサイズと位置に復元します。アプリケーションは、 アイコン化されているウィンドウを復元ときにこのフラグを指定します。
・SW_SHOW---ウィンドウをアクティブ化し、 現在のサイズと位置で表示します。
・SW_SHOWMAXIMIZED---ウィンドウをアクティブ化し、 最大表示ウィンドウとして表示します。
・SW_SHOWMINIMIZED---ウィンドウをアクティブ化し、 アイコン表示します。
・SW_SHOWMINNOACTIVE---ウィンドウをアイコン表示します。アクティブ ウィンドウはアクティブな状態のままです。
・SW_SHOWNA---ウィンドウを現在の状態で表示します。アクティブ ウィンドウはアクティブな状態のままです。
・SW_SHOWNOACTIVATE---直前のサイズと位置でウィンドウを表示します。アクティブ ウィンドウはアクティブな状態のままです。
・SW_SHOWNORMAL---ウィンドウをアクティブ化して表示します。ウィンドウがアイコン化されていたり最大化されているときには、 Windowsが元のサイズと位置に復元します。アプリケーションは、 最初にウィンドウを表示するときにこのフラグを指定します。
dwFlags.....表示情報フラグ(以下のフラグの組合せ)
・FVSIF_CANVIEWIT---ファイルビューワはファイルを表示可能
・FVSIF_NEWFAILED---ファイルビューワは新しいファイルの表示を指定されたが、そのファイルを表示できるビューワがない(ファイルビューワは以前のファイルを切断するか表示し続けるかしなくてはならない)
・FVSIF_NEWFILE---ファイルビューワウィンドウにファイルがドロップされた(ファイルビューワはstrNewFileにそのファイル名をコピーしてシェルに返し、シェルはそのファイルビューワを読込む)
・FVSIF_PINNED---ピンドウィンドウが存在する(ファイルビューワはそのピンドウィンドウを使用するか新しいピンドウィンドウを使用しなければならない)
・FVSIF_RECT---rectが使用可(有効なデータを保持している)
rect.....ファイルビューワウィンドウのサイズと位置を指定しているTRect構造体
punkRel.....ファイルビューワウィンドウにファイルがドロップされた場合に、新しいファイルビューワが古いファイルビューワを開放するために使用されるIUnknownインターフェイス
strNewFile.....ファイルビューワウィンドウにファイルがドロップされた場合のそのファイル名


PrintTo(pszDriver: PAnsiChar; fSuppressUI: BOOL)

ァイルを印刷します。
ェルはIPersistFile.Loadを呼出して表示するファイル名を得ます。
{ パラメータ }
pszDriver:ファイルを印刷するプリンタデバイスドライバ名へのポインタ(ヌルの場合、ファイルビューワがデバイスドライバを決定する)
fSuppressUI::抑制フラグ(TRUEの場合、印刷中にエラーメッセージも含めてダイアログボックス等を表示しない)

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

2.2.12 IShellBrowserインターフェイス

IShellBrowserインターフェイスは拡張名前空間の各種サービスを供給するインターフェイスで、拡張名前空間により実装されたIShellViewインターフェイスと対を成すものです。
のインターフェイスはパーシステントビューを保存するためにストレージにアクセスする方法も拡張します。
IShellBrowserインターフェイスはコンテナのトップレベルウィンドウを表し、含まれるビューのメニューを複合メニューに挿入し、その複合メニューを適当なウィンドウにインストールしたり複合メニューからコンテナのメニューを削除したりします。インプレースオブジェクトのステータステキストを設定・表示することも出来、コンテナフレーム用のアクセラレータキーを解釈します。
通このインターフェイスを直接実装してはいけません。IShellBrowserはエクスプローラ及びファイルを開くダイアログボックスによって実装されているためです。
張名前空間(特にIShellView)を実装している時はエクスプローラとやり取りを行うためにIShellBrowser.CreateViewWindowを使用します。

下に IShellBrowserインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。

[ 継承 ]

 アプリケーションがインプレースに動作するウィンドウのハンドルを取得したり状況感知ヘルプモードから出入りすることを可能にするインターフェイス IOleWindowインターフェイス( In Delphi, ActiveX.pas. In C++, ActiveX.hにて宣言)を継承しています。
 インプレースなオブジェクト、コンテナは全てIOleWindowインターフェイスを実装しなければなりません。

const SID_IShellBrowser = '{000214E2-0000-0000-C000-000000000046}';

IShellBrowser = interface(IOleWindow)
  [SID_IShellBrowser]
  function InsertMenusSB(hMenuShared: HMENU;
    out MenuWidths: TOleMenuGroupWidths): HResult; stdcall;
  function SetMenuSB(hMenuShared: HMENU;
    hOleMenuReserved: HOLEMENU; hwndActiveObject: HWND): HResult; stdcall;
  function RemoveMenusSB(hMenuShared: HMENU): HResult; stdcall;
  function SetStatusTextSB(StatusText: POleStr): HResult; stdcall;
  function EnableModelessSB(Enable: BOOL): HResult; stdcall;
  function TranslateAcceleratorSB(Msg: PMsg; ID: Word): HResult; stdcall;
  function BrowseObject(pidl: PItemIDList; flags: UINT): HResult; stdcall;
  function GetViewStateStream(Mode: DWORD; out Stream: IStream): HResult; stdcall;
  function GetControlWindow(ID: UINT; out Wnd: HWND): HResult; stdcall;
  function SendControlMsg(ID, Msg: UINT; wParm: WPARAM; lParm: LPARAM;
    Result: LResult): HResult; stdcall;
  function QueryActiveShellView(var ShellView: IShellView): HResult; stdcall;
  function OnViewWindowActive(var ShellView: IShellView): HResult; stdcall;
  function SetToolbarItems(TBButton: PTBButton;
    nButtons, uFlags: UINT): HResult; stdcall;
end;


In ActiveX.pas

IOleWindow = interface(IUnknown)
  ['{00000114-0000-0000-C000-000000000046}']
  function GetWindow(out wnd: HWnd): HResult; stdcall;
  function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;
end;



[メンバー関数](全15関数)


InsertMenusSB(hMenuShared: HMENU; out MenuWidths: TOleMenuGroupWidths)

クスプローラで、拡張名前空間を表示・使用している間、表示されている複合メニューにメニューグループを挿入します。
のメソッドは、拡張名前空間が最初に起動される際呼出され、フレームレベルのユーザーインターフェイスにメニューを挿入します。
「ファイル、編集、表示、ツール、ヘルプ」プルダウンメニューのIDはそれぞれ「FCIDM_MENU_FILE /EDIT /VIEW /TOOLS /HELP」です。ビューはこれらのサブメニューに独自のIDを用いてメニュー項目を挿入出来ます。これら挿入メニューに対するコマンドIDは必ず FCIDM_SHVIEWFIRST 以上 FCIDM_SHVIEWLAST以下でなければなりません。
{ パラメータ }
hMenuShared(in)::空のメニューのハンドル
MenuWidths(out):インプレース動作中のコンテナとオブジェクトサーバー間で共有される6つの共有メニューグループのそれぞれに含まれるメニュー項目の数が格納されているTOleMenuGroupWidths構造体

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

ミニ解説: TOleMenuGroupWidths構造体

TOleMenuGroupWidths構造体には、インプレース動作中のコンテナとオブジェクトサーバー間で共有される6つの共有メニューグループのそれぞれに含まれるメニュー項目の数が格納されています。

TOleMenuGroupWidths = record
  width: array[0..5] of Longint;
end;

[メンバー]
width.....インプレース動作中のコンテナとオブジェクトサーバー間で共有される6つの共有メニューグループのそれぞれに含まれるメニュー項目の数
(コンテナはインデックスが0,2,4の「ファイル」「表示」「ウィンドウ」メニューグループを使用し、オブジェクトサーバーはインデックスが1,3,5の「編集」「ツール」「ヘルプ」メニューグループを使用します。)


SetMenuSB(hMenuShared: HMENU; hOleMenuReserved: HOLEMENU; hwndActiveObject: HWND)

合メニューをインストールします。
クスプローラはビューがフォーカスを持っているかどうかで異なるメニュー項目のセットを追加します。したがって、ビューウィンドウがフォーカスを持っている時はいつでもIShellBrowser.OnViewWindowActivateを呼出す必要があります。
{ パラメータ }
hMenuShared:複合メニューのハンドル
hOleMenuReserved:予約済
hwndActiveObject:? ? ?

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


RemoveMenusSB(hMenuShared: HMENU)

ンテナに、インプレース複合メニューから自身のメニュー要素を取除かせ全ての関連するリソースを開放させます。
{ パラメータ }
hMenuShared:インプレース複合メニューのハンドル

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SetStatusTextSB(StatusText: POleStr)

ンテナのフレームウィンドウステータスラインにインプレースオブジェクトに関するステータステキストを設定・表示します。
{ パラメータ }
StatusText:表示するメッセージへのポインタ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


EnableModelessSB(Enable: BOOL)

クスプローラにモードレスダイアログボックスの使用可否を通知します。
在、エクスプローラはモードレスダイアログボックスを持っていませんが、それでもビューはエクスプローラウィンドウに関連するモードレスダイアログボックスを使用可能・不可能にしたい場合このメソッドを適切に呼出します。
{ パラメータ }
Enable:TRUEの時、モードレスダイアログボックスは使用可能

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


TranslateAcceleratorSB(Msg: PMsg; ID: Word)

のメソッドは現在のところエクスプローラでは使用されていません。
{ パラメータ }
Msg:キーストロークメッセージを含むTMsg構造体へのポインタ
ID:コンテナが供給するアクセラレータテーブル内のキーストロークに関係するコマンドID

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


BrowseObject(pidl: PItemIDList; flags: UINT)

ューがシェルに別のホルダを表示するよう指示する際呼出します。
{ パラメータ }
pidl(in):オブジェクトの位置を特定するアイテムIDリストへのポインタ(解釈はwFlagsに依存)
flags(in):表示するフォルダを特定するフラグ(ゼロもしくは以下のフラグの組合せ)
別のウィンドウの生成に関するフラグ
 ・SBSP_SAMEBROWSER.....同じエクスプローラウィンドウを使用
 ・SBSP_NEWBROWSER.....別のウィンドウを生成し使用
 ・SBSP_DEFBROWSER.....ユーザーが指定したデフォルトの設定にて表示(出来るだけこの設定を使用するべき)
表示するウィンドウモードに関するフラグ(ただし、SBSP_SAMEBROWSER or (SBSP_DEFBROWSER && (single window browser || explorer))の場合これらのフラグは無視される)
 ・SBSP_OPENMODE.....通常のフォルダウィンドウ
 ・SBSP_EXPLOREMODE.....エクスプローラウィンドウ
 ・SBSP_DEFMODE.....現在のウィンドウと同じタイプのウィンドウ
pidlパラメータの分類に関するフラグ
 ・SBSP_ABSOLUTE.....絶対pidl(デスクトップからの相対位置)
 ・SBSP_RELATIVE.....相対pidl(現在のホルダからの相対位置)
 ・SBSP_PARENT.....親ホルダを表示(pidlは無視)

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetViewStateStream(Mode: DWORD; out Stream: IStream)

ラウザは、指定されたビューの状態情報(Mode)に対するIStreamインターフェイスを返します。
{ パラメータ }
Mode(in):読み書き特権を指定するSTGM列挙型のフラグ(STGM_READ、STGM_WRITE、STGM_READWRITEのいずれか)
Stream(out):Modeの状態を持つIStreamインターフェイス

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

ミニ解説: STGM構造体

STGM列挙型はオブジェクトの生成・破棄やオブジェクトアクセスの方法を指定するためにIStorage、IStreamインターフェイスにて使用されるフラグ群です。
れらのフラグは以下の各グループから組み合わせることが出来ますが、それぞれのグループからは1つしか選べません。

[定義済列挙メンバー]

STGM_DIRECT.....ダイレクトモード(ストレージに対する変更はすぐに行われる)
STGM_TRANSACTED.....トランザクトモード
(変更は明示的にコミットしなければ行われず、変更無視はIStream、IStorageインターフェイスのRevertメソッドで行われる)
STGM_SIMPLE.....STGM_CREATE or STGM_READWRITE or STGM_SHARE_EXCLUSIVE

STGM_READ.....読込み専用
STGM_WRITE.....書き込み専用
STGM_READWRITE.....STGM_READ or STGM_WRITE

STGM_SHARE_DENY_NONE.....読込み書き込み共、共有可能
STGM_SHARE_DENY_READ.....STGM_READモードでの共有不可
STGM_SHARE_DENY_WRITE.....STGM_WRITEモードでの共有不可
STGM_SHARE_EXCLUSIVE.....STGM_SHARE_DENY_READ or STGM_SHARE_DENY_WRITE

STGM_PRIORITY.....ストレージを最も新しくコミットされたバージョンへの排他的アクセスで開く
(したがって、他のユーザーはその間ストレージに対してコミットすることが出来ない。STGM_DIRECT or STGM_READを設定しておかなくてはならない。)

STGM_DELETEONRELEASE.....ルートストレージが破棄された時に自動的に破棄

STGM_CREATE.....既存のストレージやストリームを破棄し、新しいものに置換える(同名のストリームがある場合などに使用)
STGM_CONVERT.....CONTENTSと命名されたストリームに既存のデータを保存し新しいオブジェクトを生成する
STGM_FAILIFTHERE.....同名のオブジェクトが存在した場合、オブジェクトの生成に失敗する
STGM_NOSCRATCH.....(Win95のみ)トランザクトモードにおいて、スクラッチファイルがコミット前に保存されるようになる。
(元のファイルの不使用領域がスクラッチスペースとして使用される)


GetControlWindow(ID: UINT; out Wnd: HWND)

クスプローラのツールバー、ステータスバー、ツリーのウィンドウハンドルを返します。これによりシェルビューは、ツールバー、ステータスバー、ツリーを直接操作出来るようになります。
だし、それらにメッセージを送る際はIShellBrowser.SendControlMsgを使用しなければなりません。
{ パラメータ }
ID:ハンドルを得たいものを示すフラグ(ツールバーの場合はFCW_TOOLBAR、ステータスバーの場合はFCW_STATUS、ツリーの場合はFCW_TREE)
Wnd:IDで指定したウィンドウのハンドル

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SendControlMsg(ID, Msg: UINT; wParm: WPARAM; lParm: LPARAM; Result: LResult)

クスプローラのツールバー、ステータスバーに対してメッセージを送ります。送られるメッセージの種類についてはCommctrl.pasを参照して下さい。
{ パラメータ }
ID(in):メッセージの送り先がツールバーの場合はFCW_TOOLBAR、ステータスバーの場合はFCW_STATUS
Msg(in):コントロールに送られるメッセージ
wParm(in):メッセージのwParam
lParm(in):メッセージのlParam
Result(out):メッセージに対する返値へのポインタ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


QueryActiveShellView(var ShellView: IShellView)

在アクティブなシェルビューを返します。
{ パラメータ }
ShellView(out):現在アクティブなシェルビュー(IShellViewインターフェイス

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


OnViewWindowActive(var ShellView: IShellView)

ューウィンドウ(あるいはその子ウィンドウ)がフォーカスを得た時、シェルビューウィンドウがこの関数を呼出します。
ェルビューウィンドウは、IShellBrowser.InsertMenusSBを呼出す前にこの関数を呼出さなくてはなりません。InsertMenuSBは、ビューがフォーカスを持っているかどうかで異なるメニュー項目を挿入してしまうためです。
{ パラメータ }
ShellView:現在アクティブなシェルビュー(IShellViewインターフェイス

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SetToolbarItems(TBButton: PTBButton; nButtons, uFlags: UINT)

クスプローラのツールバーにツールバーボタンを追加します。
{ パラメータ }
TBButton:ツールバーのボタンを指定するTTBButton構造体の配列へのポインタ
nButtons:ツールバーのボタン数
uFlags:ツールバーボタンの追加位置(以下のどれか1つ)
 ・FCT_ADDTOEND.....ツールバーの右側に追加する
 ・FCT_CONFIGABLE.....実装されていない
 ・FCT_MERGE.....ボタンの全てを入替えるのではなくて、マージする

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

ミニ解説: TTBButton構造体

ールバーのボタンに関する情報を格納した構造体です。

TTBButton = packed record
  iBitmap: Integer;
  idCommand: Integer;
  fsState: Byte;
  fsStyle: Byte;
  bReserved: array[1..2] of Byte;
  dwData: Longint;
  iString: Integer;
end;

[メンバー]
iBitmap.....ボタンのゼロベースインデックス
idCommand.....ボタンのコマンドID(fsStyleがTBSTYLE_SEPであればゼロ)
fsState.....ボタンの状態を指定する以下のフラグの組合せ
 ・TBSTATE_CHECKED---fsStyleにTBSTYLE_CHECKEDが含まれていて、押された状態
 ・TBSTATE_ENABLED---使用可能
 ・TBSTATE_HIDDEN---隠れている(使用も不可能)
 ・TBSTATE_INDETERMINATE---使用不可(灰色表示)
 ・TBSTATE_PRESSED---押されている
 ・TBSTATE_WRAP---このボタンの次で折り返す
fsStyle.....ボタンのスタイルを指定する以下のフラグの組合せ
 ・TBSTYLE_BUTTON---標準のボタン
 ・TBSTYLE_CHECK---トグルする標準ボタン
 ・TBSTYLE_GROUP---グループに属する別のボタンを押すまでトグルする標準ボタン
 ・TBSTYLE_CHECKGROUP---グループに属する別のボタンを押すまでトグルする標準ボタン
 ・TBSTYLE_SEP---セパレータ
bReserved.....予約済
dwData.....アプリケーションが使用出来る任意の値
iString.....ボタン文字列のゼロベースインデックス


GetWindow(out wnd: HWnd)

ンプレースに動作するウィンドウのハンドルを返します。
{ パラメータ }
wnd(out):ウィンドウハンドル

{ 返値 }

 以下のいずれかの値を返します。
 ・S_OK.....成功
 ・E_FAIL.....失敗
 ・E_INVALIDARG.....引数が間違っている
 ・E_UNEXPECTED.....原因不明のエラー
 ・E_OUTOFMEMORY.....メモリ不足エラー


ContextSensitiveHelp(fEnterMode: BOOL)

ンプレース動作中に状況感知ヘルプモードに入るかどうかを指定します。
{ パラメータ }
fEnterMode(in):TRUEの時、状況感知ヘルプモード

{ 返値 }

 以下のいずれかの値を返します。
 ・S_OK.....成功
 ・E_FAIL.....失敗
 ・E_INVALIDARG.....引数が間違っている
 ・E_UNEXPECTED.....原因不明のエラー
 ・E_OUTOFMEMORY.....メモリ不足エラー

2.2.13 ICommDlgBrowserインターフェイス

ICommDlgBrowserインターフェイスは、IShellViewの振舞いを拡張するためコモンダイアログボックスに使用されるインターフェイスです。
のインターフェイスはコモンダイアログボックスによってのみ実装されます。

下に ICommDlgBrowserインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_ICommDlgBrowser = '{000214F1-0000-0000-C000-000000000046}';

ICommDlgBrowser = interface(IUnknown)
  [SID_ICommDlgBrowser]
  function OnDefaultCommand(var ShellView: IShellView): HResult; stdcall;
  function OnStateChange(var ShellView: IShellView; Change: ULONG): HResult; stdcall;
  function IncludeObject(var ShellView: IShellView; pidl: PItemIDList): HResult; stdcall;
end;


[メンバー関数](全3関数)


OnDefaultCommand(var ShellView: IShellView)

ーザーがビューにおいてダブルクリックするかエンターキーを押した際に呼出されます。
ラウザは、自身でアクションを処理する場合はS_OKを、ビューにデフォルトアクションをさせる場合はS_FALSEを返さなくてはなりません。
{ パラメータ }
ShellView:ダブルクリックされた(あるいはエンターキーを押された)ビュー(IShellViewインターフェイス

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


OnStateChange(var ShellView: IShellView; Change: ULONG)

ューに変化が起った直後に呼出されます。典型的には、コモンダイアログボックスにその変化に応じた対応をさせるために使用します。
ューのアイテムが選択された時やフォーカスを失った時は、コモンダイアログボックスにそのことを通知するためこのメンバーを呼出さなくてはなりません。
{ パラメータ }
ShellView:変化が起ったビュー(IShellViewインターフェイス
Change:変化の内容を示すフラグ(以下のいずれか1つ)
 ・CDBOSC_SETFOCUS.....ビューにフォーカスが設定された
 ・CDBOSC_KILLFOCUS.....ビューがフォーカスを失った
 ・CDBOSC_SELCHANGE.....選択に変更があった
 ・CDBOSC_RENAME.....アイテムがリネームされた

{ 返値 }

 無し


IncludeObject(var ShellView: IShellView; pidl: PItemIDList)

ューが自身のオブジェクトを列挙する際に呼出されます。ビューにオブジェクトを含める(表示する)場合にはS_OKを、含めない場合にはS_FALSEを返します。
{ パラメータ }
ShellView::対象となっているビュー(IShellViewインターフェイス
pidl:フォルダからの相対アイテムIDリスト(TItemIDList構造体)へのポインタ

{ 返値 }

 ビューにオブジェクトを含める(表示する)場合にはS_OKを、含めない場合にはS_FALSEを返します。

2.2.14 IShellViewインターフェイス

IShellViewインターフェイスはエクスプローラやフォルダウィンドウでビューを提供するためのインターフェイスです。
のインターフェイスをエクスポーズするオブジェクトはIShellFolder.CreateViewObjectにより生成されます。
れによりビューとエクスプローラの最外部フレームウィンドウとの間の通信チャネルが提供されます。この通信はメッセージ、フレームウィンドウ・ドキュメントウィンドウの状態、メニューやツールバー要素のマージを変換する必要があります。
IShellViewインターフェイスは、エクスプローラの名前空間に表示される必要のある拡張名前空間により実装され、シェルビューのエクスプローラウィンドウから利用されます。

下に IShellViewインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。

[ 継承 ]

 アプリケーションがインプレースに動作するウィンドウのハンドルを取得したり状況感知ヘルプモードから出入りすることを可能にするインターフェイス IOleWindowインターフェイス( In Delphi, ActiveX.pas. In C++, ActiveX.hにて宣言)を継承しています。
 インプレースなオブジェクト、コンテナは全てIOleWindowインターフェイスを実装しなければなりません。
 IOleWindowのメンバー関数に関しては IShellBrowserインターフェイスを参照して下さい。

const SID_IShellView = '{000214E3-0000-0000-C000-000000000046}';

IShellView = interface(IOleWindow)
  [SID_IShellView]
  function TranslateAccelerator(var Msg: TMsg): HResult; stdcall;
  function EnableModeless(Enable: Boolean): HResult; stdcall;
  function UIActivate(State: UINT): HResult; stdcall;
  function Refresh: HResult; stdcall;
  function CreateViewWindow(PrevView: IShellView;
    var FolderSettings: TFolderSettings; ShellBrowser: IShellBrowser;
    var Rect: TRect; out Wnd: HWND): HResult; stdcall;
  function DestroyViewWindow: HResult; stdcall;
  function GetCurrentInfo(out FolderSettings: TFolderSettings): HResult; stdcall;
  function AddPropertySheetPages(Reseved: DWORD;
    lpfnAddPage: TFNAddPropSheetPage; lParam: LPARAM): HResult; stdcall;
  function SaveViewState: HResult; stdcall;
  function SelectItem(pidl: PItemIDList; flags: UINT): HResult; stdcall;
  function GetItemObject(Item: UINT; iid: TIID; IPtr: Pointer): HResult; stdcall;
end;


[メンバー関数](全11関数)


TranslateAccelerator(var Msg: TMsg)

クスプローラに呼出され、コンテナのメッセージキューから取出したメッセージを処理します。
クスプローラはビューにフォーカスがある場合は自身のメッセージ変換を行う前にこの関数を呼出しますが、ビューにフォーカスがなければ先にエクスプローラのメッセージ変換を行い、それからこの関数を呼出します。
{ パラメータ }
Msg:取出したメッセージ(TMsg構造体)

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。
 メッセージがこの関数で処理されエクスプローラがさらにメッセージを変換したりディスパッチしたりしてはならない場合はS_OKを返します。
 エクスプローラによるメッセージ変換やディスパッチが必要な場合はS_FALSEを返します。


EnableModeless(Enable: Boolean)

ードレスダイアログボックスの使用の可否を決定します。
{ パラメータ }
Enable:Trueの時、モードレスダイアログボックス使用可能

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


UIActivate(State: UINT)

ェルビュー自身によって引起こされたのではないイベントによってビューウィンドウのアクティブな状態が変化した場合にエクスプローラにより呼出されます。
ブジェクトがIShellView2をサポートするまではStateにSVUIA_INPLACEACTIVATEを立ててはいけません。
ェルビューはこの関数内でフォーカスを変更するべきではありません。また、WM_KILLFOCUSをフックするべきでもありません。
ェルビューでは、典型的な方法としてWM_SETFOCUSをフックしIShellBrowser.OnViewWindowActivatedを呼出した後メニューを再マージします。
{ パラメータ }
State:ウィンドウの状態に関するフラグ(以下のいずれか1つ)
 ・SVUIA_DEACTIVATE.....エクスプローラはシェルビューウィンドウを破棄しようとしている(シェルビューはマージメニューやモードレスポップアップウィンドウ等を削除しなければならない)
 ・SVUIA_ACTIVATE_NOFOCUS.....シェルビューがフォーカスを失ったか、フォーカス無しで生成された(メニューをフォーカスの無い状態用に設定したりできる)
 ・SVUIA_ACTIVATE_FOCUS.....シェルビューがフォーカスを得たか、フォーカス有りで生成された(メニューをフォーカスのある状態用に設定したり出来る)
 ・SVUIA_INPLACEACTIVATE.....アクティブでないActiveX内でシェルビューが開かれた(シェルビューはメニューをマージしたりツールバーに要素を追加したりしてはならない)

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


Refresh: HResult

ーザーが f5キーを押すなどのイベントへの応答としてビューをリフレッシュ(最新の状態に更新)します。
{ パラメータ }
無し 

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


CreateViewWindow(PrevView: IShellView; var FolderSettings: TFolderSettings; ShellBrowser: IShellBrowser; var Rect: TRect; out Wnd: HWND)

ューウィンドウ(エクスプローラの右ペインやフォルダウィンドウのクライアントウィンドウ)を生成します。
出し側がすべてのリソースを開放しなければなりません。
{ パラメータ }
PrevView(in):Exitしたビューウィンドウ(ヌルも可)
FolderSettings(in):生成するビューの設定を格納したTFolderSettings構造体
ShellBrowser(in):現在のIShellBrowser(ビューはAddRefを呼出してエクスプローラウィンドウとの通信を保たせる)
Rect(in):ビューが生成される範囲に関するTRect構造体(クライアント座標)
Wnd(out):生成されたビューウィンドウのハンドル

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

ミニ解説: TFolderSettings構造体

TFolderSettings構造体は、あるフォルダビューから別のビューへ渡されるビューの設定に関する情報を格納する構造体です。
IShellView.GetCurrentInfoで現在の設定を得て、それをIShellView.CreateViewWindowに渡して次のフォルダビューに設定を継承させます。

TFolderSettings = packed record
  ViewMode: UINT;
  fFlags: UINT;
end;

[メンバー]
ViewMode.....ビューモードを特定する以下に示すフラグの組合せ
・FVM_ICON---大きいアイコン表示
・FVM_SMALLICON---小さいアイコン表示
・FVM_LIST---オブジェクト名をリストビューで表示
・FVM_DETAILS---オブジェクト名と複数の情報(更新日時等)を表示
fFlags.....オプションを特定する以下に示すフラグの組合せ
・FWF_AUTOARRANGE---要素を自動的に整列
・FWF_ABBREVIATEDNAMES---名前を短縮形にする(現在は不使用)
・FWF_SNAPTOGRID---項目をグリッド上で整列(現在は不使用)
・FWF_OWNERDATA---現在不使用
・FWF_BESTFITWINDOW---最適ウィンドウモード(ビューはウィンドウサイズを可能な限りコンテンツに適する大きさにする)
・FWF_DESKTOP---デスクトップ(デスクトップビューに対してのみ適用)
・FWF_SINGLESEL---複数項目の選択不可(コモンダイアログに対して適用)
・FWF_NOSUBFOLDERS---サブフォルダを非表示
・FWF_TRANSPARENT---透過的に表示(デスクトップに対してのみ適用)
・FWF_NOCLIENTEDGE---ホルダにWS_EX_CLIENTEDGEを加えない(デスクトップに対してのみ適用)
・FWF_NOSCROLL---スクロールバーを加えない(デスクトップに対してのみ適用)


DestroyViewWindow

ューウィンドウを破棄します。
{ パラメータ }
無し 

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetCurrentInfo(out FolderSettings: TFolderSettings)

在のフォルダの設定情報を返します。
{ パラメータ }
FolderSettings(out):現在のフォルダに関するTFolderSettings構造体

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


AddPropertySheetPages(Reseved: DWORD; lpfnAddPage: TFNAddPropSheetPage; lParam: LPARAM)

クスプローラで「オプション」が選択されプロパティシートが開く際にオプションプロパティシートを追加します。
{ パラメータ }
Reseved:予約済
lpfnAddPage:ページを追加する際に使用されるTFNAddPropSheetPage型のコールバック関数
lParam:コールバック関数に渡されるlParam

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SaveViewState

クスプローラはこの関数を呼出してシェルビューの状態設定を保存します。
IShellBrowser.GetViewStateStreamによりビューストリームを得て、そのストリームに状態設定を保存します。
{ パラメータ }
無し 

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


SelectItem(pidl: PItemIDList; flags: UINT)

ェルビューウィンドウ中の1つ以上の項目の選択状態を変更します。
pidlがヌルでflagsがSVSI_DESELECTOTHERSであれば全てのアイテムを非選択にします。
{ パラメータ }
pidl:アイテムIDリスト(TItemIDList構造体)へのポインタ
flags::適用する選択のタイプを指定するフラグ(以下のいずれか1つ)
 ・SVSI_DESELECT.....アイテムを非選択にする
 ・SVSI_DESELECTOTHERS.....pidlがヌルなら全てのアイテムを非選択にする
 ・SVSI_EDIT.....アイテムを編集モードにします
 ・SVSI_ENSUREVISIBLE.....アイテムがスクリーンに表示されるようにする
 ・SVSI_FOCUSED.....アイテムがフォーカスを得る
 ・SVSI_SELECT .....アイテムが選択される

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetItemObject(Item: UINT; iid: TIID; IPtr: Pointer)

ューに提供されているデータへのインターフェイスを返します。コモンダイアログがビューから選択項目を取得する際に使用します。
{ パラメータ }
Item(in):ビューのアスペクトを指定するフラグ(以下のいずれか1つ)
Item(in):ビューのアスペクトを指定するフラグ(以下のいずれか1つ)
 ・SVGIO_BACKGROUND.....ビューの背景を参照(ビューの背景のコンテキストメニューを得るためIID_IContextMenuと共に使用する)
 ・SVGIO_SELECTION.....現在選択されているアイテムを参照(選択されたアイテムを表すデータオブジェクトを得るためIID_IDataObjectと共に使用する)
 ・SVGIO_ALLVIEW.....SVGIO_SELECTIONに同じ(ただし全項目を選択)
iid(in):返すインターフェイスの識別子(IID)
IPtr(out):インターフェイスポインタ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

2.2.15 IEnumIDListインターフェイス

部にTItemIDList構造体の配列を持った列挙型インターフェイスです。

下に IEnumIDListインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_IEnumIDList = '{000214F2-0000-0000-C000-000000000046}';

IEnumIDList = interface(IUnknown)
  [SID_IEnumIDList]
  function Next(celt: ULONG; out rgelt: PItemIDList;
    var pceltFetched: ULONG): HResult; stdcall;
  function Skip(celt: ULONG): HResult; stdcall;
  function Reset: HResult; stdcall;
  function Clone(out ppenum: IEnumIDList): HResult; stdcall;
end;


[メンバー関数](全4関数)


Next(celt: Longint; out elt; pceltFetched: PLongint)

造体を現在のポインタからceltで指定した数だけ得ようとします。
eltに構造体の配列へのポインタが返されます。
{ パラメータ }
celt:問合わせる構造体の数
elt:構造体の配列へのポインタ
pceltFetched:実際に返される配列の要素数

{ 返値 }

 以下のいずれかの値を返します。
 ・S_OK.....celt数分配列要素を得た
 ・S_FALSE.....celtよりも少ない配列要素を得た
 ・E_UNEXPECTED.....原因不明のエラー


Skip(celt: Longint)

在のポインタからcelt数分構造体をスキップします。
{ パラメータ }
celt:スキップしたい構造体数

{ 返値 }

 以下のいずれかの値を返します。
 ・S_OK.....celt数分配列要素をスキップした
 ・S_FALSE.....配列の最後に到達した
 ・E_UNEXPECTED.....原因不明のエラー


Reset

列の先頭に戻します。
だし、最初と同一の配列の先頭になるかどうかは保証されていません。(もちろん出来るだけ同一のものになるよう実装するのが望ましい)
{ パラメータ }
無し 

{ 返値 }

 以下のいずれかの値を返します。
 ・S_OK.....成功
 ・E_UNEXPECTED.....原因不明のエラー


Clone(out enum: IEnumFormatEtc)

く同じ状態の配列を返します。
{ パラメータ }
enum:複製された配列

{ 返値 }

 以下のいずれかの値を返します。
 ・S_OK.....成功
 ・E_UNEXPECTED.....原因不明のエラー

2.2.16 IShellFolderインターフェイス

ェルの名前空間を拡張するオブジェクトを作成するために使用されるインターフェイスです。例えば、エクスプローラのルート上に別の名前空間を生成する場合やシステムの名前空間の階層内に直接新しい名前空間を生成する場合などです。
の場合、それらの名前空間のコンテンツに関する情報を知っているのは実装者のみなので、実装者はそれらのデータにアクセスするために必要な全てのことを実装する必要があります。
た、シェルの名前空間上のコンテンツを表示・操作する必要がある場合にこのインターフェイスを使用します。

下に IShellFolderインターフェイスの Delphiでの宣言を示します。
また、続けて各メンバー関数の解説も行います。
const SID_IShellFolder = '{000214E6-0000-0000-C000-000000000046}';

IShellFolder = interface(IUnknown)
  [SID_IShellFolder]
  function ParseDisplayName(hwndOwner: HWND;
    pbcReserved: Pointer; lpszDisplayName: POLESTR; out pchEaten: ULONG;
    out ppidl: PItemIDList; var dwAttributes: ULONG): HResult; stdcall;
  function EnumObjects(hwndOwner: HWND; grfFlags: DWORD;
    out EnumIDList: IEnumIDList): HResult; stdcall;
  function BindToObject(pidl: PItemIDList; pbcReserved: Pointer;
    const riid: TIID; out ppvOut: Pointer): HResult; stdcall;
  function BindToStorage(pidl: PItemIDList; pbcReserved: Pointer;
    const riid: TIID; out ppvObj: Pointer): HResult; stdcall;
  function CompareIDs(lParam: LPARAM;
    pidl1, pidl2: PItemIDList): HResult; stdcall;
  function CreateViewObject(hwndOwner: HWND; const riid: TIID;
    out ppvOut: Pointer): HResult; stdcall;
  function GetAttributesOf(cidl: UINT; var apidl: PItemIDList;
    var rgfInOut: UINT): HResult; stdcall;
  function GetUIObjectOf(hwndOwner: HWND; cidl: UINT; var apidl: PItemIDList;
    const riid: TIID; prgfInOut: Pointer; out ppvOut: Pointer): HResult; stdcall;
  function GetDisplayNameOf(pidl: PItemIDList; uFlags: DWORD;
    var lpName: TStrRet): HResult; stdcall;
  function SetNameOf(hwndOwner: HWND; pidl: PItemIDList; lpszName: POLEStr;
    uFlags: DWORD; var ppidlOut: PItemIDList): HResult; stdcall;
end;


[メンバー関数](全10関数)


ParseDisplayName(hwndOwner: HWND; pbcReserved: Pointer; lpszDisplayName: POLESTR; out pchEaten: ULONG; out ppidl: PItemIDList; var dwAttributes: ULONG)

ァイルオブジェクトやフォルダの表示名をアイテムIDリストに変換します。
{ パラメータ }
hwndOwner(in):ダイアログ等を表示する必要がある場合のオーナーウィンドウのハンドル
pbcReserved(in):予約済(ヌルにしておく)
lpszDisplayName(in):表示名(SHGDN_FORPARSINGにより得た表示名)
pchEaten(out):変換された表示名の文字数
ppidl(out):指定された表示名に対応するアイテムIDリストへのポインタ(エラーがあった場合はヌル)
dwAttributes(out):ファイルオブジェクトの属性

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


EnumObjects(hwndOwner: HWND; grfFlags: DWORD; out EnumIDList: IEnumIDList)

ォルダのコンテンツを表すIEnumIDListインターフェイスを返します。生成されたIEnumIDListオブジェクトは呼出し側で開放します。
{ パラメータ }
hwndOwner(in):ダイアログ等を表示する必要がある場合のオーナーウィンドウのハンドル
grfFlags(in):列挙するアイテムを決定する以下のフラグの組合せ
 ・SHCONTF_FOLDERS.....フォルダ
 ・SHCONTF_NONFOLDERS.....フォルダ以外
 ・SHCONTF_INCLUDEHIDDEN.....隠れオブジェクト、システムオブジェクト
EnumIDList(out):生成されたIEnumIDListオブジェクト(エラーの場合はヌル)

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


BindToObject(pidl: PItemIDList; pbcReserved: Pointer; const riid: TIID; out ppvOut: Pointer)

イテムIDリストにより指定されるサブフォルダのインスタンスを返します。
{ パラメータ }
pidl(in):サブフォルダを特定するTItemIDListへのポインタ
pbcReserved(in):予約済(ヌルにしておく)
riid(in):サブフォルダのTIID構造体(IID_IShellFolderを指していなければならない)
ppvOut(out):サブフォルダのインターフェイス

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


BindToStorage(pidl: PItemIDList; pbcReserved: Pointer; const riid: TIID; out ppvObj: Pointer)

イテムIDリストにより指定されるサブフォルダのストレージのインスタンスを返します。
{ パラメータ }
pidl(in):サブフォルダを特定するTItemIDListへのポインタ
pbcReserved(in):予約済(ヌルにしておく)
riid(in):サブフォルダのTIID構造体
ppvObj(out):ストレージのインターフェイス

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


CompareIDs(lParam: LPARAM; pidl1, pidl2: PItemIDList)

つのアイテムIDリストを比較します。
{ パラメータ }
lParam(in):比較のタイプ(アイテムIDリストが名前でソートされていることを表すゼロを指定する)
pidl1、pidl2(in):比較したいアイテムを表すアイテムIDリスト

{ 返値 }

 関数が成功した場合、HRESULTのCODEは以下のいずれかの値をとります。
 ・負.....pidl1 < pidl2
 ・ゼロ.....pidl1 = pidl2
 ・正.....pidl1 > pidl2


CreateViewObject(hwndOwner: HWND; const riid: TIID; out ppvOut: Pointer)

ォルダのビューオブジェクトを作成します。このビューオブジェクトはシェルフォルダオブジェクトとは異なる独立したオブジェクトです。
クスプローラは複数のビューオブジェクトを生成することが可能です。(それらは全て独立したオブジェクトとなります。)
{ パラメータ }
hwndOwner(in):ダイアログ等を表示する必要がある場合のオーナーウィンドウのハンドル
riid(in):関数から返すインターフェイスの識別子(TIID構造体)
ppvOut(out):ビューオブジェクトへのポインタ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetAttributesOf(cidl: UINT; var apidl: PItemIDList; var rgfInOut: UINT)

1つ以上のファイルオブジェクトもしくはサブフォルダの属性を返します。
{ パラメータ }
cidl(in):属性を得るファイルオブジェクトの数
apidl(in):TItemIDList構造体の配列(各構造体はヌル値で区切られている)
rgfInOut(out):ゼロあるいはファイルの共通属性を示す以下のフラグの組合せ
(キャパビリティ関連)
 ・SFGAO_CANCOPY.....コピー可能
 ・SFGAO_CANDELETE.....削除可能
 ・SFGAO_CANLINK.....ショートカット作成可能
 ・SFGAO_CANMOVE.....移動可能
 ・SFGAO_CANRENAME.....リネーム可能
 ・SFGAO_DROPTARGET.....ドロップされたターゲット
 ・SFGAO_HASPROPSHEET.....プロパティシート有り
 ・SFGAO_CAPABILITYMASK......キャパビリティ用マスク(Andをとってキャパビリティに関するフラグのみを取出す)
(ディスプレイ関連)
 ・SFGAO_GHOSTED.....ゴーストアイコン(半透明アイコン)で表示
 ・SFGAO_LINK.....ショートカット
 ・SFGAO_READONLY.....読込み専用
 ・SFGAO_SHARE .....共有ファイル
 ・SFGAO_DISPLAYATTRMASK.....ディスプレイ用マスク(Andをとってディスプレイに関するフラグのみを取出す)
(コンテンツ関連)
 ・SFGAO_FILESYSTEM.....ファイルシステムの一部(ファイル、ディレクトリ、ルートディレクトリ)
 ・SFGAO_FILESYSANCESTOR.....ファイルシステムフォルダを含む
 ・SFGAO_FOLDER.....フォルダ
 ・SFGAO_HASSUBFOLDER.....サブフォルダを持つ
 ・SFGAO_CONTENTSMASK.....コンテンツ用マスク(Andをとってコンテンツに関するフラグのみを取出す)
(その他)
 ・SFGAO_REMOVABLE.....リムーバブルメディア上に存在
 ・SFGAO_VALIDATE.....キャッシュ情報を正当化する
 ・SFGAO_COMPRESSED.....圧縮されている

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetUIObjectOf(hwndOwner: HWND; cidl: UINT; var apidl: PItemIDList; const riid: TIID; prgfInOut: Pointer; out ppvOut: Pointer)

定されたオブジェクトで使用されるユーザーインターフェイス(COMオブジェクト)を作成します。例えばコンテキストメニューの生成やドラッグアンドドロップ操作等のためのユーザーインターフェイス等です。
{ パラメータ }
hwndOwner(in):ダイアログ等を表示する必要がある場合のオーナーウィンドウのハンドル
cidl(in):apidl中のファイルオブジェクトやサブフォルダの数
apidl(in):TItemIDList構造体の配列(各構造体はヌル値で区切られている)
riid(in):返されるオブジェクトの識別子(IID_IExtractIcon, IID_IContextMenu, IID_IDataObject, IID_IDropTarget)
prgfInOut(in):予約済
ppvOut(out):返されるインターフェイスへのポインタ

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。


GetDisplayNameOf(pidl: PItemIDList; uFlags: DWORD; var lpName: TStrRet)

ァイルオブジェクトやサブフォルダの表示名をTStrRet構造体で返します。
当するアイテムIDが表示名を持っていればそれへのオフセットを返し、持っていなければタスクアロケータによって割当てられた領域やバッファに表示名を格納し返します。
{ パラメータ }
pidl(in):TItemIDList構造体へのポインタ
uFlags(in):表示名のタイプ(以下のいずれか1つ)
 ・SHGDN_NORMAL.....デフォルト(表示目的に使用)
 ・SHGDN_INFOLDER.....フォルダの下位に表示
 ・SHGDN_FORADDRESSBAR.....アドレスバー(ドロップダウン)中に表示
 ・SHGDN_FORPARSING.....親フォルダのIShellFolder.ParseDisplayNameに渡される表示名
lpName(out):表示名を格納したTStrRet構造体

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

ミニ解説: TStrRet構造体

IShellFolderから返される文字列を含む構造体です。

TStrRet = packed record
  uType: UINT;
  case Integer of
    0: (pOleStr: LPWSTR);
    1: (pStr: LPSTR);
    2: (uOffset: UINT);
    3: (cStr: array[0..MAX_PATH-1] of Char);
end;

[メンバー]
uType.....文字列のフォーマットを特定するフラグ(以下のいずれか1つ)
 ・STRRET_CSTR---文字列はcStrに格納
 ・STRRET_OFFSET---文字列はアイテムIDリストの頭からuOffsetバイトの位置に格納
 ・STRRET_WSTR ---文字列はpOleStrの位置に格納
pOleStr.....OLE文字列へのポインタ
pStr.....Ansi文字列へのポインタ
uOffset.....アイテムIDリストのオフセット
cStr.....バッファ


SetNameOf(hwndOwner: HWND; pidl: PItemIDList; lpszName: POLEStr; uFlags: DWORD; var ppidlOut: PItemIDList)

ァイルオブジェクトやサブフォルダの表示名を変更します。その際、アイテムIDも変更する場合はタスクアロケータによって割当てられた新しいアイテムIDも返します。
しく作成されたアイテムIDは呼出し側で開放する必要があります。
{ パラメータ }
hwndOwner(in):ダイアログ等を表示する必要がある場合のオーナーウィンドウのハンドル
pidl(in):対象オブジェクトのTItemIDList構造体へのポインタ
lpszName(in):新しい表示名
uFlags(in):新しい表示名のタイプ(以下のいずれか1つ)
 ・SHCONTF_FOLDERS.....フォルダ
 ・SHCONTF_NONFOLDERS.....フォルダ以外
 ・SHCONTF_INCLUDEHIDDEN.....隠れオブジェクト、システムオブジェクト
ppidlOut(out):ヌルもしくは新しく作成されたアイテムIDリストへのポインタ(このメソッド中でpidlのアイテムIDを破棄し、タスクアロケータを用いて新しいアイテムIDを作成する)

{ 返値 }

 関数が成功すれば、NOERRORを返します。失敗した場合はOLEで定義されたエラーコードを返します。

前ページ( 2.1 拡張シェル登録に係るレジストリ操作 )に移動
次ページ( 2.3 拡張シェルオブジェクト例題 )に移動
トップページに戻る

メール作成 ご意見・ご要望等は左のポストをクリックして杉浦(gv4j-sgur@asahi-net.or.jp)までお寄せ下さい
なお、当サイトは「Netscape Communicator 4.5 for MS Windows」でのみ表示・動作が調整されております
Internet Explorer の場合、正常に表示・動作しない可能性がありますのでご了承下さい。
Copyright © 1998 Jun-ya Sugiura and Hanayo Sugiura. All rights reserved. Updated - 16 May 1999