고유 데스크톱 응용 프로그램 (/ 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에서 어떻게 작동하는지 모르지만 자동이 아닙니다.