Delphiの書き込みシェル拡張

オリジナルリンク: http://www.cnblogs.com/yzryc/p/6408998.html

デルファイの基本的な手順でハウジング延長(シェル拡張)プログラムを作成します。


(1)「CloudUpload」という名前のActiveXライブラリプロジェクトを作成します
(2)新しいオートメーションオブジェクト(オートメーションオブジェクト)を作成します。「TCloudUploadContext」という名前


TCloudUploadContextすなわちクラスは、二つのインタフェースを実装する必要があります。IShellExtInitIContextMenuを
あなたは、Windowsエクスプローラのコンテキストメニュー(コンテキストメニュー)を統合することができます。

IShellExtInit方法} {
{MENUコンテキスト初期化ザIFが選択された}ファイルの
機能IShellExtInit .Initialize = ShellExtInitializeを
機能ShellExtInitialize(pidlFolder:PItemIDList; lpdobj:のIDataObject;
hKeyProgID:HKEY):HRESULT; _stdcall。

{IContextMenu方法}
{コンテキストメニューを初期化し、それは、その中に表示される項目を決定
あなたが通過フラグに基づい}
関数QueryContextMenu(メニュー:HMENU; indexMenu、idCmdFirst、idCmdLast、
uFlags:UINT)を:HRESULT。STDCALL;

{アマゾンにアップロードまたはAzureのされるコマンド、実行}
関数InvokeCommand(VARのlpici:TCMInvokeCommandInfo):HRESULT; _stdcall;
{メニュー項目が選択されると、エクスプローラのステータスバーに設定されたヘルプ文字列}
関数GetCommandString(IdCmd:UINT_PTR ; uFlags:UINT; pwReserved:PUINT;
pszName:LPSTR; cchMax:UINT):HRESULTの、STDCALL;



ShellExtInitializeはエクスプローラのコンテキストメニュー(コンテキストメニュー)を表示するかどうかを定義します。
それが表示されている、または表示されませんときに、ファイルが選択されているのみで、この例では、コンテキストメニュー(コンテキストメニュー)。
ファイルを選択した場合は、Ffilenameの変数は、ファイルのファイル名を受け取ります。


関数TCloudUploadContextMenu.ShellExtInitialize(pidlFolder:PItemIDList;
lpdobj:のIDataObject; hKeyProgID:HKEY):HRESULT。
VaRの
データ形式:TFormatEtc。
StrgMedium:TStgMedium。
バッファー:charの配列[0 .. MAX_PATH]。
始める
の検索結果を:= E_FAIL;

{オブジェクトが定義されたかどうかをチェック}
lpdobj = nilの場合、次いで
、終了。

{オブジェクトに関する情報を取得するための準備}
DataFormat.cfFormat:= CF_HDROPと、
DataFormat.ptd:= nilを;
DataFormat.dwAspect:= DVASPECT_CONTENT。
DataFormat.lindex:= -1;
DataFormat.tymed:= TYMED_HGLOBAL。

lpdobj.GetData(DATAFORMAT、StrgMedium)<> S_OK、その後であれば
、終了。

{実装は、現在唯一のファイルをサポート}
DragQueryFile(StrgMedium.hGlobal、$ FFFFFFFF、ゼロは、0)= 1の場合、次に
開始
はsetLength(FFileName、MAX_PATH)を、
DragQueryFile(StrgMedium.hGlobal、0、@Buffer、にSizeOf(緩衝液))。
FFileName:=バッファ;
結果:= NOERROR;
終了

始める
より、その後1つのファイルを選択した場合はメニューを表示しない//
FFileNameを:= EmptyStr。
結果:= E_FAIL;
終わり;

{http://msdn.microsoft.com/en-us/library/ms693491(v=vs.85).aspx}
ReleaseStgMedium(StrgMedium)。

終わり;

ハンドルアップと[ファイル]メニュー(コンテキストメニューハンドラ)ダウンがIShellExtInitインターフェイスに初期化された後、
使用してWindowsシステムIContextMenuのインタフェースは、コールする(呼び出し)他の方法アップハンドルで、[ファイル]メニューダウン。
この場合、それは(コール)QueryContextMenu呼び出しGetCommandStringおよびInvokeCommand


(を含むファイル]メニューのオプション上下アマゾンS3およびマイクロソフトにアズール)を介しQueryContextMenu作成すること方法。


TCloudUploadContextMenu機能。QueryContextMenu(メニュー:HMENU;
indexMenu、idCmdFirst、idCmdLast、uFlags:UINT):HRESULT。
VaRの
CloudMenuItem:TMenuItemInfo。
MenuCaption:文字列。
サブメニュー:HMENU。
UID:UINT;
開始
{つのみメニューCloudMenuItemを添加するので、結果コードに応じて生成する}
結果:= MakeResult(SEVERITY_SUCCESS、0、3)。

{メニューCloudMenuItemインデックス格納}
FMenuItemIndex:= indexMenuと、

{それが生み出した場所に応じて、メニューの言うことを指定}
であれば、デスクトップから、その後(uFlags = CMF_NORMAL)//
MenuCaption:=「クラウドにデスクトップからファイルを送信」
他にあれば(uFlagsとCMF_VERBSONLY)= CMF_VERBSONLYそして//ショートカットから
MenuCaption:=「クラウドへShourtcutからファイルを送信」
他にあれば(uFlagsとCMF_EXPLORE)= CMF_EXPLOREその後、//エクスプローラから
MenuCaption:=「クラウドにエクスプローラからファイルを送信」

{他の値で失敗}
結果:= E_FAIL;

結果<> E_FAILは、場合
開始します

サブメニュー:= CreatePopupMenu。

UID:= idCmdFirst。
InsertMenu(サブメニューAmazonIndex、MF_BYPOSITION、UID、TClouds [AmazonIndex])。

株式会社(UID)。
InsertMenu(サブメニューAzureIndex、MF_BYPOSITION、UID、TClouds [AzureIndex])。

FillChar(CloudMenuItem、にSizeOf(TMenuItemInfo)、#0)。
CloudMenuItem.cbSize:=にSizeOf(TMenuItemInfo)。
CloudMenuItem.fMask:= MIIM_SUBMENUまたはMIIM_STRINGまたはMIIM_ID。
CloudMenuItem.fType:= MFT_STRING。
CloudMenuItem.wID:= FMenuItemIndex。
CloudMenuItem.hSubMenu:=サブメニュー。
CloudMenuItem.dwTypeData:= PWideChar型(MenuCaption)。
CloudMenuItem.cch:=長さ(MenuCaption)。

InsertMenuItem(メニュー、indexMenu、真、CloudMenuItem)。
終わり;
終わり;

あなたがマウスを使ってクラウド(雲のメニュー項目)でWindowsエクスプローラのメニュー項目に滑空するときには、ステータスバーに瞬時ヘルプ(プロンプト)の情報が表示されます。このメッセージが定義されているGetCommandStringの実現方法。

TCloudUploadContextMenu機能。GetCommandString(idCmd:UINT_PTR; uFlags:UINT;

pwReserved:PUINT。pszName:LPSTR。cchMax:UINT):HRESULT;
始める
の検索結果を:= E_INVALIDARG;

{メニュー項目が選択されたときにExplorerのステータスバーにヘルプ文字列を設定}
([AmazonIndex、AzureIndex]でidCmd)及び(uFlags = GCS_HELPTEXT)を次いであれば
開始
StrLCopy(PWideChar型(pszName)、PWideChar型( '選択したファイルをコピーする'を+
TClouds [idCmd])、cchMax)。
結果:= NOERROR;
終わり;

終わり;

ユーザーが特定の時間内のメニュー項目の雲(クラウドメニュー項目)をクリックすると、InvokeCommandの方法は、(コール)と呼ばれることになり、スタートアップロードが雲(クラウド)上のターゲット・プロセスにファイルを選択しました。
このように、我々はすでに、このパラメータに基づいてlpiciをファイル名を持って、我々は、ユーザーがクリックしたメニュー項目を伝えることができます。


機能TCloudUploadContextMenu.InvokeCommand(VARのlpici:TCMInvokeCommandInfo):HRESULT;
VARの
アイテム:Wordの。
始める
の検索結果を:= E_FAIL;

HIWORD(整数(lpici.lpVerb))<> 0の場合であれば
、終了。

{インデックスがメニューのインデックスと一致する場合、クラウド・オプションを表示}
= LOWORD(INTEGER(lpici.lpVerb));:アイテム

[AmazonIndex、AzureIndex]の項目であれば、次に
開始
しようと
アップロード(lpici.HWND、アイテム、FFileNameを)。
除く
E上:例外が行う
メッセージボックス(lpici.hwnd、PWideChar型(E.Message)、 '雲のアップロード'、MB_ICONERRORを)。

終わり;
結果:= NOERROR;
終わり;

終わり;

CloudUploadがロードされたときに、COMオブジェクト(COMオブジェクト)が作成されることを保証するために、植物インスタンスのハウジング拡張オブジェクト(シェル拡張オブジェクト)のインスタンスを作成するために、具体的には、クラス・ファクトリのインスタンスを作成する必要がありますこれは、初期化コードで作成されます。

初期
TCloudUploadObjectFactory.Create(ComServer、TCloudUploadContextMenu、CLASS_CloudUploadContextMenu、ciMultiInstance、tmApartment)。
終わり。

そのためこれらの工場では、使用時に、DLLを登録または登録解除する責任となりますREGSVR32.EXE時間を、ApproveShellExtensionUpdateRegistryの 2つの方法が(起動される)と呼ばれます。


CloudUploadシェル拡張アプリケーション登録
管理者CMDとして実行するに

登録コマンド:
ます。regsvr32は<DLLをある場所PATH>はCloudUpload.dll

:コマンド登録を解除
します。regsvr32 <DLLを置かれている場所PATH> CloudUpload.dll / Uを

 

オリジナル住所:http://www.andreanolanusse.com/en/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2/

 

ます。https://www.cnblogs.com/yzryc/p/6408998.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_30294709/article/details/94795072