无法激活IDL中定义的投影类型 [英] Can't activate projected type defined in IDL
问题描述
我试图在IDL中定义Windows运行时类型,并使用其投影类型。从默认生成的 Blank App UWP项目(称为 Blank App )中,添加了 MyControl.idl :
I was trying to define a Windows Runtime type in IDL, and consume its projected type. Going from a default-generated Blank App UWP project (called "Blank App"), I added "MyControl.idl":
namespace BlankApp
{
[default_interface]
runtimeclass MyControl : Windows.UI.Xaml.Controls.Control
{
MyControl();
}
}
编译解决方案,然后复制 MyControl。 h 和 MyControl.cpp 从 Generated Files / sources 到项目根目录。
Compiled the solution, then copied MyControl.h and MyControl.cpp from Generated Files/sources to the project root directory.
I包括投影类型的标题,并将以下代码添加到 App :: OnLaunched
:
I included the header for the projected type and added the following code to App::OnLaunched
:
#include <winrt/BlankApp.h>
...
void App::OnLaunched(LaunchActivatedEventArgs const& e)
{
auto const myControl{ winrt::BlankApp::MyControl() };
...
这些都经过编译和链接。在运行时,它引发 hresult_error
(0x80040154:REGDB_E_CLASSNOTREG类未注册)。
This all compiled and linked fine. At runtime, it throws an hresult_error
(0x80040154: REGDB_E_CLASSNOTREG Class not registered).
调用堆栈的顶部位于引发异常的点看起来像这样:
The top of the callstack at the point the exception is raised looks like this:
BlankApp.exe!winrt::hresult_error::hresult_error(const HRESULT code=REGDB_E_CLASSNOTREG Class not registered, winrt::hresult_error::from_abi_t __formal={...}) Line 2977 C++ Symbols loaded.
BlankApp.exe!winrt::throw_hresult(const HRESULT result=REGDB_E_CLASSNOTREG Class not registered) Line 3211 C++ Symbols loaded.
BlankApp.exe!winrt::check_hresult(HRESULT result=REGDB_E_CLASSNOTREG Class not registered) Line 3261 C++ Symbols loaded.
BlankApp.exe!winrt::impl::get_activation_factory<winrt::BlankApp::MyControl,winrt::Windows::Foundation::IActivationFactory>() Line 7375 C++ Symbols loaded.
BlankApp.exe!winrt::impl::factory_cache_entry<winrt::BlankApp::MyControl,winrt::Windows::Foundation::IActivationFactory>::get() Line 7448 C++ Symbols loaded.
BlankApp.exe!winrt::get_activation_factory<winrt::BlankApp::MyControl,winrt::Windows::Foundation::IActivationFactory>() Line 7520 C++ Symbols loaded.
BlankApp.exe!winrt::BlankApp::MyControl::MyControl() Line 74 C++ Symbols loaded.
BlankApp.exe!winrt::BlankApp::implementation::App::OnLaunched(const winrt::Windows::ApplicationModel::Activation::LaunchActivatedEventArgs & e={...}) Line 50 C++ Symbols loaded.
module.g.cpp 是编译到应用程序中并包含以下代码:
module.g.cpp is compiled into the application and contains the following code:
HRESULT __stdcall WINRT_GetActivationFactory(HSTRING classId, void** factory)
{
try
{
*factory = nullptr;
wchar_t const* const name = WindowsGetStringRawBuffer(classId, nullptr);
if (0 == wcscmp(name, L"BlankApp.MainPage"))
{
*factory = winrt::detach_abi(winrt::make<winrt::BlankApp::factory_implementation::MainPage>());
return S_OK;
}
if (0 == wcscmp(name, L"BlankApp.MyControl"))
{
*factory = winrt::detach_abi(winrt::make<winrt::BlankApp::factory_implementation::MyControl>());
return S_OK;
}
#ifdef _WRL_MODULE_H_
return ::Microsoft::WRL::Module<::Microsoft::WRL::InProc>::GetModule().GetActivationFactory(classId, reinterpret_cast<::IActivationFactory**>(factory));
#else
return winrt::hresult_class_not_available().to_abi();
#endif
}
catch (...)
{
return winrt::to_hresult();
}
}
显然,我的类型未注册用于查找即使一切似乎都在所需的位置,Windows Runtime仍可以提供此功能。我缺少一些注册步骤吗?还是相对于Windows运行时组件,它甚至可以由UWP应用程序支持?
So apparently, my type wasn't registered for lookup by the Windows Runtime, even though everything seems to be where it needs to be. Is there some registration step I'm missing? Or is this even supported from a UWP application as opposed to a Windows Runtime Component?
推荐答案
您可能需要将类添加到appx清单。
You probably need to add the class to the appx manifest.
There's an example in the Extensions element documentation. The following Extension element needs to be added:
<Extensions>
<Extension Category="windows.activatableClass.inProcessServer">
<InProcessServer>
<Path>BlankApp.exe</Path>
<ActivatableClass ActivatableClassId="BlankApp.MyControl" ThreadingModel="both" />
</InProcessServer>
</Extension>
</Extensions>
要允许Windows运行时检索激活工厂,请使用 DllGetActivationFactory
符号也需要从可执行文件中导出。这可以通过将以下.def文件添加到项目中来完成:
To allow the Windows Runtime to retrieve an activation factory, the DllGetActivationFactory
symbol needs to be exported from the executable as well. This can be done by adding the following .def file to the project:
EXPORTS
DllCanUnloadNow = WINRT_CanUnloadNow PRIVATE
DllGetActivationFactory = WINRT_GetActivationFactory PRIVATE
这篇关于无法激活IDL中定义的投影类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!