2013-03-05 6 views
3

빠른 정보 : 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 시켜라

:> MyAutoPlayHandler

MyAutoPlayHandler는 다음을 보유하고

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에는 아무런 이유가 없습니까? 나는이 일을하기 위해 어딘가에서 뭔가를 놓친 것 같지만 아이디어가 부족합니다. 이 문제를 해결할 수있는 제안은 크게 감사 할 것입니다.

+0

나는 게시물을 덜 일반화하기 위해 편집했습니다. – user2136288

+0

C++ 코드를 게시했기 때문에이 응용 프로그램을 C# 또는 C++로 작성하고 있습니까? –

+0

내 현재 시도와 함께, 나는 이것을 C++로 작성하고있다. – user2136288

답변

0

나는 잠시 동안 알고 있었지만이 게시물을 찾은 다른 사람들을 위해 VLC가 자동 실행 이벤트를 수행하는 방법을 복사하여이 문제를 해결했습니다. 실행중인 코드를 호출 할 수는 없지만 최소한 원하는 명령 줄 인수로 응용 프로그램을 호출 할 수 있습니다.

VLC를 앱으로 대체하여 컴퓨터에 다음 레지스트리 키를 추가하기 만하면됩니다.

HKEY_CLASSES_ROOT 
    VLC 
     shell 
      import 
      Open 
       command 
        Default = "[Path]\vlc.exe" --started-from-file dvd:///%1 

HKEY_LOCAL_MACHINE 
    SOFTWARE 
     Microsoft 
     Windows 
      CurrentVersion 
       Explorer 
        AutoplayHandlers 
        EventHandlers 
         PlayDVDMovieOnArrival 
          VLCPlayDVDMovieOnArrival [REG_SZ] 
        Handlers 
         VLCPlayDVDMovieOnArrival 
          Action [REG_SZ]= Play DVD Movie 
          DefaultIcon [REG_EXPAND_SZ]= [somepath]\VLC.exe, 0 
          InvokeProgID [REG_SZ]= VLC.DVDMovie 
          InvokeVerb [REG_SZ]= Open 
          Provider [REG_SZ]= VideoLanVLC media player