Windows — Как я могу вызвать функцию в C ++, когда я получаю ошибку WinRT / UWP «Активация однопоточного класса из MTA не поддерживается?»

При попытке вызвать однопоточную квартиру (STA) из «неправильного» потока (например, Clipboard::SetContent(...)), Я вижу следующее сообщение:

Активация однопоточного класса из MTA не поддерживается.

Неясно, какие функции являются STA, поэтому кажется, что они выглядят невинно выглядящими. Я не мог найти простой ответ, который объясняет шаги, чтобы это исправить. Сложно следовать документации по Windows COM.

Как я могу надежно определить, что такое функция STA, чтобы предотвратить эту ошибку? Разве нет простого решения?

0

Решение

Проблема в том, что поток, на котором вы сейчас работаете, — это 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);
}
)
);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]