Я пытаюсь реализовать настраиваемую активацию с помощью C.
В основном я создаю экземпляры ICoreApplication
и ICoreApplicationExit
(поэтому я могу выйти из приложения, если захочу - оно никогда не будет к этому моменту, однако).
Затем я вызываю Run
на моем ICoreApplication
экземпляре с моей собственной реализацией IFrameworkViewSource
и IFrameworkView
.
У указанной реализации есть причудливая материал для получения второго интерфейса из первого при вызове CreateView
и реализации методов Initialize
и Run
(в Run
я пытаюсь работать с MessageDialog).
Initialize
вызывает add_Activated
на applicationView
с настраиваемым обработчиком, который реализует Invoke
как InvokeActivated
.
InvokeActivated
вызывает get_CoreWindow
на отправителе и Activate
с ним.
Все вышеперечисленные функции возвращают S_OK при выходе.
Мой последний метод Run
пытается инициировать MessageDialog
с помощью ShowAsync
, который в моих тестах, кажется, возвращает S_OK
. Однако мой обработчик завершения никогда не вызывается, плюс мое приложение вообще не показывает никаких сообщений.
Вот только то, что я описал выше (активация. c):
#undef UNICODE
#define COBJMACROS
#include <stddef.h>
#include <Windows.Applicationmodel.Activation.h>
#include <Windows.ApplicationModel.core.h>
#include <windows.ui.xaml.h>
#include <roapi.h>
//#include <boost/preprocessor/repetition/repeat.hpp>
#define activateclassdirect(name, ptr, iid) activateclassdirect((name), sizeof (name), &(ptr), &(iid))
#define activateclasslight(name, ptr, iid) activateclasslight((name), sizeof (name), &(ptr), &(iid))
extern QueryInterface(), stub();
//#define initvtblwithstubs(z, n, text) n##[(int (**)())(&text)] = stub;
//BOOST_PP_REPEAT(9, DECL, 0)
struct IFrameworkViewCombinedStruct {
__x_ABI_CWindows_CApplicationModel_CCore_CIFrameworkViewSourceVtbl* lpIFrameworkViewSourceVtbl;
const IID* IFrameworkViewSourceInterfaceIID;
__x_ABI_CWindows_CApplicationModel_CCore_CIFrameworkViewVtbl* lpIFrameworkViewVtbl;
const IID* IFrameworkViewInterfaceIID, markend;
};
static HRESULT CreateView(
struct IFrameworkViewCombinedStruct* This,
/* [retval, out] */__RPC__deref_out_opt __x_ABI_CWindows_CApplicationModel_CCore_CIFrameworkView** viewProvider
)
{
*viewProvider = &This->lpIFrameworkViewVtbl;
return S_OK;
}
__x_ABI_CWindows_CUI_CCore_CICoreWindow* pCoreWindow;
HRESULT InvokeActivated(__RPC__in __FITypedEventHandler_2_Windows__CApplicationModel__CCore__CCoreApplicationView_Windows__CApplicationModel__CActivation__CIActivatedEventArgs* This,
/* [in] */ __RPC__in_opt __x_ABI_CWindows_CApplicationModel_CCore_CICoreApplicationView* sender,
/* [in] */ __RPC__in_opt __x_ABI_CWindows_CApplicationModel_CActivation_CIActivatedEventArgs* e)
{
__x_ABI_CWindows_CApplicationModel_CCore_CICoreApplicationView_get_CoreWindow(sender, &pCoreWindow);
HRESULT debug = __x_ABI_CWindows_CUI_CCore_CICoreWindow_Activate(pCoreWindow);
return S_OK;
}
HRESULT Initialize(
__x_ABI_CWindows_CApplicationModel_CCore_CIFrameworkView* This,
/* [in] */__RPC__in_opt __x_ABI_CWindows_CApplicationModel_CCore_CICoreApplicationView* applicationView
)
{
static __FITypedEventHandler_2_Windows__CApplicationModel__CCore__CCoreApplicationView_Windows__CApplicationModel__CActivation__CIActivatedEventArgsVtbl
activationhandlervtbl = { QueryInterface, stub, stub, InvokeActivated };
static struct {
__FITypedEventHandler_2_Windows__CApplicationModel__CCore__CCoreApplicationView_Windows__CApplicationModel__CActivation__CIActivatedEventArgs;
const IID* pImplements, markend;
} activationhandlerimpl = { &activationhandlervtbl,
&IID___FITypedEventHandler_2_Windows__CApplicationModel__CCore__CCoreApplicationView_Windows__CApplicationModel__CActivation__CIActivatedEventArgs };
EventRegistrationToken sometoken;
__x_ABI_CWindows_CApplicationModel_CCore_CICoreApplicationView_add_Activated(applicationView, &activationhandlerimpl, &sometoken);
return S_OK;
}
__x_ABI_CWindows_CApplicationModel_CCore_CICoreApplication* pApp;
__x_ABI_CWindows_CApplicationModel_CCore_CICoreApplicationExit* pAppExit;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow)
{
RoInitialize(RO_INIT_MULTITHREADED);
extern Run();
static __x_ABI_CWindows_CApplicationModel_CCore_CIFrameworkViewSourceVtbl appviewsourcevtbl = { QueryInterface,stub,stub , stub, stub, stub, CreateView };
static __x_ABI_CWindows_CApplicationModel_CCore_CIFrameworkViewVtbl appviewvtbl = { QueryInterface,stub,stub , stub, stub, stub, stub, stub, stub, stub, stub,
.Initialize = Initialize, .Run = Run };
static struct IFrameworkViewCombinedStruct appviewimpl = { &appviewsourcevtbl, &IID___x_ABI_CWindows_CApplicationModel_CCore_CIFrameworkViewSource,
&appviewvtbl, &IID___x_ABI_CWindows_CApplicationModel_CCore_CIFrameworkView };
activateclassdirect(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication, pApp, IID___x_ABI_CWindows_CApplicationModel_CCore_CICoreApplication);
activateclassdirect(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication, pAppExit, IID___x_ABI_CWindows_CApplicationModel_CCore_CICoreApplicationExit);
__x_ABI_CWindows_CApplicationModel_CCore_CICoreApplication_Run(pApp, &appviewimpl);
return 0;
}
И (mainlogi c. c):
#undef UNICODE
#define COBJMACROS
#include <stddef.h>
#include <stdbool.h>
#include <windows.ui.popups.h>
#include <windows.ui.xaml.h>
#include <windows.ui.core.h>
#define activateclassdirect(name, ptr, iid) activateclassdirect((name), sizeof (name), &(ptr), &(iid))
#define activateclasslight(name, ptr, iid) activateclasslight((name), sizeof (name), &(ptr), &(iid))
extern QueryInterface(), stub();
extern HSTRING createreference(string, sizeofstring);
#define createreference(string) createreference((string), sizeof (string))
extern __x_ABI_CWindows_CApplicationModel_CCore_CICoreApplication* pApp;
extern __x_ABI_CWindows_CApplicationModel_CCore_CICoreApplicationExit* pAppExit;
extern __x_ABI_CWindows_CUI_CCore_CICoreWindow* pCoreWindow;
HANDLE hEvent;
static EndWait()
{
SetEvent(hEvent);
return S_OK;
}
HRESULT Run(
__x_ABI_CWindows_CApplicationModel_CCore_CIFrameworkView* This
)
{
//__x_ABI_CWindows_CApplicationModel_CCore_CIFrameworkView_SetWindow(This, pCoreWindow);
hEvent = CreateEvent(0, false, false, 0);
__x_ABI_CWindows_CUI_CPopups_CIMessageDialogFactory* pMsgDiagFact;
__x_ABI_CWindows_CUI_CPopups_CIMessageDialog* pMsgDiag;
activateclassdirect(RuntimeClass_Windows_UI_Popups_MessageDialog, pMsgDiagFact, IID___x_ABI_CWindows_CUI_CPopups_CIMessageDialogFactory);
__x_ABI_CWindows_CUI_CPopups_CIMessageDialogFactory_Create(pMsgDiagFact, createreference(L"HelloUWPFromC"), &pMsgDiag);
IInspectable_Release(pMsgDiagFact);
__FIAsyncOperation_1_Windows__CUI__CPopups__CIUICommand* pAsyncCommand;
HRESULT debug = __x_ABI_CWindows_CUI_CPopups_CIMessageDialog_ShowAsync(pMsgDiag, &pAsyncCommand);
__FIAsyncOperationCompletedHandler_1_Windows__CUI__CPopups__CIUICommandVtbl msgcompletedvtbl = { QueryInterface, stub, stub, EndWait };
struct { __FIAsyncOperationCompletedHandler_1_Windows__CUI__CPopups__CIUICommand; const IID* implements, endmark; } msgcompletedhandler = { &msgcompletedvtbl , &IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CPopups__CIUICommand };
__FIAsyncOperation_1_Windows__CUI__CPopups__CIUICommand_put_Completed(pAsyncCommand, &msgcompletedhandler);
WaitForSingleObject(hEvent, INFINITE);
__x_ABI_CWindows_CApplicationModel_CCore_CICoreApplicationExit_Exit(pAppExit);
//__x_ABI_CWindows_CUI_CXaml_CIApplication_Exit(pApp);
}
И еще c (активация обычно. c):
#undef UNICODE
#define COBJMACROS
#include <stddef.h>
#include <windows.ui.xaml.h>
#include <roapi.h>
activateclassdirect(name, sizeofname, ptr, piid) const wchar_t* name; size_t sizeofname; char** ptr; const IID* piid;
{
HSTRING_HEADER header;
HSTRING string;
WindowsCreateStringReference(name, sizeofname / sizeof(wchar_t) - 1, &header, &string);
const HRESULT debug = RoGetActivationFactory(string, piid, ptr);
}
activateclasslight(name, sizeofname, ptr, piid) const wchar_t* name; size_t sizeofname; char** ptr; const IID* piid;
{
HSTRING_HEADER header;
HSTRING string;
IInspectable* pObjInspect;
WindowsCreateStringReference(name, sizeofname / sizeof(wchar_t) - 1, &header, &string);
const HRESULT debug = RoActivateInstance(string, &pObjInspect);
IInspectable_QueryInterface(pObjInspect, piid, ptr);
IInspectable_Release(pObjInspect);
}
HRESULT stub() { return S_OK; }
HRESULT QueryInterface(This, riid, ppvObject) //query for our own handlers
struct { char* lpVtblornull; const IID* implement; }*This; REFIID riid; char** ppvObject;
{
if (!ppvObject) return E_POINTER;
if (!memcmp(riid, &IID_IUnknown, sizeof * riid) ||
!memcmp(riid, &IID_IInspectable, sizeof * riid))
return *ppvObject = This, S_OK;
while (This->lpVtblornull)
if (!memcmp(riid, This->implement, sizeof * riid))
return *ppvObject = This, S_OK;
else ++This;
return E_NOINTERFACE;
}
HSTRING createreference(string, sizeofstring) const wchar_t* string; size_t sizeofstring;
{
HSTRING_HEADER header;
HSTRING newstring;
WindowsCreateStringReference(string, sizeofstring / sizeof(wchar_t) - 1, &header, &newstring);
return newstring;
}
Также здесь Страница GitHub этого образца.
Обратите внимание, что я создаю x86-64
- поэтому я пропустил __stdcall в моих методах обработчиков.
РЕДАКТИРОВАТЬ обновленный GitHub с тестом DirectX12, но все же не может пройти мимо экрана spla sh, и обработчик, который я добавил на этот раз в CoreWindow OnActivatedWindow
, никогда не срабатывает.