如何在C++中手动运行消息泵

Mat*_*den 6 c++ windows mfc visual-c++

原始问题

我们的应用程序使用CSocket,它需要消息泵运行才能运行.目前,更改为另一个套接字实现是不切实际的,尽管这是我们希望在某个时候结束的地方.

该应用程序使用Visual C++(非托管).

我们目前通过使用C#.NET服务启动程序启动C++ DLL,该启动程序使用Application.Run启动线程以使消息泵运行,然后使用DllImport启动DLL中的start方法.

这有很多问题,其中最紧迫的是如果DLL由于任何原因崩溃我们没有得到转储文件!

由于这一结果,我们切换到C++服务启动,虽然我们很好用它的服务方面我们是如何得到的消息泵会有点难倒.

我在这里浏览了谷歌和一些问题,但我的问题的一部分是缺乏基本的C++知识,所以如果这是一个愚蠢的问题,如果有人可以指出我正确的方向,将非常感谢道歉.

非常感谢Matt Peddlesden先生

更多信息

我们正在尝试替换的当前C#服务基本上是这样的:

public void PumpThread()
{
    DLLStart();
    Application.Run();
}

protected override void OnStart(string[] args)
{
    try
    {
        Thread pumpThread = new Thread(new ThreadStart(PumpThread));
        pumpThread.IsBackground = true;
        pumpThread.Start();
    }
    catch (DllNotFoundException dnfe)
    {
    }
    catch (Exception e)
    {
    }
}

protected override void OnStop()
{
    try
    {
        DLLStop();
    }
    catch (DllNotFoundException dnfe)
    {
    }
    catch (Exception e)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

从本质上讲,我们只是简单地努力,使我们的代码是不可控制的世界完全运行,而不是5行的托管代码混淆不必要这与C来代替上述C#.NET Windows服务++等价的.

DLLStart()和DLLStop()是从我们实际启动和停止系统的C + Unmanaged DLL导入的两个函数.

我不完全确定这需要什么的Visual C++项目,以便能够对泵做任何事情,说实话.

希望这些额外的数据是有用的.

9da*_*dan 2

我翻译的C++代码如下(未检查:)
PS:在同一个线程中调用DLLStart、DLLStop会更可靠。

全局变量保存threadID
DWORD threadID = 0;

在 OnStart 中等效:
CreateThread(0, 0, PumpThread, 0, 0, 0);

在 OnStop 中等效:
PostThreadMessage(threadID, WM_QUIT, 0, 0);

线程例程:

DWORD WINAPI PumpThread(void* param)
{
    threadID = GetCurrentThreadId();  

    DLLStart();  

    // create thread message queue
    PeekMessage(&msg, 0, WM_USER, WM_USER, PM_NOREMOVE);  

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    DLLStop();
}
Run Code Online (Sandbox Code Playgroud)