クイック情報:Visual Studio 2008、Windows 8(64ビット)を使用しています。
WPDデバイスがコンピューターに接続されたときに表示される自動再生ハンドラーを作成しようとしています。自動再生オプションが選択されている場合は、アプリケーションを起動するだけです。
AutoPlay for Windowsを実装した最近の例はないので、誰かが私を少し助けて、いくつかの質問に答えてくれることを望んでいました。
1)。IHWEventHandlerインターフェイスを実装するCOMオブジェクトを使用してATLプロジェクトを作成しました。最初に、COMオブジェクトに実行させようとしているのは、Cドライブに.txtファイルを作成して、正常に呼び出されたことを示すことだけです。AutoPlayイベントがこのCOMオブジェクトを指すようにしようとしましたが、AutoPlayエントリを選択しても何も起こりません。これが私のCOMクラスの.hコードです:
class ATL_NO_VTABLE CSimpleAutoPlayCom :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSimpleAutoPlayCom, &CLSID_SimpleAutoPlayCom>,
public IHWEventHandler
//public ISimpleAutoPlayCom
{
public:
CSimpleAutoPlayCom()
{
ofstream myfile;
myfile.open ("C:\\AutoPlayExerciseWorked.txt");
myfile << "Called from Constructor.\n";
myfile.close();
}
DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLEAUTOPLAYCOM)
DECLARE_NOT_AGGREGATABLE(CSimpleAutoPlayCom)
BEGIN_COM_MAP(CSimpleAutoPlayCom)
//COM_INTERFACE_ENTRY(ISimpleAutoPlayCom)
COM_INTERFACE_ENTRY(IHWEventHandler)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
// IHWEventHandler
STDMETHODIMP Initialize(__RPC__in LPCWSTR pszParams);
STDMETHODIMP HandleEvent(__RPC__in LPCWSTR pszDeviceID, __RPC__in LPCWSTR pszAltDeviceID, __RPC__in LPCWSTR pszEventType);
STDMETHODIMP HandleEventWithContent(__RPC__in LPCWSTR pszDeviceID, __RPC__in LPCWSTR pszAltDeviceID, __RPC__in LPCWSTR pszEventType, __RPC__in LPCWSTR pszContentTypeHandler, __RPC__in_opt IDataObject *pdataobject);
};
これは.cppです:
// CSimpleAutoPlayCom
STDMETHODIMP CSimpleAutoPlayCom::Initialize(__RPC__in LPCWSTR pszParams)
{
ofstream myfile;
myfile.open ("C:\\AutoPlayExerciseWorked.txt");
myfile << "Called from Initialize\n";
myfile.close();
return S_OK;
}
STDMETHODIMP CSimpleAutoPlayCom::HandleEvent(__RPC__in LPCWSTR pszDeviceID, __RPC__in LPCWSTR pszAltDeviceID, __RPC__in LPCWSTR pszEventType)
{
ofstream myfile;
myfile.open ("C:\\AutoPlayExerciseWorked.txt");
myfile << "Called from HandleEvent.\n";
myfile.close();
return S_OK;
}
STDMETHODIMP CSimpleAutoPlayCom::HandleEventWithContent(__RPC__in LPCWSTR pszDeviceID, __RPC__in LPCWSTR pszAltDeviceID, __RPC__in LPCWSTR pszEventType, __RPC__in LPCWSTR pszContentTypeHandler, __RPC__in_opt IDataObject *pdataobject)
{
ofstream myfile;
myfile.open ("C:\\AutoPlayExerciseWorked.txt");
myfile << "Called from HandleEventWithContent.\n";
myfile.close();
return S_OK;
}
全体として、この実装は正しいように見えますか?AutoPlayイベントでこのCOMオブジェクトを呼び出すには、追加のインターフェイスを実装する必要がありますか?
プロジェクトをビルドすると、VisualStudioによってCOMオブジェクトが自動的に登録されることを理解しています。64ビットウィンドウ用のCOMオブジェクトを作成し、zippy32.exeを使用して.dllも登録しますが、これは役に立たないようです。
2)。また、AutoPlayレジストリキーを正しく登録しなかったのではないかと疑っています。最初に、次のようにAutoplayイベントハンドラーを手動で追加しました。
HKEY_LOCAL_MACHINE>ソフトウェア>Microsoft>Windows> CurrentVersion> Explorer> AutoPlayHandlers> Handlers> MyAutoPlayHandler
MyAutoPlayHandlerは次を保持します。
アクションREG_SZMyAction
DefaultIcon REG_SZ(アプリケーションアイコンのディレクトリ)
InvokeProgID REG_SZ(私のATLプロジェクトによって生成されたHKEY_CLASSES_ROOTの下のキーの名前:AutoPlayExericesCom.SimpleAutoPlayCom.1)
InvokeVerbREG_SZが開いています
プロバイダーREG_SZ自分
次に、MyAutoPlayHandlerを以下に追加しました。
HKEY_LOCAL_MACHINE>ソフトウェア>Microsoft>Windows> CurrentVersion> Explorer> AutoPlayHandlers> EventHandlers> WPD> Function> {2D8A6512-A74C-448E-BA8A-F4AC07C49399}、つまりWPD_FUNCTIONAL_CATEGORY_ALL
かっこいいので、Androidデバイスを接続すると、自動再生リストに自動再生エントリが表示されます。クリックしても何も起こりません(期待どおりにCドライブにtxtファイルが作成されませんでした)。
そこで、次のような別のキーを追加で作成します。
HKEY_CLASSES_ROOT>MyAutoPlayDropHandler>シェル>開く>DropTarget
DropTargetには、作成したCOMオブジェクトのCLSIDのアイデアを含むCLSID値が含まれています。このキーを指すようにInvokeProgIDを変更しましたが、それでも何も起こりません。
実験のために、ShowPicturesOnArrivalキーの下にハンドラーを追加しようとしましたが、画像を含むUSBドライブを接続し、自動再生エントリを選択すると、次のエラーメッセージが表示されました。
「このファイルには、このアクションを実行するためのプログラムが関連付けられていません。プログラムをインストールするか、onがすでにインストールされている場合は、[既定のプログラム]コントロールパネルで関連付けを作成してください。」
これで、ShowPicturesOnArrivalキーに対してある種のエラー応答がありますが、なぜWPDには何もありません。これを機能させるためにどこかで何かが足りないのではないかと思っていますが、アイデアが不足しています。私がこれを修正しようとすることができるどんな提案でも大いにありがたいです。