C++ 试图访问UWP';来自C++;结果是;REGDB“未注册的E类NOTREG类”;错误
我的目标是让我的桌面应用程序在Windows 10上运行。作为测试,我在VisualStudio 2017中的股票C++控制台应用程序中尝试以下内容: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
#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-noWindows.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
,最后调用getIEmailMessage
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
键-noWindows.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
,最后调用getIEmailMessage
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
未注册,因为它不是类型。它是命名空间。