UWP не отображает диалоговое сообщение - пользовательская активация - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь реализовать настраиваемую активацию с помощью C.

В основном я создаю экземпляры ICoreApplication и ICoreApplicationExit (поэтому я могу выйти из приложения, если захочу - оно никогда не будет к этому моменту, однако).

Затем я вызываю Run на моем ICoreApplication экземпляре с моей собственной реализацией IFrameworkViewSource и IFrameworkView.

У указанной реализации есть причудливая материал для получения второго интерфейса из первого при вызове CreateView и реализации методов Initialize и RunRun я пытаюсь работать с 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, никогда не срабатывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...