单独线程上的 CoInitialize() 崩溃而不返回

CoInitialize() on a separate thread crash without returning

我按照 direct2d quickstart 进行操作,一切正常。但是当我将函数从 wWinMain 移动到 threadproc 并在另一个线程中启动它时,它崩溃了。

#include "GUI/gui.h"
#include "GUI/BaseWnd.h"
#include <iostream>
#include <string>
#include <sstream>

DWORD WINAPI StartAnimation(LPVOID lpThreadParam)
{
    //HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
    try
    {
        HRESULT hr = CoInitialize(NULL);
        printf("%d",hr);

        //if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
        if (SUCCEEDED(hr))
        {
            {
                BaseWnd map;

                //if (SUCCEEDED(map.Initialize(lpThreadParam)))
                if (SUCCEEDED(map.Initialize()))
                {
                    map.RunMessageLoop();
                }

            }
            return 0;
        }
    }
    catch (const std::exception& e)
    {
        printf("{0}", e);
    }

    auto e = GetLastError();
    return -1;
}

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    //initilize map
    //initialize(graph)

    //initialize window and base map according to model in anther THREAD

    //run solution provide 
    DWORD ThreadID;
    int a = 3;
    LPVOID lpThreadParam = &a;

    HANDLE hThread = CreateThread(
        NULL,
        0,
        StartAnimation,
        lpThreadParam, //input data
        0,
        &ThreadID
    );
    //StartAnimation(lpThreadParam);
    return 0;

}

int main() {
    return _tWinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW);
}

在上面的代码中,如果我在wWinMain中直接调用StartAnimation,就可以了。但是将它移到线程中,它崩溃了。 当我调试时,它永远不会到达 CoInitialize(NULL) 下面的代码,将断点设置到它,而在它上面,点击 step over 或 step in 或 continue,调试终止。它从不打印任何东西。如果我不使用线程,它会打印 0.

您看到的 "crash" 与 CoInitialize 无关。问题是 wWinMain 函数在调用 CreateThread 之后继续执行。下一条语句是 return 0;,程序流从 wWinMain 开始 return。至此进程终止,一切结束。大概你想要某种循环,在你从 wWinMain return 之前连续处理某些东西(输入,逻辑,等等),而不是仅仅结束程序。