При попытке вызвать однопоточную квартиру (STA) из «неправильного» потока (например, Clipboard::SetContent(...)
), Я вижу следующее сообщение:
Активация однопоточного класса из MTA не поддерживается.
Неясно, какие функции являются STA, поэтому кажется, что они выглядят невинно выглядящими. Я не мог найти простой ответ, который объясняет шаги, чтобы это исправить. Сложно следовать документации по Windows COM.
Как я могу надежно определить, что такое функция STA, чтобы предотвратить эту ошибку? Разве нет простого решения?
Проблема в том, что поток, на котором вы сейчас работаете, — это MTA (многопоточная квартира), и он не поддерживает вызовы STA.
Исправление заключается в отправке вызова из основного потока / потока пользовательского интерфейса, который всегда является 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);
}
)
);
Других решений пока нет …