C++ 试图访问UWP';来自C++;结果是;REGDB“未注册的E类NOTREG类”;错误

C++ 试图访问UWP';来自C++;结果是;REGDB“未注册的E类NOTREG类”;错误,c++,winapi,uwp,C++,Winapi,Uwp,我的目标是让我的桌面应用程序在Windows 10上运行。作为测试,我在VisualStudio 2017中的股票C++控制台应用程序中尝试以下内容: #include <Windows.h> #include <roapi.h> #pragma comment(lib, "runtimeobject.lib") #include <Windows.Services.Store.h> #include <wrl.h> using namespac

我的目标是让我的桌面应用程序在Windows 10上运行。作为测试,我在VisualStudio 2017中的股票C++控制台应用程序中尝试以下内容:

#include <Windows.h>
#include <roapi.h>
#pragma comment(lib, "runtimeobject.lib")
#include <Windows.Services.Store.h>
#include <wrl.h>

using namespace ABI::Windows::Foundation;
using namespace ABI::Windows::Services::Store;
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;
using namespace ABI::Windows::System;
using namespace ABI::Windows::Foundation::Collections;
using namespace ABI::Windows::ApplicationModel::Email;


HRESULT hr;
if(SUCCEEDED(hr = RoInitialize(RO_INIT_MULTITHREADED)))
{
    ComPtr<IEmailMessage> pEmlMsg;
    hr = RoGetActivationFactory(HStringReference(L"Windows.ApplicationModel.Email").Get(), __uuidof(pEmlMsg), &pEmlMsg);
    if (SUCCEEDED(hr) &&
        pEmlMsg)
    {
        //... keep going

    }
    else
        wprintf(L"ERROR: 0x%x RoGetActivationFactory\n", hr);

    RoUninitialize();
}
#包括
#包括
#pragma注释(lib,“runtimeobject.lib”)
#包括
#包括
使用名称空间ABI::Windows::Foundation;
使用名称空间ABI::Windows::Services::Store;
使用名称空间Microsoft::WRL;
使用名称空间Microsoft::WRL::Wrappers;
使用名称空间ABI::Windows::System;
使用名称空间ABI::Windows::Foundation::Collections;
使用名称空间ABI::Windows::ApplicationModel::Email;
HRESULT-hr;
if(成功(hr=RoInitialize(RO_INIT_多线程)))
{
ComPtr pEmlMsg;
hr=RoGetActivationFactory(HStringReference(L“Windows.ApplicationModel.Email”).Get()、u uuidof(pEmlMsg)和pEmlMsg);
如果成功(hr)&&
pEmlMsg)
{
//…继续
}
其他的
wprintf(L“错误:0x%x RogeActivationFactory\n”,hr);
RoUninitialize();
}
但是我上面的调用总是返回
REGDB\u E\u CLASSNOTREG Class notregister

你知道我错过了什么吗


另外,我正在Windows 10 v.1903 build 18362.239上测试它,
REGDB_E_CLASSNOTREG
类没有注册,因为“Windows.ApplicationModel.Email”确实没有注册。(在
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId
key-no
Windows.ApplicationModel.Email
subkey下查看此处)

代码中有2个错误,而不是自字符串“Windows.ApplicationModel.Email”-您需要使用在某些winrt头文件中定义的
RuntimeClass.*
字符串。你需要使用

RuntimeClass\u Windows\u应用程序模型\u Email\u EmailMessage

它在Windows.ApplicationModel.email.h中声明

然后,
RoGetActivationFactory
无法返回
IEmailMessage
direct。它可以返回接口(您可以通过调用
RoGetActivationFactory
函数获得
IActivationFactory
指针),然后您需要调用get指针指向
IInspectable
,最后调用get
IEmailMessage
QueryInterface

因此,最好(如果您需要
IEmailMessage
的单个实例)使用此处。代码可以是下一个

#include <winstring.h>
#include <roapi.h>
#include <Windows.ApplicationModel.email.h>

void CALLBACK ep(void*)
{
    if (0 <= RoInitialize(RO_INIT_MULTITHREADED))
    {
        HSTRING_HEADER hsh;
        HSTRING activatableClassId;
        IInspectable* instance;
        ABI::Windows::ApplicationModel::Email::IEmailMessage* pEmlMsg;

        WindowsCreateStringReference(RuntimeClass_Windows_ApplicationModel_Email_EmailMessage, 
            _countof(RuntimeClass_Windows_ApplicationModel_Email_EmailMessage) - 1, 
            &hsh, &activatableClassId);

        if (0 <= RoActivateInstance(activatableClassId, &instance))
        {
            HRESULT hr = instance->QueryInterface(IID_PPV_ARGS(&pEmlMsg));

            instance->Release();

            if (0 <= hr)
            {
                //...
                // some demo usage
                static const WCHAR body[] = L"-- demo --";
                WindowsCreateStringReference(body, _countof(body) - 1, &hsh, 
                         &activatableClassId);

                if (0 <= pEmlMsg->put_Body(activatableClassId))
                {
                    if (0 <= pEmlMsg->get_Body(&activatableClassId))
                    {
                        DbgPrint("%S\n", 
                           WindowsGetStringRawBuffer(activatableClassId, 0));

                        WindowsDeleteString(activatableClassId);
                    }
                }

                pEmlMsg->Release();
            }
        }

        RoUninitialize();
    }
    //...
}
#包括
#包括
#包括
无效回调ep(无效*)
{
if(0 Release();
if(0 Release();
}
}
RoUninitialize();
}
//...
}

由于“Windows.ApplicationModel.Email”确实未注册,您的
REGDB\u E\u CLASSNOTREG
类未注册。(请查看
HKEY\u LOCAL\u MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId
键-no
Windows.ApplicationModel.Email
子键)

代码中有2个错误,而不是自字符串“Windows.ApplicationModel.Email”-您需要使用在某些winrt头文件中定义的
RuntimeClass.*
字符串。您需要使用

RuntimeClass\u Windows\u应用程序模型\u Email\u EmailMessage

它在Windows.ApplicationModel.email.h中声明

然后,
RoGetActivationFactory
无法直接返回
IEmailMessage
它可以返回接口(您可以通过调用
RoGetActivationFactory
函数获得
IActivationFactory
指针)然后需要调用get指针,指向
IInspectable
,最后调用get
IEmailMessage
QueryInterface

所以最好(如果您需要
IEmailMessage
的单个实例)使用这里。接下来可以使用代码

#include <winstring.h>
#include <roapi.h>
#include <Windows.ApplicationModel.email.h>

void CALLBACK ep(void*)
{
    if (0 <= RoInitialize(RO_INIT_MULTITHREADED))
    {
        HSTRING_HEADER hsh;
        HSTRING activatableClassId;
        IInspectable* instance;
        ABI::Windows::ApplicationModel::Email::IEmailMessage* pEmlMsg;

        WindowsCreateStringReference(RuntimeClass_Windows_ApplicationModel_Email_EmailMessage, 
            _countof(RuntimeClass_Windows_ApplicationModel_Email_EmailMessage) - 1, 
            &hsh, &activatableClassId);

        if (0 <= RoActivateInstance(activatableClassId, &instance))
        {
            HRESULT hr = instance->QueryInterface(IID_PPV_ARGS(&pEmlMsg));

            instance->Release();

            if (0 <= hr)
            {
                //...
                // some demo usage
                static const WCHAR body[] = L"-- demo --";
                WindowsCreateStringReference(body, _countof(body) - 1, &hsh, 
                         &activatableClassId);

                if (0 <= pEmlMsg->put_Body(activatableClassId))
                {
                    if (0 <= pEmlMsg->get_Body(&activatableClassId))
                    {
                        DbgPrint("%S\n", 
                           WindowsGetStringRawBuffer(activatableClassId, 0));

                        WindowsDeleteString(activatableClassId);
                    }
                }

                pEmlMsg->Release();
            }
        }

        RoUninitialize();
    }
    //...
}
#包括
#包括
#包括
无效回调ep(无效*)
{
if(0 Release();
if(0 Release();
}
}
RoUninitialize();
}
//...
}

该类型似乎没有该属性。您确定它可以用于不在应用程序容器中运行的应用程序吗?@IInspectable-可以使用,但需要使用
RuntimeClass\u Windows\u ApplicationModel\u Email\u EmailMessage
“Windows.ApplicationModel.Email”和
RoGetActivationFactory
返回
IActivationFactory
接口,但不是
IEmailMessage
类型似乎没有该属性。您确定它可以在应用程序中使用,而不是在应用程序容器中运行吗?@IInspectable-可以使用,但需要使用
RuntimeClass\u Windows\u ApplicationModel\u Email\u EmailMessage
而不是
“Windows.ApplicationModel.Email”
RoGetActivationFactory
返回
IActivationFactory
界面,但不返回
IEmailMessage
,或者,如果您喜欢:
winrt::Windows::ApplicationModel::Email::EmailMessage msg{};msg.Body(L“几乎没有足够的样板文件!”);
。另外,
Windows.ApplicationModel.Email
没有注册,因为它不是一个类型。它是一个名称空间。或者,如果您喜欢:
winrt::Windows::ApplicationModel::Email::EmailMessage msg{};msg.Body(L“几乎没有足够的样板文件!”);
。另外,
Windows.ApplicationModel.Email
未注册,因为它不是类型。它是命名空间。