Comments (3)
This example program does not initialize the MTA in the process. The background tasks therefore run outside the MTA and the "you didn't initialize COM" error is raised.
The call to foo
works around this issue because the implementation of StorageFolder::GetFolderFromPathAsync has a side effect of initializing the MTA in the process.
I think the appropriate fix would be to have your code initialize the MTA before it tries to use it. One way that can be done is by calling CoIncrementMTAUsage. Simply call that before the call to bar
and the crash is avoided.
from cppwinrt.
Thank you.
I had never think apartment is a property of process.
I tested:
std::thread{ []() {
winrt::init_apartment();
::Sleep(10000);
} }.detach();
std::thread{ []() {
auto type = winrt::impl::get_apartment_type();
printf("%d\n",type.first);
} }.join();
I think once a thread is initialized as MTA. All thread not initialized will be considered as MTA.
from cppwinrt.
But I find that initialized with single threaded will also make the ContextCallback success.
void test()
{
winrt::com_ptr<IContextCallback> ctx;
CoGetObjectContext(IID_IContextCallback, ctx.put_void());
assert(ctx);
TrySubmitThreadpoolCallback([](PTP_CALLBACK_INSTANCE pci, PVOID p) {
auto x = winrt::impl::get_apartment_type();
winrt::com_ptr<IContextCallback> ctx;
*ctx.put_void() = p;
winrt::init_apartment(winrt::apartment_type::single_threaded);
ComCallData data;
HRESULT hr = ctx->ContextCallback([](ComCallData*) {
return S_OK;
}, &data, IID_ICallbackWithNoReentrancyToApplicationSTA, 5, nullptr);
printf("[%d]hr=%d\n", GetCurrentThreadId(), hr);
}, ctx.detach(), 0);
}
from cppwinrt.
Related Issues (20)
- GetChildrenInTabFocusOrder no longer a member of the generated code HOT 10
- Cannot use WinRT with MFC? HOT 3
- Bug: version 2.0.240111.5 does not work correctly with XAML HOT 10
- Bug:Build failure due to namespace changes in XamlTypeInfo after C++/WinRT update HOT 2
- Bug: throw_hresult should treat ERROR_COMMITMENT_LIMIT as OOM HOT 3
- Bug: Calling PropertyValue.Create to handle boxing is significantly slower than allocating an IReference directly HOT 5
- Bug: projection generator does not handle absolute unix path HOT 2
- Bug:Compiling Error with C++20, inheriting of winrt::implements HOT 5
- Feature: Support C++20 std::format for cppwinrt types (e.g. winrt::hstring) HOT 2
- Bug: DeviceInformation::FindAddAsync returns empty collection when specifying a usb device. HOT 1
- Bug: Weird c++20 MainWindow.xaml.g.hpp bug HOT 1
- Bug: observable_map_base::call_changed is private HOT 4
- `com_ptr::addressof` method? HOT 4
- Bug: C++WinRT does not correctly handles Chinese characters using `Windows.Foundation.Uri` HOT 5
- com_array should have a constructor accepting std::pair<uint32_t, T* const> HOT 1
- How does `winrt::auto_revoke` not result in memory leaks? HOT 1
- Bug: "Common properties" not showing in VC++ project HOT 4
- Best way to keep track of pending IAsyncActions HOT 4
- Bug: In some situations, calling get_weak() may over-release the "outer" object HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cppwinrt.