0

Я разрабатываю службу Windows под Windows CE 6.0. Проект создает DLL, которая интегрируется в OS Image. Служба запускается, когда WinCE загружается благодаря настройкам реестра.Запуск потока в службе Windows CE 6.0

Проблема в том, что я не могу запустить поток «Thread1». Я должен увидеть MessageBox, но на экране ничего нет. Зачем? Помещение MessageBox в SFC_Init отлично работает.

Другое дело - когда я набираю «список услуг» в консоли (в системе WinCE), состояние моей службы неизвестно ... Почему это так?

Пожалуйста, помогите!

// 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; 
} 

ответ

0

Я нашел ответ на этот вопрос. Вышеприведенный код является правильным, кроме одной детали - неинициализированной структуры. «pSrv» - это указатель (тип PSRVCONTEXT) на структуру SRVCONTEXT с полем «servState». При выполнении «pSrv-> servState = SERVICE_STATE_UNKNOWN;» некоторая часть memmory была перезаписана, что вызвало ошибки в приложении.

Решение является первым выделить Memmory к этой структуре перед использованием:

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

После добавления выше линии к моему заявлению, все начали работать нормально. Нить правильно запущена, и состояние службы изменилось на «Запуск».

P.S. Структура выглядит так:

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