원래의 질문에는 ++
우리의 응용 프로그램이 작동하기 위해 실행해야 할 메시지 펌프를 필요로 CSocket을 사용합니다. 현재 다른 소켓 구현으로 변경하는 것은 실용적이지 않습니다.하지만 어느 시점에서 끝내고 싶습니다.
응용 프로그램이 Visual C++ (관리되지 않음)에 있습니다.
현재 C# .NET 서비스 시작 프로그램을 사용하여 Application.Run으로 스레드를 시작하여 메시지 펌프를 가져오고 DllImport를 사용하여 DLL의 시작 메서드를 시작합니다.
많은 문제가 있습니다. 그 중 가장 중요한 것은 DLL이 어떤 이유로 든 충돌 할 경우 덤프 파일을받지 못한다는 것입니다.
결과적으로 우리는 C++ 서비스 시작 프로그램으로 전환하고 있습니다. 서비스 측면에서는 문제가 없지만 메시지 펌프를 사용하는 방법에 대해서는 다소 어려움이 있습니다.
나는 여기 주위에 구글과 몇 가지 질문을 둘러 보았지만, 내 문제의 일부는 기본 C++ 지식의 부족이다. 그래서 사기성 질문이라면 누군가 사과 할 수 있으면 좋겠다. . 사전에
많은 감사 매트 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)
{
}
}
우리가 단순히 노력하고 위의 C# .NET Windows 서비스를 C++ 코드로 대체하여 코드가 불필요하게 혼동하는 대신 관리되지 않는 세계에서 완전히 실행되도록합니다. 5 행의 관리 코드로이를 수행하십시오.
DLLStart() 및 DLLStop()은 시스템을 실제로 시작하고 중지하는 C++ Unmanaged DLL에서 가져온 두 가지 함수입니다.
Visual C++ 프로젝트의 종류 프로젝트에 대해 솔직히 말해서 무엇이든 할 수 있어야합니다.
이 추가 데이터가 유용 할 것입니다.
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
하지만 난 정말 당신의 질문에 대한 대답 모르겠어요 - 당신은 어디에서든지 당신에게 멋진을 메시지 루프를 실행할 수 없습니다 : 간단한에서
이것은 스레드 메시지 대기열입니다. 나는 OP가 메시지가 쓰레드에 전달된다는 것을 잘 모르겠다. 그래서 수신 메시지를 다루기 위해 별도의 쓰레드를 생성하는 것은 효과가 없을 것이다. –
@ 시몬 - 내가 너를 따라 오는지 확신 할 수 없다. 너 확장 할 수 있니? C# 발사기는 지금까지 우리가 원하는 것을 확실히하고 있지만, 아마도 중요한 것을 놓친 것입니다. :) –
그 시간을 내 주셔서 대단히 감사합니다. –