C++ 如何在C++;

C++ 如何在C++;,c++,windows,visual-c++,mfc,C++,Windows,Visual C++,Mfc,原始问题 我们的应用程序使用CSocket,它需要消息泵运行才能工作。目前,改变到另一个套接字实现是不现实的,尽管这是我们希望在某个时候结束的 应用程序在Visual C++(未管理)中。< /P> 我们现在使用C++的.NET服务启动程序启动C++ DLL,它启动一个线程,并运行一个应用程序,运行消息泵,然后使用DLimPART启动DLL中的启动方法。 这有许多问题,其中最紧迫的是,如果DLL因任何原因崩溃,我们将无法获得转储文件 作为这个结果,我们切换到C++服务启动程序,虽然我们对它的服务

原始问题

我们的应用程序使用CSocket,它需要消息泵运行才能工作。目前,改变到另一个套接字实现是不现实的,尽管这是我们希望在某个时候结束的

应用程序在Visual C++(未管理)中。< /P>

我们现在使用C++的.NET服务启动程序启动C++ DLL,它启动一个线程,并运行一个应用程序,运行消息泵,然后使用DLimPART启动DLL中的启动方法。 这有许多问题,其中最紧迫的是,如果DLL因任何原因崩溃,我们将无法获得转储文件

作为这个结果,我们切换到C++服务启动程序,虽然我们对它的服务方面做得很好,但如何让消息泵继续运行却有点困难。 我在谷歌周围看了一些问题,但是我的一部分问题是缺乏基本的C++知识,所以如果这是一个双重问题,那么如果有人能指出我正确的方向,我们会很抱歉。 非常感谢 马特·佩德尔斯登

更多信息

我们正在尝试替换的当前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)
    {
    }
}
本质上,我们只是试图用C++等效替换上面的C.*.NETWindows服务,这样我们的代码完全在非托管世界中运行,而不必用5行托管代码来混淆它。 DLLStart()和DLLStop()是从C+非托管DLL导入的两个函数,它们实际启动和停止系统

我不太清楚,为了能够用泵做任何事情,这都需要什么样的VisualC++项目。
希望这些附加数据有用。

最简单的消息循环如下所示:

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

但我不确定这是否真的回答了你的问题——你不能在你喜欢的任何地方运行消息循环。所以我们需要更多的细节。

您必须创建一个用户界面线程。工作线程没有消息泵


查看

< P>我的翻译C++代码在下面(未检查:)BR> PS:在同一线程中调用DLLStart、DLLStop将更加可靠

全局变量保存threadID
DWORD threadID=0

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

在顶部等效物中:
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();
}

您应该检查
GetMessage()
是否返回
-1
以指示错误。@Sharptoth我从未见过这种情况发生。据我所知,唯一可行的方法是窗口句柄是否同时为非null和无效,这在上面的代码中是不可能的。@sharptooth是正确的,这是MSDN所说的,但实际上@niel的方法是fine。Microsoft确实建议检查返回值,如前所述,这是不准确的。任何线程都可以创建消息队列并对其进行泵送。是的,UI线程是一个泵送消息的线程。一旦你创建了一个泵,或者COM之类的东西创建了一个泵,它就是一个UI线程。我不完全确定OP是否知道消息是传递给线程的,所以生成一个单独的线程来处理传入消息是行不通的。@Simon-我不确定我是否了解你。。。你能扩展吗?到目前为止,C#launcher肯定在做我们想要做的事情,但很可能我遗漏了一些重要的事情:)非常感谢您为此花时间,我们将尝试一下,看看会发生什么。您正在创建一个单独的线程来处理传入的消息。如果您在同一个线程中执行其他所有操作,包括DLLStart()和DLLStop(),则这很好。