1

背景と私がやったこと

Windows 用のシェル拡張機能の作成方法を学ぼうとしていますが、そのプロセスは十分に文書化されておらず、初心者向けの情報はほとんどありません。私が読んだことによると、このガイドは、Windows シェル拡張機能の最高の初心者向けチュートリアルの 1 つとしてあらゆる場所に掲載されています。チュートリアルを最後まで実行しましたが、いくつかの競合を避けるためにいくつかの調整を行う必要がありました。

  1. x86-64bit 用にビルドするには、Visual Studio 2012 を変更する必要がありました。win32構成を からに切り替えたx64だけですが、知らない手順が他にもある可能性があります。
  2. guidgen.exeVisual Studio 2012 に付属のを使用して、GUID を生成しました。

私のプロジェクトは正常にコンパイルされ、終了しexplorer.exe(スタート メニューで ctrl+shift+右クリックして を選択Exit Explorer)、リリース モードでプロジェクトをコンパイル/実行することでプロジェクトを開始できます (その後、 の別のインスタンスが開始されますexplorer.exe)。

問題

regedit.exe問題は、プログラムの実行時にCLSID 値が書き込まれないことです(ただし、txtfileレジストリの場所は更新されます)。さらに、CLSID が登録されていない場合に予想されるプログラム フックが機能しません。「助けて、うまくいかない!」と言うだけでなく、問題をもう少し絞り込めたらいいのにと思います。しかし、正直なところ、問題をさらに特定するために何ができるかわかりません。私のSimpleShlExt.rgsファイルに何か問題があることはほぼ確実ですが、このガイドでは、ファイルに関するこの重要なステップについて多くの情報が提供されていません*.rgs(トピック外の冗談を除いて)。

  1. DLL をレジストリに登録する際に何が問題になっているのかについて、詳細な情報を取得するにはどうすればよいですか?
  2. チュートリアルで説明されていない Visual Studio 2012 に関する警告はありますか (チュートリアルの古さ、または暗黙の知識の欠如による)。
  3. ファイルの何が問題になっていSimpleShlExt.rgsますか?!?!?

コード

追加情報については、関連するコードを以下に掲載しました。上記のガイドとほぼ同じです (ただし、GUID が異なります)。リクエストがあれば投稿できますが、ガイドSimpleShlExt.cppSimpleShlExt.hほとんど同じであり、有用な情報が追加されているかどうかはわかりません.

SimpleShlExt.rgs (CLSID は で生成されましたguidgen.exe)

HKCR
{
    NoRemove CLSID
    {
        ForceRemove {E2D6660C-E3E5-43CE-BF24-44D4269EEC1C} = s 'SimpleShlExt Class'
        {
            InprocServer32 = s '%MODULE%'
            {
                val ThreadingModel = s 'Apartment'
            }
        }
    }
}
HKCR
{
    NoRemove txtfile
    {
        NoRemove ShellEx
        {
            NoRemove ContextMenuHandlers
            {
                ForceRemove SimpleShlExt = s '{E2D6660C-E3E5-43CE-BF24-44D4269EEC1C}'
            }
        }
    }
}
4

1 に答える 1

1

これはずっと前のことですが、このぶら下げを忘れていたことに今気づきました。サンプルの CLSID の使用に戻ったところ、問題なく動作しました。CLSID を定義する他のいくつかのファイルを見つけましたが、これらのファイルは で生成したファイルと一致しませんでしたguidgen.exe。たとえば、チュートリアルでは、SimpleExt.hCLSID 情報が登録されているものについては実際には言及していません。CLSID を変更するには、CLSID が表示されるすべての場所を探す必要があります。

于 2013-07-30T19:35:18.880 に答える