0

Ich entwickle einen Windows-Dienst unter Windows CE 6.0. Das Projekt erstellt eine DLL, die in OS Image integriert wird. Der Dienst wird gestartet, wenn WinCE dank Registrierungseinstellungen gestartet wird.Starten eines Threads in einem Windows CE 6.0-Dienst

Das Problem ist, dass ich den Thread "Thread1" nicht starten kann. Ich sollte die MessageBox sehen, aber es ist nichts auf dem Bildschirm. Warum? Das Einfügen der MessageBox in SFC_Init funktioniert einwandfrei.

Eine andere Sache - wenn ich "Services List" in der Konsole (im WinCE-System) eingeben, ist der Zustand meines Dienstes unbekannt ... Warum ist das so?

Bitte helfen!

// SrvForCom.cpp : Defines the entry point for the DLL application. 
// 


#include "stdafx.h" 

HINSTANCE hInst; 

// main entry point of the DLL 
BOOL WINAPI DllMain(HANDLE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
{ 
    hInst = (HINSTANCE)hModule; 

    switch(ul_reason_for_call) { 

     case DLL_PROCESS_ATTACH: 
      DisableThreadLibraryCalls((HMODULE)hModule); 
      break; 

     case DLL_PROCESS_DETACH: 
      break; 

    } 

    return TRUE; 
} 

// function called during initialization process 
DWORD SFC_Init(DWORD dwContext) { 

    PSRVCONTEXT pSrv; 
    HANDLE hThrd; 
    DWORD err = ERROR_INVALID_PARAMETER; 


    // fill the info structure 
    pSrv->servState = SERVICE_STATE_UNKNOWN; 
    switch (dwContext) { 
     case SERVICE_INIT_STARTED: 
      pSrv->servState = SERVICE_STATE_ON; 
      break; 

     case SERVICE_INIT_STOPPED: 
      pSrv->servState = SERVICE_STATE_OFF; 
      break; 
    } 


    // start new thread 
    hThrd = CreateThread (NULL, 0, Thread1, NULL, 0, NULL); 
    if (hThrd) { 
     CloseHandle (hThrd); 
     err = 0; 
    } else { 
     err = GetLastError(); 
    } 

    return hThrd; 
} 

BOOL SFC_Deinit(DWORD dwData) { 
    return TRUE; 
} 

BOOL SFC_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode) { 

    PSRVCONTEXT pSrv = (PSRVCONTEXT)dwData; 

    return (DWORD)pSrv; 
} 

BOOL SFC_Close(DWORD dwData) { 
    return 1; 
} 

BOOL SFC_IOControl(DWORD dwData, DWORD dwCode, PBYTE pBufIn, 
       DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, 
       PDWORD pdwActualOut) { 

    PSRVCONTEXT pSrv = (PSRVCONTEXT)dwData; 

    switch (dwCode) { 
     case IOCTL_SERVICE_STATUS: 
      *pBufOut = pSrv->servState; 
      break; 
    } 

    return 1; 
} 

DWORD WINAPI Thread1(LPVOID lpv) { 


    MessageBox (NULL, TEXT ("The thread has been successfully started!"), TEXT ("Info"), MB_OK); 

    return 0; 
} 

Antwort

0

Ich habe Antwort auf diese Frage gefunden. Der obige Code ist korrekt bis auf ein Detail - nicht initialisierte Struktur. "pSrv" ist ein Zeiger (Typ PSRVCONTEXT) auf eine Struktur SRVCONTEXT mit "servState" -Feld. Bei der Ausführung von "pSrv-> servState = SERVICE_STATE_UNKNOWN;" Ein Teil des Speichers wurde überschrieben, was zu Fehlern in der Anwendung führte.

Die Lösung besteht darin, zunächst die memmory diese Struktur zuweisen, bevor es mit:

pSrv = (PSRVCONTEXT)LocalAlloc (LPTR, sizeof (SRVCONTEXT)); 

über die Linie meine Anwendung Nach der Zugabe begann alles in Ordnung zu arbeiten. Der Thread wurde ordnungsgemäß gestartet und der Status des Dienstes wurde in "Running" geändert.

P.S. Die Struktur sieht so aus:

typedef struct { 
    DWORD servState; 
} SRVCONTEXT, *PSRVCONTEXT;