Не знаю, поможет ли это, но меня один раз спасло то, что я убрал атрибут const (выделено жирным шрифтом) переменной, которой несколько потоков. Надеюсь, это тебе поможет
Q>Q>#include <windows.h>
Q>#include <ole2.h>
Q>#include <olectl.h>
Q>#include <cassert>
Q>void test_load_image_from_mem_(int thread_num, const void* image_data, size_t data_size)
Q>{
Q> HGLOBAL hmem = ::GlobalAlloc(GMEM_MOVEABLE, data_size);
Q> assert(hmem);
Q> void* pmem = ::GlobalLock(hmem);
Q> memcpy(pmem, image_data, data_size);
Q> ::GlobalUnlock(hmem);
Q> IStream* ps = nullptr;
Q> HRESULT hr = ::CreateStreamOnHGlobal(hmem, TRUE, &ps);
Q> assert(SUCCEEDED(hr));
Q> assert(ps);
Q> IPicture* pic_ptr = nullptr;
Q> hr = ::OleLoadPicture(ps, static_cast<LONG>(data_size), FALSE, IID_IPicture, (void**)&pic_ptr);
Q> assert(SUCCEEDED(hr));
Q> assert(pic_ptr);
ps->>Release();
Q> pic_ptr->Release();
Q>}
Q>const char TestData[246] = {
Q> 0x42u, 0x4Du, 0xF6u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x76u, 0x00u, 0x00u, 0x00u, 0x28u, 0x00u,
Q> 0x00u, 0x00u, 0x10u, 0x00u, 0x00u, 0x00u, 0x10u, 0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x04u, 0x00u, 0x00u, 0x00u,
Q> 0x00u, 0x00u, 0x80u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
Q> 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x80u, 0x00u, 0x00u, 0x80u,
Q> 0x00u, 0x00u, 0x00u, 0x80u, 0x80u, 0x00u, 0x80u, 0x00u, 0x00u, 0x00u, 0x80u, 0x00u, 0x80u, 0x00u, 0x80u, 0x80u,
Q> 0x00u, 0x00u, 0xC0u, 0xC0u, 0xC0u, 0x00u, 0x80u, 0x80u, 0x80u, 0x00u, 0x00u, 0x00u, 0xFFu, 0x00u, 0x00u, 0xFFu,
Q> 0x00u, 0x00u, 0x00u, 0xFFu, 0xFFu, 0x00u, 0xFFu, 0x00u, 0x00u, 0x00u, 0xFFu, 0x00u, 0xFFu, 0x00u, 0xFFu, 0xFFu,
Q> 0x00u, 0x00u, 0xFFu, 0xFFu, 0xFFu, 0x00u, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu,
Q> 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0x00u, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xD0u, 0xFFu, 0x0Du, 0xDDu, 0xDDu,
Q> 0xDDu, 0xDDu, 0xDDu, 0xD0u, 0xFFu, 0x0Du, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xD0u, 0x00u, 0xDDu, 0xDDu, 0xDDu,
Q> 0xDDu, 0xDDu, 0xDDu, 0x0Du, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xD0u, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu,
Q> 0xDDu, 0xDDu, 0x0Du, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xD0u, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu,
Q> 0xDDu, 0x0Du, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xD0u, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0x00u,
Q> 0x0Du, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xD0u, 0xFFu, 0x0Du, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xD0u, 0xFFu,
Q> 0x0Du, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0x00u, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu,
Q> 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, 0xDDu, };
Q>DWORD WINAPI thread_proc_(LPVOID lpParameter)
Q>{
Q> const int thread_num = (int)lpParameter;
Q> ::OleInitialize(nullptr);
Q> test_load_image_from_mem_(thread_num, TestData, sizeof(TestData));
Q> ::OleUninitialize();
Q> return 0;
Q>}
Q>HANDLE start_thread_(int num)
Q>{
Q> return ::CreateThread(nullptr, 0, thread_proc_, (LPVOID)num, 0, nullptr);
Q>}
Q>void start_threads_(int count)
Q>{
Q> HANDLE* harr = new HANDLE[count];
Q> for (int num = 0; num < count; ++num)
Q> harr[num] = start_thread_(num);
Q> ::WaitForMultipleObjects(count, harr, TRUE, INFINITE);
Q> for (int num = 0; num < count; ++num)
Q> ::CloseHandle(harr[num]);
Q> delete[] harr;
Q>}
Q>int CALLBACK WinMain(HINSTANCE hInstance,
Q> HINSTANCE hPrevInstance,
Q> LPSTR lpCmdLine,
Q> int nCmdShow)
Q>{
Q> ::MessageBox(NULL, L"Ready to start", L"TestOleLoadPicture", MB_OK);
Q> start_threads_(100);
Q> ::MessageBox(NULL, L"Everything OK!", L"TestOleLoadPicture", MB_OK);
Q>}
Q>