2012-08-10 3 views
1

고유 데스크톱 응용 프로그램 (/ ZW가 사용되지 않음)과/ZW로 작성된 DLL이 있습니다. DLL은 ToastNotificationManager을 통해 WinRT 토스트를 생성합니다.수동 발송이 필요합니까?

토스트 클릭 이벤트를 수신하는 DLL에 C++/CX 클래스가 있습니다. 이 모든 것이 잘 작동합니다. 그러나 이벤트는 작업자 스레드에서옵니다. 어떻게 든 주 스레드에 전화를해야합니다. 가장 좋은 방법은 무엇입니까?

내가 속성

[Threading(ThreadingModel::STA)] 
[MarshalingBehavior(MarshalingType::Standard)] 
내 C++/CX 클래스

만, 여전히 이벤트가 작업자 스레드에서 호출되는 설정을 시도했습니다. 내 [Platform::STAThread] 데스크톱 응용 프로그램에서 내 주요 방법을 추가하려고했습니다. 앱을 시작할 때 ::RoInitialize(RO_INIT_SINGLETHREADED);을 사용해 보았습니다.

여기에 잘못된 경로가 있습니까? 다음과 같이 사용해야합니까?

var dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher; // from UI thread 
dispatcher.RunAsync // from worker thread? 

(C++/CX 제외)?

편집 : Windows.UI.Core.CoreWindow.GetForCurrentThread()는 UI 스레드에서 쿼리 할 때 null을 반환합니다. UI 스레드는 MFC 기반입니다.

edit2 : 저는 Platform :: Agile로 놀아 왔습니다. 나는 C++/CX 클래스를 가리키는 기본 스레드에서 애자일 포인터를 설정 한 다음 작업자 스레드의 이벤트 핸들러에서 호출하려고 시도합니다. Agile.cpp에서 프록시를 얻으려고하는 것처럼 보이지만, hresult로 실패합니다 REGDB_E_IIDNOTREG 인터페이스가 등록되지 않았습니다. 나는 가까운 것처럼 보인다. 어떻게 든 내 C++/CX 클래스를 등록해야합니다. 평범한 COM에서 나는 이것이 Global Interface Table에 있다고 믿습니다. C++/CX에서 어떻게 작동하는지 모르지만 자동이 아닙니다.

답변

1

데스크톱 응용 프로그램에서 CoreDispatcher를 사용할 수 없으므로 CoreWindow가 필요하며 CoreWindow는 데스크톱 응용 프로그램에서 사용할 수 없습니다.

UI 스레드로 돌아가려면 이벤트 핸들러에서 사용자 정의 윈도우 메시지를 게시하는 것이 어떻습니까? 커버 아래에는 CoreDispatcher가하는 모든 일이 있습니다 (COM이 STA 창으로 돌아 가기 위해하는 일이기도합니다).

클래스에 대해 COM 크로스 아파트 마샬링을 반드시 사용해야하는 경우 모든 인터페이스에 대해 프록시/스텁 DLL을 등록해야합니다. 즉, WINMDIDL 도구를 사용하여 C++/CX 구성 요소와 연관된 winmd 파일에서 IDL 파일을 생성해야합니다. 그런 다음/winrt 명령 줄 스위치를 사용하여 MIDL 도구를 통해 해당 IDL 파일을 실행해야합니다. 그러면 프록시/스텁 DLL이 만들어 지므로 다른 COM 프록시/스텁 DLL을 등록하는 것처럼 해당 프록시/스텁 DLL을 등록 할 수 있습니다.