1

関数 enumobjects を Ishellfolder にフックしようとしています。ユーザーの存在しないファイルをエクスプローラーで表示したいのでやっています。FindNextFile と FindFirstFile をフックすることに成功しましたが、残念ながらこの関数は、Windows 7 の explorer.exe でファイルを一覧表示するためにどの API が使用されているかという質問に従って、エクスプローラーによって常に呼び出されるわけではありません。

今、IShellFolder::EnumObjects をフックしようとするので、フックします。

MyCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv)

そして、この関数内には次のコードがあります。

if (IsEqualCLSID(rclsid, (REFGUID) __uuidof (IShellFolder)) || 
    IsEqualCLSID(rclsid, (REFGUID) __uuidof (IShellFolder2)) ||
    IsEqualCLSID(rclsid, (REFGUID) CLSID_ShellDesktop) ||
    IsEqualCLSID(rclsid, (REFGUID) IID_IShellFolder) )
{

    PDEBUG(L"IID_IShellFolder.2");
    IShellFolderCast *shellFolder = (IShellFolderCast *) *ppv;

    orig_EnumObjects = (type_EnumObjects) GetInterfaceMethod(shellFolder->lpVtbl, 4);
    if (!Mhook_SetHook((void **) &orig_EnumObjects, MyEnumObjects))
    {
        PDEBUG(L". CoCreateInstance. Failed to set EnumObjects!");
    }else
    {
        PDEBUG(L". CoCreateInstance. success to set EnumObjects!");
    }
}

しかし、誰かが理由を知っているなら、それは決してその中に入りませんか?

4

2 に答える 2

0

以下は、Windows API がディレクトリ内のファイルを列挙する方法を示しています。ここを見てください。

[編集] 私の最初のエントリであなたの質問の意図を逃しました. iShellFolder にアクセスしたときにイベントをトラップする方法を知りたいですか? あなたはおそらくすでにここを見たことがありますか?いくつかのサンプル コードがあり、役立つと思われるトピックについて説明しています。

于 2013-08-21T15:23:53.673 に答える
0

に変更するだけ

if (IsEqualCLSID(rclsid, (REFGUID) CLSID_ShellFSFolder) )

そして今、それは動作します

于 2013-08-22T15:52:16.600 に答える