Любые идеи, почему приведенный выше код не может создать экземпляр класса. Я пытаюсь использовать WinRT в приложении для Windows, и здесь приведен фрагмент кода, он терпит неудачу, когда комментируется с помощью «!»:
#include <Roapi.h>
#include <Winstring.h>
#include <Windows.h>
#include <windows.ui.popups.h>
#include <windows.foundation.h>
inline void CheckHresult(HRESULT hr)
{
if (FAILED(hr))
{
DebugBreak();
}
}
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
CheckHresult(RoInitialize(RO_INIT_MULTITHREADED));
static const wchar_t ClassName[] = L"Windows.UI.Popups.MessageDialog";
HSTRING hClassStr, hStr;
CheckHresult(WindowsCreateString(ClassName, sizeof(ClassName) / sizeof(ClassName[0]) - 1, &hClassStr));
ABI::Windows::UI::Popups::IMessageDialog* pClass;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
CheckHresult(RoActivateInstance(hClassStr, (IInspectable**)&pClass)); //here it fails with E_NOTIMPL !!!!!!!!!!
WindowsDeleteString(hClassStr);
static const wchar_t msgTitleName [] = L"Metro Message Box!";
CheckHresult(WindowsCreateString(msgTitleName, sizeof(msgTitleName) / sizeof(msgTitleName[0]) - 1, &hStr));
CheckHresult(pClass->put_Title(hStr));
WindowsDeleteString(hStr);
static const wchar_t msgContent [] = L"Hello Metro.";
CheckHresult(WindowsCreateString(msgContent, sizeof(msgContent) / sizeof(msgContent[0]) - 1, &hStr));
CheckHresult(pClass->put_Content(hStr));
WindowsDeleteString(hStr);
CheckHresult(pClass->ShowAsync(nullptr));
}
Я понятия не имею, почему это происходит.
РЕДАКТИРОВАТЬ:
Функция «RoActivateInstance» не удается активировать экземпляр класса с именем ‘Windows.UI.Popups.MessageDialog’ с HRESULT ‘E_NOTIMPL’.
Если вы посмотрите внизу страницы MSDN, на которую вы ссылаетесь, то там написано, что Минимально поддерживаемый клиент — Windows 8 Магазин приложений только.
API не поддерживается в обычной настольной программе.