快速信息:我正在使用Visual Studio 2008,Windows 8(64位)。如何實施Windows 7/8的自動播放功能
我試圖創建一個自動播放處理程序,當WPD設備插入到計算機時出現。如果我的自動播放選項被選中,我希望它只是啓動我的應用程序。
由於沒有任何近期實現自動播放的Windows,我希望有人能幫助我一點,並回答幾個問題的例子:
1)。我用一個實現了IHWEventHandler接口的COM對象創建了一個ATL項目。最初,我試圖讓COM對象做的就是在我的C驅動器中創建一個.txt文件,以表明它已成功調用。我試圖讓自動播放事件指向這個COM對象,但是當我選擇自動播放條目時沒有任何反應。這裏是我的.h代碼爲我的COM類:
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對象?
據我所知,當我建立項目時,Visual Studio會自動註冊我的COM對象。我爲64位窗口構建COM對象,並使用regsvr32.exe註冊.dll,但這似乎沒有幫助。 2)。另外,我懷疑可能是我沒有正確註冊我的AutoPlay註冊表項。我第一次手動添加我的自動播放的事件處理程序,像這樣:
HKEY_LOCAL_MACHINE> SOFTWARE>微軟> Windows>系統CURRENTVERSION>瀏覽器> AutoPlayHandlers>處理程序> MyAutoPlayHandler
MyAutoPlayHandler存在以下:
行動REG_SZ MyAction
DefaultIcon REG_SZ(目錄到我的應用程序圖標)
InvokeProgID REG_SZ(由我的ATL生成的HKEY_CLASSES_ROOT下的鍵名稱項目:AutoPlayExericesCom.SimpleAutoPlayCom.1)
InvokeVerb REG_SZ開放
提供商REG_SZ我自己
然後我說MyAutoPlayHandler以下幾點:
HKEY_LOCAL_MACHINE> SOFTWARE>微軟> Windows>系統CURRENTVERSION>瀏覽器> AutoPlayHandlers> EventHandlers> WPD>功能> {2D8A6512-A74C-448E-BA8A-F4AC07C49399}這是WPD_FUNCTIONAL_CATEGORY_ALL
酷,所以我插入我的Android設備e,我在AutoPlay列表中看到了我的AutoPlay條目。我點擊它,沒有任何反應(沒有txt文件在C盤中創建,因爲我期待)。
所以我另外創建一個類似下面的另一個關鍵:MyAutoPlayDropHandler>殼
HKEY_CLASSES_ROOT>>開>的DropTarget
凡DropTarget是否包含與我創建的COM對象的CLSID想法CLSID值。我改變InvokeProgID指向這個鍵,但仍然沒有任何反應。
對於實驗,我嘗試添加我的處理程序ShowPicturesOnArrival項下,並在USB驅動器插入含有圖像時,則選擇我的自動播放入境,我得到了以下錯誤消息:
「此文件沒有與其關聯的程序來執行此操作,請安裝程序,或者如果已安裝,請在「默認程序」控制面板中創建關聯。
因此,現在我對ShowPicturesOnArrival鍵有一些錯誤響應,但爲什麼WPD沒有?我懷疑我錯過了某個地方讓這個工作,但我沒有想法。任何建議,我可以嘗試解決這個問題將不勝感激。
我編輯了這篇文章,使其不那麼通用。 – user2136288 2013-03-07 22:02:44
那麼你是用C#還是C++編寫這個應用程序,因爲你發佈了C++代碼。 – 2013-03-08 05:13:25
在我目前的嘗試中,我正在用C++寫這篇文章。 – user2136288 2013-03-08 14:38:03