CoInitialize()在单独的线程崩溃而没有返回

时间:2018-11-02 02:02:21

标签: c++ com

我遵循了Direct2D快速入门,并且一切正常。但是当我将功能从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);
}

在上面的代码中,如果我直接在StartAnimation中调用wWinMain,它将起作用。但是将其移入线程会崩溃。 当我调试时,它永远不会到达CoInitialize(NULL)以下的代码,请为其设置断点,然后在其上按一下,进入或继续执行,调试将终止。它从不打印任何内容。如果我不使用线程,它将显示0。

1 个答案:

答案 0 :(得分:1)

您看到的“崩溃”与CoInitialize无关。问题在于,wWinMain函数的执行在调用CreateThread之后继续进行。下一条语句为return 0;,程序流从wWinMain返回。至此,过程终止,一切结束。大概您希望某种循环在从wWinMain返回之前,而不是仅仅结束程序之前,能够连续处理某些事情(输入,逻辑等)。