0

Windows CE 6.0 で Windows サービスを開発しています。このプロジェクトは、OS イメージに統合される DLL を生成します。レジストリ設定により WinCE が起動すると、サービスが開始されます。

問題は、「Thread1」スレッドを開始できないことです。MessageBox が表示されるはずですが、画面には何も表示されません。なんで?MessageBox を SFC_Init に入れるとうまくいきます。

もう 1 つ - コンソール (WinCE システム) に「services list」と入力すると、サービスの状態が不明です...なぜそうなのですか?

助けてください!

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

1 に答える 1

0

この質問に対する答えを見つけました。上記のコードは、1 つの詳細 (初期化されていない構造体) を除けば正しいものです。「pSrv」は、「servState」フィールドを持つ構造体 SRVCONTEXT へのポインター (タイプ PSRVCONTEXT) です。「pSrv->servState = SERVICE_STATE_UNKNOWN;」実行時 メモリの一部が上書きされ、アプリケーションでエラーが発生しました。

解決策は、使用する前にまずメモリをこの構造体に割り当てることです。

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

上記の行をアプリケーションに追加した後、すべてが正常に機能し始めました。スレッドが正常に開始され、サービスの状態が「実行中」に変わりました。

PS構造は次のようになります。

typedef struct {
    DWORD servState;
} SRVCONTEXT, *PSRVCONTEXT;
于 2012-04-12T12:58:55.420 に答える