【问题标题】:Starting a thread in a Windows CE 6.0 service在 Windows CE 6.0 服务中启动线程
【发布时间】:2012-04-11 10:17:57
【问题描述】:

我正在 Windows CE 6.0 下开发 Windows 服务。该项目生成一个 DLL,该 DLL 集成在 OS Image 中。由于注册表设置,当 WinCE 启动时,服务就会启动。

问题是我无法启动“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;
}

【问题讨论】:

    标签: multithreading windows-services visual-studio-2005 windows-ce


    【解决方案1】:

    我已经找到了这个问题的答案。上面的代码是正确的,除了一个细节 - 未初始化的结构。 “pSrv”是指向带有“servState”字段的结构 SRVCONTEXT 的指针(类型 PSRVCONTEXT)。执行“pSrv->servState = SERVICE_STATE_UNKNOWN;”时内存的某些部分被覆盖,导致应用程序出错。

    解决方法是在使用之前先给这个结构分配内存:

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

    将上述行添加到我的应用程序后,一切开始正常。线程正常启动,服务状态变为“正在运行”。

    附:结构如下:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      相关资源
      最近更新 更多