0

我正在Windows CE 6.0下開發Windows服務。該項目會生成一個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」是指向具有「servState」字段的結構SRVCONTEXT的指針(類型PSRVCONTEXT)。執行「pSrv-> servState = SERVICE_STATE_UNKNOWN;」時存儲器的某些部分被覆蓋,導致應用程序出錯。

的解決方法是使用它之前的memmory首先分配給這個結構:

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

添加上述行來我的應用程序後,一切開始正常工作。線程正常啓動並且服務的狀態更改爲「正在運行」。

P.S.結構如下所示:

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