尝试从C++访问 UWP 的电子邮件邮件类会导致"REGDB_E_CLASSNOTREG类未注册"错误

Trying to access UWP's EmailMessage class from C++ results in "REGDB_E_CLASSNOTREG Class not registered" error

本文关键字:REGDB CLASSNOTREG 错误 注册 UWP 访问 电子邮件 C++      更新时间:2023-10-16

我的目标是使用EmailMessage类让我的桌面应用程序的用户与Windows 10上的Windows Mail应用程序进行交互。作为测试,我正在从Visual Studio 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 RoGetActivationFactoryn", hr);
RoUninitialize();
}

但是我上面的RoGetActivationFactory电话总是返回REGDB_E_CLASSNOTREG Class not registered.

知道我在那里错过了什么吗?

附言。我正在Windows 10 v.1903 build 18362.239上测试它.

你得到REGDB_E_CLASSNOTREG类没有注册,因为"Windows.ApplicationModel.Email"真的没有注册。(在HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsRuntimeActivatableClassId键下查看 - 这里没有Windows.ApplicationModel.Email子项(

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

RuntimeClass_Windows_ApplicationModel_Email_EmailMessage

Windows.ApplicationModel.email.h中声明

那么RoGetActivationFactory不能直接返回IEmailMessage。 它可以返回IActivationFactory接口(您可以通过调用RoGetActivationFactory函数来获取IActivationFactory指针。(,然后你需要调用IActivationFactory::ActivateInstance获取指向IInspectable的指针,最后QueryInterface它以获取IEmailMessage

所以更好(如果您需要IEmailMessage的单个实例(在此处使用RoActivateInstance。 代码可以是下一个

#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("%Sn", 
WindowsGetStringRawBuffer(activatableClassId, 0));
WindowsDeleteString(activatableClassId);
}
}
pEmlMsg->Release();
}
}
RoUninitialize();
}
//...
}
相关文章:
  • 没有找到相关文章