当我得到WinRT/UWP错误时,如何在C++中调用函数“不支持从MTA激活单线程类?”

当我得到WinRT/UWP错误时,如何在C++中调用函数“不支持从MTA激活单线程类?”

问题描述:

当试图调用一个单线程公寓从“错误”的线程(Clipboard::SetContent(...)),我看到以下消息(STA)功能:当我得到WinRT/UWP错误时,如何在C++中调用函数“不支持从MTA激活单线程类?”

激活单线程类从MTA是不支持。

不清楚哪些功能是STA,所以它似乎只是从看似无辜的功能中跳出来。我无法找到解释解决问题的步骤的简单答案。 Windows COM文档很难遵循。

如何可靠地识别什么是STA功能以防止此错误?是不是有一个简单的修复?

+1

Quote:“这个类不是敏捷的,这意味着你需要考虑它的线程模型和编组行为,更多信息请参见...”。也许它听起来很糟糕,但过了一段时间,你会看到文档和异常之间的联系。通过“看见”说明中的链接,告诉你该怎么做。 –

+0

是的,我仔细研究了下面的答案。增加这个问题的意思是让其他人在踏上STA/MTA地雷时留下那些创伤。 –

问题是您当前正在运行的线程是MTA(多线程单元),并且不支持STA调用。

修复方法是从主/ UI线程调度呼叫,该线程总是STA,因此支持STA呼叫。

首先,通过MainView->CoreWindow获得您想要的线程,然后调用该线程的调度程序来调用您想要运行的任何内容。例如:

using namespace Windows::UI::Core; 
using namespace Windows::ApplicationModel::Core; 
using namespace Windows::ApplicationModel::DataTransfer; 

CoreWindow^ window = CoreApplication::MainView->CoreWindow;   
window->Dispatcher->RunAsync(CoreDispatcherPriority::Normal, 
    ref new DispatchedHandler 
    (
     [wstringForClipboard] 
     { 
      DataPackage^ clipboardInfo = ref new DataPackage; 
      clipboardInfo->SetText(ref new Platform::String(wstringForClipboard.c_str())); 
      Clipboard::SetContent(clipboardInfo); 
     } 
    ) 
); 
+0

如果您已解决了您的问题,请将其标记为稍后访问此主题的方便的人员接受,谢谢理解。 –