尝试从C++访问 UWP 的电子邮件邮件类会导致"REGDB_E_CLASSNOTREG类未注册"错误
Trying to access UWP's EmailMessage class from C++ results in "REGDB_E_CLASSNOTREG Class not registered" error
我的目标是使用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();
}
//...
}
- 没有找到相关文章