Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отладка сервиса с помощью DebugView 
:(
    Опции темы
surly
Дата 16.11.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 20.1.2007

Репутация: нет
Всего: нет



Добрый вечер/день.
написал сервис...точнее 3 приложения: сам сервис, програму работы с сервисом и клиент. клиент не важен.
по сервису:
Зарегистрировал его.
При запуске Вылитает ашибка 1067: процесс неожиданно завершен.
Понатыкал OutputDebugStringA чтоб отловить через DebugView. но не могу отловить что и где вылетает в сервисе.
кому не трудно, посматрите и скажите где бок.
програмы прилагаю в архиве ниже.
код привожу:
сервис:
Код

// service.cpp 
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFSIZE 16 //buffer len
//global vars
SERVICE_STATUS          sStatus; 
SERVICE_STATUS_HANDLE   hsSstatus; 
HANDLE hPipe;
DWORD dwBytesRead=0;
union
{
    SYSTEMTIME    systime;
    WORD arr[16];
} stun;
//prototype for funcs
VOID SvcDebugOut(LPSTR String, DWORD Status); //done
LPSERVICE_MAIN_FUNCTION StartServiceF (int argc, _TCHAR* argv[]);//done
VOID WINAPI  ServiceControlHandler (DWORD opcode); //done
void ServInit(void); //tdone


//main function, call service dispatcher
int _tmain(int argc, _TCHAR* argv[])
{
    DWORD err;
    SERVICE_TABLE_ENTRY   dispTable[2] = 
    { 
        { L"serv_cs05g_v10", (VOID)StartServiceF }, 
        { NULL,              NULL          } 
    }; 
    
    err = StartServiceCtrlDispatcher(dispTable);
    if (!err)
        SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher error = %d\n", GetLastError()); 
    return 0;
}



//DEBUG OutPut
VOID SvcDebugOut(LPSTR String, DWORD Status) 
{ 
    CHAR  Buffer[1024]; 
    if (strlen(String) < 1000) 
    { 
        sprintf(Buffer, String, Status); 
        OutputDebugStringA(Buffer); 
    } 
}





//startService func
//void winapi
LPSERVICE_MAIN_FUNCTION StartServiceF (int argc, _TCHAR* argv[])
{
    BOOL bConnected, bRead;
    DWORD err; 
    DWORD specificError; 
    sStatus.dwServiceType = SERVICE_WIN32; 
    sStatus.dwCurrentState = SERVICE_START_PENDING; 
    sStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE; 
    sStatus.dwWin32ExitCode = 0; 
    sStatus.dwServiceSpecificExitCode = 0; 
    sStatus.dwCheckPoint = 0; 
    sStatus.dwWaitHint = 0; 
 
    hsSstatus = RegisterServiceCtrlHandler(L"serv_cs05g_v10",ServiceControlHandler); 
    if (hsSstatus == (SERVICE_STATUS_HANDLE)0) 
    { 
        //SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed %d\n", GetLastError()); 
        if (GetLastError()==ERROR_INVALID_NAME)
            SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed ERROR_INVALID_NAME %d\n",GetLastError()); 
        if (GetLastError()==ERROR_SERVICE_DOES_NOT_EXIST)
            SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed ERROR_SERVICE_DOES_NOT_EXIST %d\n",GetLastError());
       // return ;
        exit(0);
    } 
     // Initialization code goes here. 
    err = ServInit(); 
 
    // Handle error condition 
    if (err != NO_ERROR) 
    { 
        sStatus.dwCurrentState = SERVICE_STOPPED; 
        sStatus.dwCheckPoint = 0; 
        sStatus.dwWaitHint = 0; 
        sStatus.dwWin32ExitCode = err; 
        sStatus.dwServiceSpecificExitCode = GetLastError(); 
        SetServiceStatus (hsSstatus, &sStatus); 
        //return ;
        exit(0);
    } 
 
    // Initialization complete - report running status. 
    sStatus.dwCurrentState = SERVICE_RUNNING; 
    sStatus.dwCheckPoint = 0; 
    sStatus.dwWaitHint = 0; 
 
    if (!SetServiceStatus (hsSstatus, &sStatus)) 
    { 
        err = GetLastError(); 
        SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",err); 
    } 
    
    // Task for service .......
    // read bytes from pipe and write it to union.arr
    dwBytesRead = 0;
    for(;;)
    {
    if (bConnected = ConnectNamedPipe(hPipe, NULL))
        bConnected = TRUE;
    else SvcDebugOut(" [MY_SERVICE] connectNamedpipe Error \n",0);
    //read from pipe
    if (bConnected)
    {
    bRead = ReadFile(hPipe,stun.arr,BUFSIZE,&dwBytesRead,NULL);
    if ((bRead!=0)&&(dwBytesRead!=16))
        SvcDebugOut(" ReadFile \n",0);
    else
        // then set time
    if (!SetSystemTime(&stun.systime))  
        SvcDebugOut(" SetSystemTime Error \n",0);
    }
    }
    ////////////////////////////
    SvcDebugOut(" [MY_SERVICE] Returning the Main Thread \n",0); 
    exit(0);
    //return ; 
} 






VOID WINAPI ServiceControlHandler (DWORD code)
{
DWORD err; 
    switch(code) 
    { 
        case SERVICE_CONTROL_PAUSE: 
        // pause 
            sStatus.dwCurrentState = SERVICE_PAUSED; 
            break; 
 
        case SERVICE_CONTROL_CONTINUE: 
        // cont 
            sStatus.dwCurrentState = SERVICE_RUNNING; 
            break; 
 
        case SERVICE_CONTROL_STOP: 
        // stop 
            sStatus.dwWin32ExitCode = 0; 
            sStatus.dwCurrentState  = SERVICE_STOPPED; 
            sStatus.dwCheckPoint    = 0; 
            sStatus.dwWaitHint      = 0; 
 
            if (!SetServiceStatus (hsSstatus, &sStatus))
            { 
                err = GetLastError(); 
                SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",err); 
            } 
 
            SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0); 
            return;
            //goto l1;
 
        case SERVICE_CONTROL_INTERROGATE: 
        // cur status. 
            break; 
 
        default: 
            SvcDebugOut(" [MY_SERVICE] Unrecognized code %ld\n", code); 
    } 
 
    // Send current status. 
    if (!SetServiceStatus (hsSstatus,  &sStatus)) 
    { 
        err = GetLastError(); 
        SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",err); 
    } 
    return; 
}







void ServInit(void)
{
    LPTSTR lPipename = L"\\\\.\\pipe\\mypipe"; 
    //PIPE_READMODE_MESSAGE
    hPipe = CreateNamedPipe(lPipename, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES,  
          BUFSIZE, BUFSIZE, NMPWAIT_USE_DEFAULT_WAIT, NULL); 
      if (hPipe == INVALID_HANDLE_VALUE) 
      {
          SvcDebugOut(" [MY_SERVICE] CreateNamedPipe FAILED\n", GetLastError());  
          return 0;
      }
    return 1;
}





уже ниче не могу придумать  :( поч оно так...
заранее благодарен.



Это сообщение отредактировал(а) surly - 16.11.2008, 22:41

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  MY.rar 18,55 Kb
PM MAIL   Вверх
surly
Дата 16.11.2008, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 20.1.2007

Репутация: нет
Всего: нет



добавив дебагвывод в функцию _tmain обнаружил, что ошибка вылетает прямо на вызове диспетчера :((
че делать не пойму все равно....    
    err = StartServiceCtrlDispatcher(dispTable);


ах да, у функции StartServiceF тип LPSERVICE_MAIN_FUNCTION изза того что на строку VOID WINAPI StartServiceF копилятор не компилировал и выдавал ашибку в строке { L"serv_cs05g_v10", (VOID)StartServiceF }, смог скомпилить только приведя к типу VOID.
может этом ошибка?
при запуске службы ашибка : инструкция по адресу 0х0 обратилась к инструкции 0х0 


чуть чуть поменял код....
теперь тело выглядит так 
Код

DWORD WINAPI StartServiceF (int argc, _TCHAR* argv[])
{///\
}

tmain так
Код

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD err;
    SERVICE_TABLE_ENTRY   dispTable[2] = 
    { 
        { L"serv_cs05g_v10", (LPSERVICE_MAIN_FUNCTION)StartServiceF }, 
        { NULL,              NULL          } 
    }; 
    
    err = StartServiceCtrlDispatcher(dispTable);
    OutputDebugStringA("StartServiceCtrlDispatcher");
    if (!err)
        SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher error = %d\n", GetLastError()); 
    return 0;
}

при старте сервиса, ашибка 1: неверная функция, дальше строки err = StartServiceCtrlDispatcher(dispTable); не выполняеться.

Это сообщение отредактировал(а) surly - 16.11.2008, 23:22
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.