c ++ - My C Program giver en tilbagekaldsfunktion til en krog. Hvordan kan jeg holde det i live, un-kludgily?

Indlæg af Hanne Mølgaard Plasc

Problem



I øjeblikket spytter jeg en meddelelsesboks med en OS-biblioteksfunktion (Windows.h), som magisk holder mit program levende og svarer til opkald til tilbagekaldsfunktionen.


Hvilken alternativ tilgang kan bruges til at stille programmet længe for evigt?


Fangst 'Ctrl-c' eller SIGINT og derefter kalder FjernHook () for en ren exit ville være rart at have, men det er ikke vigtigt.


HOOK my\_hook;

CALLBACK my\_callback\_fn()
{
  ...
}

int main()
{
  my\_hook = SetHook(my\_callback\_fn);
  MessageBox("Press OK to stop."); // This is bad.
  RemoveHook(my\_hook);
  return 0;
}

Bedste reference


Du vil sandsynligvis pumpe meddelelser. En typisk meddelelsessløjfe ligner noget sådan: [7]


BOOl ret;
MSG msg;
while ((ret=::GetMessage(&msg, hWnd, 0, 0))!=0)
{
  ::TranslateMessage(&msg);
  ::DispatchMessage(&msg);
}


Du ser ikke ud til at have et egentligt vindue til at pumpe på, og du siger ikke, hvad SetHook faktisk gør - måske vil det være muligt at give en til dig?


En anden metode er at bruge funktionerne MsgWait. Måske har du en slags håndtag, som du venter på at blive signaleret, så du kan afslutte?: [8]


while (::MsgWaitForMultipleObjects(1, &handle, FALSE, INFINITE, QS\_ALLEVENTS)==WAIT\_OBJECT\_0+1+
{
  BOOl ret;
  MSG msg;
  while ((ret=::PeekMessage(&msg, hWnd, 0, 0, TRUE))!=0)
  {
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
  }
}

Andre referencer 1


oprettelse af Windows-tjenester med kommandolinjen kan være en måde at gå [9]


Du kan også oprette det programaticaly [10]

Andre referencer 2


Dette kan lyde underligt, men der er en global variabel . Udklipsholder .


Du kan lytte til udklipsholder modifikationer ved at fange:



  • WM\_CHANGECBCHAIN ​​

  • WM\_DRAWCLIPBOARD



Når WM\_DRAWCLIPBOARD er sendt, læser du clipboardteksten, og hvis den starter med dit 'magiske' ord, dvs. '## EXIT ##', kan du opsige din ansøgning.

Andre referencer 3


En simpel løsning er at kalde Sleep () i en loop


int main() {
   // your stuff
   while(1) {
      Sleep( 10000 );
   }
   return 0;
}


men bemærk at hvis du vil gøre fjernet kroge, skal du lave Ctrl-C fangst ..