根据 cppwinrt、迁移 C++... 的主文档,“设置 Windows 运行时属性值的等效 C++/WinRT 源代码调用与 Windows 运行时属性同名的方法以及新值的参数:
record.UserState(newValue); // Set the UserState property
Run Code Online (Sandbox Code Playgroud)
但是,当尝试设置 Duration 对象的 TimeSpan 属性时,这似乎不起作用:
TimeSpan ts = TimeSpan(6000000);
Duration duration = Duration();
duration.TimeSpan(ts);
Run Code Online (Sandbox Code Playgroud)
第三行在“duration”上产生一个智能感知错误:“调用类类型的对象,而没有适当的运算符或将函数转换为指针函数类型。” 同一行的构建错误是“Term 不计算为采用 1 个参数的函数”。我应该补充一点,Duration 的构造函数似乎有一个参数,即 TimeSpan,但这也不被接受。使用 cppwinrt 时如何设置 Duration 的 TimeSpan 属性?
我需要在我的cppwinrt项目中使用win2D.使用Win2D示例文件作为模型,我试图模仿它的设置,从该项目中输入win2d的包文件,复制自定义构建步骤,但我无法编译它.我记得一些关于Win2D很快被添加到标准cppwinrt头文件的讨论,以便可以像其他这些精彩的cppwinrt接口一样访问它.这可能很快就会发生吗?或者是否有人在当前的Visual Studio 2017环境中有一些非常具体的使用Win2D的说明?我在Insider预览程序中但没有看到任何东西出现.谢谢.
为文本块创建实体画笔 (cppwinrt) 时,我在构建时出错,使用:
void MainPage::myStyle(Controls::TextBlock & block)
{
block.FontSize(72.0);
block.Foreground(Media::SolidColorBrush(Windows::UI::Colors::Orange()));
block.VerticalAlignment(VerticalAlignment::Center);
}
Run Code Online (Sandbox Code Playgroud)
错误:LNK2019 未解析的外部符号“public: __thiscall winrt::Windows::UI::Xaml::Media::SolidColorBrush::SolidColorBrush(struct winrt::Windows::UI::Color const &)”
当我取出solidbrush 时出现错误,我也尝试过其他版本的solidbrush,但出现相同错误。
当我在 Visual Studio 2022 中生成新的 WinRT 项目时,出现错误 E1696 无法打开源文件“winrt/Windows.Foundation.h”,但当我查看包含目录时,文件确实存在于正确的位置。
我想知道下面的代码是否是有效的 C++ 代码,或者如果不使用co_return会导致未定义的行为。
IAsyncAction MyClass::MyCoroutine()
{
co_await someOtherClassInstance.SomeCoroutine();
}
Run Code Online (Sandbox Code Playgroud)
即是否需要将代码调整如下?
IAsyncAction MyClass::MyCoroutine()
{
co_await someOtherClassInstance.SomeCoroutine();
co_return;
}
Run Code Online (Sandbox Code Playgroud)
如果行为不是未定义的,那么最佳实践是什么(总是添加co_return或不添加)以及这样做的理由是什么?
您能用自己的话解释一下这意味着什么吗:Windows 运行时 API (WinRT) 的标准 C++17 语言投影(欢迎提供示例)?
在microsovt网站上,一切都描述得很复杂,我无法理解这个术语
我有一个运行时类,我想向其中添加一个枚举。我已经按照此处的 MSDN 文档的建议尝试了以下语法:https : //docs.microsoft.com/en-ca/uwp/midl-3/intro
namespace my_project
{
runtimeclass my_rt_class
{
enum my_enum
{
first = 0,
second = 1
};
}
}
Run Code Online (Sandbox Code Playgroud)
但是我从 MIDL 收到以下错误:
error MIDL2025: [msg]syntax error [context]: expecting an identifier near ";"
Run Code Online (Sandbox Code Playgroud)
什么是正确的语法?我正在使用10.0.17763.0Windows SDK 的版本。
只是谷歌搜索或duckduckgo'ing
未解析的外部符号
IID_ICallbackWithNoReentrancyToApplicationSTA
仅产生一个直接命中,甚至对报告问题的人员都没有帮助,因此我希望一些C ++ / WinRT人员遇到此问题。
虽然不能共享所有源(大量交织的专有文件),但可以共享场景和代码更改的细目分类。而且,几乎没有IID_ICallbackWithNoReentrancyToApplicationSTA任何地方提及。巧合的是,它在GitHub上出现了一些Kenny Kerr的东西。我遇到问题的项目是C ++ / WinRT项目,因此这似乎是一个相关的陷阱,尤其是因为其中提到的xlang部分应该是C ++ / WinRT的抽象。
方案:一个Core UAP C ++ / WinRT应用程序/服务正在使用C ++ / WinRT库。尝试在构建应用程序/服务时使用库创建的库时,构建会中断。
代码更改:我在库中实现了一些PPL任务,特别是一些任务,concurrency::task<void>对由应用程序/服务使用的C ++ / WinRT库中使用的新线程执行一些I / O。这是一个std :: thread,它使用lambda来获取对象的副本并执行I / O。像这样:
std::thread writer([content_vector, json_string, content_file_name, json_file_name]() {
auto write_content = Helper_IO::Overwrite_Lines_Concurrent(content_file_name, content_vector);
auto write_json = Helper_IO::Overwrite_File_Concurrent(json_file_name, json_string);
write_content.get();
write_json.get();
});
Run Code Online (Sandbox Code Playgroud)
Helper_IO::Overwrite_*_Concurrent 都是静态的并且都返回一个 concurrency::task<void>
我尝试使用writer.detach()和writer.join(),但结果是相同的。
首先:我知道一个包含“建议”的问题标题会引起反对票和“非建设性”标志,但如果您先阅读本文并考虑到我在以下方面面临具体问题,我会很高兴可访问的学习材料/文档。
ATM 我正在尝试将我现有的应用程序从 Linux 扩展到 Windows。结构基本上由包含多个静态本机 C++ 库的后端核心组成,我从前端项目(带有其他语言的 C/C++ GTK)中调用这些库。恕我直言,通过使用 core-C++ 库并将它们插入到不同平台特定的前端,将此类项目扩展到其他平台应该是一个非常普遍的计划。现在,在这种情况下,这将是一个 UWP 项目。
让我感到困惑的是微软与 C# 互操作策略的看似不一致的、目前正在转换的景观,特别是 C++/CX 和 C++/WinRT。我正在努力解决的中心问题是:在 UWP 应用程序中实现本机 C++ 库(也将它们作为项目嵌入到 Visual Studio 中以在 Windows 上提供本机构建体验和依赖项管理)的最佳方法是什么?C++/WinRT 似乎非常关注 WinRT 消耗(这是有道理的,因为它应该是这样的!)。C++/CX 似乎已被正式放弃和弃用,当您在 VS 中选择 Visual C++ 库项目时,它会自动引用 VC++ 库,这些库不是本机的,我担心某种中间层会妨碍您。
对于这种情况,必须有某种工业最佳实践,不是吗?
我有一个 C++/WinRT/UWP 项目。我需要 HWND 和 HINSTANCE 才能正确初始化直接输入,否则 DirectInput 只能枚举键盘和鼠标,而不是操纵杆。不要问我为什么,我什至尝试从 HInstance 中获取 TopMostWindow GetModule,从我的 C++/WinRT/UWP 应用程序运行时它仅返回 NULL,但从控制台应用程序运行时有效。
文档https://learn.microsoft.com/en-us/windows/win32/api/corewindow/nn-corewindow-icorewindowinterop 我不知道如何将我的 CoreWindow 转换为 ICoreWindowInterop。CComPtr 不可用,并且在 C++/WinRT 中不可用,与 IUnkwnown 冲突。
在方法 App::OnLaunched(LaunchActivatedEventArgs const& e) 中,我得到这样的当前窗口
CoreWindow w = Window::Current().CoreWindow().GetForCurrentThread();
然后我不知道如何从中获取ICoreWindowInterop。CoreWindow 是一个 ICoreWindow ,但我在 Microsoft 文档中没有看到任何解释:/
我尝试强制转换并重新解释强制转换,但没有成功(编译错误)。我不是 COM/Windows 专家,所以我现在很迷茫。
感谢您的帮助干杯,Seb
下面是所涉及的测试代码:
// When the client needs to fetch data from the cloud, this method will be called.
// The FakeMirrorDataMover class does the actual work of copying files from
// the "cloud" to the "client" and updating the transfer status along the way.
void CALLBACK FakeCloudProvider::OnFetchData(
_In_ CONST CF_CALLBACK_INFO* callbackInfo,
_In_ CONST CF_CALLBACK_PARAMETERS* callbackParameters)
{
//FileCopierWithProgress::CopyFromServerToClient(callbackInfo, callbackParameters, ProviderFolderLocations::GetServerFolder());
const UINT CHUNKSIZE = 48 * 1024 * 1024;
UINT len;
LONG64 offset = callbackParameters->FetchData.RequiredFileOffset.QuadPart;
LONG64 requiredLength = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 DirectX11/XAML UWP 模板移植到 C++-WinRT 版本...其中一切都是通过 C++-WinRT 完成的,我可以关闭 CX。
我目前陷入了如何ResizeBuffers使用交换链的困境。我不断收到错误消息,提示我尚未释放所有缓冲区引用。如果我注释掉与调整缓冲区大小有关的任何内容并仅硬编码大小,则该应用程序可以正常工作。所以...我可能做错了什么。
我相信这与新的winrt::com_ptr. 没有Reset像 WRL ComPtr 上那样的方法。我已将它们设置为nullptr与原始 C++/CX 模板中一样,但这似乎还不够。
我必须做的其他事情可能会影响正在发生的事情:
DeviceResources 类现在是一个 C++/WinRT 类,我使用 nullptr_t 参数在所有其他类(SampleScene3DRenderer、DirectXPage 和 Main)中默认创建该类。这样,我可以在 DirectXPage 中创建它,传入 swapChainPanel 引用,然后将这个 DeviceResources 实例传递给我创建的所有其他类。
在 DirectX 初始化中有一个地方您必须传入**IUnknown. C++/WinRT 的文档提到使用调用的函数winrt::get_unknown来返回*IUnknown. 我无法让它适用于以下DWriteCreateFactory方法,所以我尝试了这种方式:
DX::ThrowIfFailed(
DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory3),
reinterpret_cast<::IUnknown**>(m_dwriteFactory.put())
)
);
Run Code Online (Sandbox Code Playgroud)我不知道还能做什么。只有交换链调整大小不起作用。我是在 PC 上(不是 Windows Phone)执行此操作。