빠른 정보 : Visual Studio 2008, Windows 8 (64 비트)를 사용하고 있습니다.Windows 7/8 용 자동 실행 구현 방법
WPD 장치가 컴퓨터에 연결될 때 나타나는 자동 실행 처리기를 만들려고합니다. 내 자동 실행 옵션을 선택하면 단순히 내 응용 프로그램을 시작하기 만하면됩니다.
1) : 나는 누군가가 조금 나를 도와하고 몇 가지 질문에 대답 할 수 기대했다 Windows 용 자동 실행을 구현하는 최근 사례가 아니기 때문에
. IHWEventHandler 인터페이스를 구현하는 COM 개체를 사용하여 ATL 프로젝트를 만들었습니다. 처음에 COM 객체를 얻으려고하면 C 드라이브에 .txt 파일을 만들어 성공적으로 호출되었음을 나타냅니다. 내 AutoPlay 이벤트가이 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);
};
이는 통화 당입니다 :
// 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 개체를 자동으로 등록한다는 것을 알고 있습니다. 내 COM 개체를 64 비트 창으로 빌드하고 regsvr32.exe를 사용하여 .dll을 등록합니다. 그러나이 방법은 도움이되지 않습니다.
2). 또한, 아마도 내 AutoPlay 레지스트리 키를 올바르게 등록하지 않았을 것으로 의심됩니다.
액션 REG_SZ 시켜라
:> MyAutoPlayHandlerMyAutoPlayHandler는 다음을 보유하고
HKEY_LOCAL_MACHINE> 소프트웨어> 마이크로 소프트> 윈도우> CurrentVersion을> 탐색기> AutoPlayHandlers> 핸들러 : 내가 먼저 수동으로 자동 실행 이벤트 핸들러과 같이 추가
DefaultIcon REG_SZ (내 응용 프로그램 아이콘에 대한 디렉토리)
InvokeProgID REG_SZ (내 ATL에서 생성 된 HKEY_CLASSES_ROOT에서 키 이름 프로젝트 : AutoPlayExericesCom.SimpleAutoPlayCom.1)
InvokeVerb REG_SZ 개방
공급자 나 자신을 REG_SZ는
는 그럼 난에 MyAutoPlayHandler 추가 한 다음
HKEY_LOCAL_MACHINE> 소프트웨어> 마이크로 소프트> 윈도우> CurrentVersion을> 탐색기> WPD_FUNCTIONAL_CATEGORY_ALL 인 {2D8A6512-A74C-448E-BA8A-F4AC07C49399}
멋지므로 Android devic을 플러그인합니다. e가 나타나고 AutoPlay 목록에 내 자동 실행 항목이 표시됩니다. 나는 그것을 클릭하고 아무 것도 일어나지 않는다. (txt 파일이 예상대로 C 드라이브에 생성되지 않았다.)
그래서 또한 다른 다음과 같은 키 생성 : 개방>
HKEY_CLASSES_ROOT> MyAutoPlayDropHandler> 쉘> DropTarget를 DropTarget에 내가 만든 COM 개체의 CLSID 아이디어와 CLSID 값을 포함
. 이 키를 가리 키도록 InvokeProgID를 변경하지만 여전히 아무 일도 발생하지 않습니다.
"이 파일은하지 않습니다 실험에 대한
, 내가 ShowPicturesOnArrival 키 아래 내 처리기를 추가하는 시도, 때 다음 내 자동 실행 항목을 선택, 이미지를 포함하는 USB 드라이브에 연결, 나는 다음과 같은 오류 메시지를 받았습니다 프로그램을 설치하거나, 이미 설치되어있는 경우 기본 프로그램 제어판에 연결을 만드십시오. "이제 ShowPicturesOnArrival 키에 어떤 종류의 오류 응답이 표시되지만 WPD에는 아무런 이유가 없습니까? 나는이 일을하기 위해 어딘가에서 뭔가를 놓친 것 같지만 아이디어가 부족합니다. 이 문제를 해결할 수있는 제안은 크게 감사 할 것입니다.
나는 게시물을 덜 일반화하기 위해 편집했습니다. – user2136288
C++ 코드를 게시했기 때문에이 응용 프로그램을 C# 또는 C++로 작성하고 있습니까? –
내 현재 시도와 함께, 나는 이것을 C++로 작성하고있다. – user2136288