는 ++

2011-06-14 2 views
4

원래의 질문에는 ++

우리의 응용 프로그램이 작동하기 위해 실행해야 할 메시지 펌프를 필요로 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); 
} 

하지만 난 정말 당신의 질문에 대한 대답 모르겠어요 - 당신은 어디에서든지 당신에게 멋진을 메시지 루프를 실행할 수 없습니다 : 간단한에서

답변

2

에서 살펴보고 어떤 메시지 펌프를이 없다 (선택하지 :
가 PS : 같은 스레드에서 DLLStart, DLLStop를 호출하면 더 신뢰할 수있을 것입니다.
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(); 
} 

전역 변수 ONSTART 당량 threadID
DWORD threadID = 0;

보유

+0

이것은 스레드 메시지 대기열입니다. 나는 OP가 메시지가 쓰레드에 전달된다는 것을 잘 모르겠다. 그래서 수신 메시지를 다루기 위해 별도의 쓰레드를 생성하는 것은 효과가 없을 것이다. –

+0

@ 시몬 - 내가 너를 따라 오는지 확신 할 수 없다. 너 확장 할 수 있니? C# 발사기는 지금까지 우리가 원하는 것을 확실히하고 있지만, 아마도 중요한 것을 놓친 것입니다. :) –

+0

그 시간을 내 주셔서 대단히 감사합니다. –

3

메시지 루프는 다음과 같습니다. 그래서 우리는 더 많은 세부 사항이 필요합니다.

+1

오류를 나타내는'-1'을 반환하는'GetMessage()'를 검사해야합니다. – sharptooth

+0

@sharptooth 나는 그런 일이 일어나는 것을 본 적이 없다. 내가 아는 한 유일한 방법은 창 핸들이 null이 아니며 유효하지 않은 경우입니다. 위의 코드에서는 그럴 수 없습니다. –

+0

@sharptooth가 정확합니다. MSDN이 말하는 것입니다. 그러나 실제로 @ niel의 방법은 괜찮습니다. –

1

사용자 인터페이스 스레드를 만들어야합니다. 작업자 스레드가

내 번역 C++ 코드는 다음과 같습니다 CWinThread

+1

이것은 정확하지 않습니다. 모든 쓰레드는 메시지 큐를 생성하고 그것을 펌핑 할 수 있습니다. –

+0

예, UI 스레드는 메시지를 펌프하는 스레드입니다. 펌프를 만들거나 COM이 펌프를 만들면 UI 스레드입니다. – Coder