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++项目,以便能够对泵做任何事情,说实话.
希望这些额外的数据是有用的.
我翻译的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)
| 归档时间: |
|
| 查看次数: |
8297 次 |
| 最近记录: |