Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Подружить пример Рихтера программ-я служб иWINSOCK


Автор: Kornev 15.7.2012, 17:45
Добрый день, форумчане!
Помогите подружить пример программирования служб от Рихтера и winsock2.h
Проблема, на сколько я понимаю, в том, что Рихтер делал свои примеры под Windows 2000
Я не знаю когда была сделана библиотека ws2_32.lib, но что то мне подсказывает что раньше...

Проблемы начинаются сразу же после появления в коде строчки #include <winsock2.h>

Компилятор жалуется, что:
Код

--------------------Configuration: 03 TimeService - Win32 Debug--------------------
Compiling...
TimeService.cpp
c:\cd\cmnhdr.h(29) : warning C4005: 'WINVER' : macro redefinition
        c:\program files\microsoft sdk\include\windows.h(22) : see previous definition of 'WINVER'
c:\cd\cmnhdr.h(201) : error C2065: 'MB_SERVICE_NOTIFICATION' : undeclared identifier
c:\cd\03-timeservice\timeservice.cpp(272) : error C2664: 'CommandLineToArgvW' : cannot convert parameter 1 from 'char *' to 'const unsigned short *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

03 TimeService.exe - 2 error(s), 1 warning(s)


Заглянул в cmnhdr.h

Тут прописано:

Код

//////////////////////// Windows Version Build Option /////////////////////////


#define _WIN32_WINNT 0x0500
#define WINVER       0x0500


Поменял на:
Код

//////////////////////// Windows Version Build Option /////////////////////////


#define _WIN32_WINNT 0x0500
#define WINVER       0x0501


Теперь компилятор жалуется на 2-е ошибки:

--------------------Configuration: 03 TimeService - Win32 Debug--------------------
Compiling...
TimeService.cpp
c:\cd\cmnhdr.h(201) : error C2065: 'MB_SERVICE_NOTIFICATION' : undeclared identifier
c:\cd\03-timeservice\timeservice.cpp(272) : error C2664: 'CommandLineToArgvW' : cannot convert parameter 1 from 'char *' to 'const unsigned short *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

03 TimeService.exe - 2 error(s), 0 warning(s)

Первая MB_SERVICE_NOTIFICATION в функции:
Код

/////////////////////////// Quick MessageBox Macro ////////////////////////////


inline void chMB(PCSTR s) {
   char szTMP[256];
   GetModuleFileNameA(NULL, szTMP, chDIMOF(szTMP));
   HWND hwnd = GetActiveWindow();
   MessageBoxA(hwnd, s, szTMP, 
      MB_OK | ((hwnd == NULL ) ? MB_SERVICE_NOTIFICATION : 0));
}


Вторая в 
Код

int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {

   int nArgc = __argc;
#ifdef UNICODE
   PCTSTR *ppArgv = (PCTSTR*) CommandLineToArgvW(GetCommandLine(), &nArgc);
#else
   PCTSTR *ppArgv = (PCTSTR*) __argv;
#endif


Подскажите пожалуйста как правильно разрешить эти ошибки.
Еще, я так пологаю, что после изменеия  WINVER на 0x0501 моя служба перестанет работать в Windows 2000.
Это так?

Автор: Kornev 15.7.2012, 19:24
От первой ошибки избавился заменой флага на MB_DEFAULT_DESKTOP_ONLY
Поправьте меня если так делать нельзя или не правильно.

Автор: feodorv 15.7.2012, 19:54
Цитата(Kornev @  15.7.2012,  18:45 Найти цитируемый пост)
Проблемы начинаются сразу же после появления в коде строчки #include <winsock2.h>

Сделайте проще. Везде вместо windows.h вставьте winsock2.h, а winsock.h не включайте. Посмотрите, что будет.


Цитата(Kornev @  15.7.2012,  18:45 Найти цитируемый пост)
Компилятор жалуется, что:
c:\cd\cmnhdr.h(29) : warning C4005: 'WINVER' : macro redefinition
        c:\program files\microsoft sdk\include\windows.h(22) : see previous definition of 'WINVER'

Если WINVER уже где-то определена, то лучше сделать так:
Код

#ifndef WINVER
#define WINVER       0x0500
#endif



Цитата(Kornev @  15.7.2012,  18:45 Найти цитируемый пост)
c:\cd\cmnhdr.h(201) : error C2065: 'MB_SERVICE_NOTIFICATION' : undeclared identifier

Даже не знаю, что сказать. Чем компилите? На какой платформе?
В VC6 в WinUser.h дано такое определение:
Код

#ifdef _WIN32_WINNT
#if (_WIN32_WINNT >= 0x0400)
#define MB_SERVICE_NOTIFICATION          0x00200000L
#else
#define MB_SERVICE_NOTIFICATION          0x00040000L
#endif
#define MB_SERVICE_NOTIFICATION_NT3X     0x00040000L
#endif



Цитата(Kornev @  15.7.2012,  18:45 Найти цитируемый пост)
c:\cd\03-timeservice\timeservice.cpp(272) : error C2664: 'CommandLineToArgvW' : cannot convert parameter 1 from 'char *' to 'const unsigned short *'

Тут вообще не пойми, что происходит))) Возможно, это аберрации от инклюдов. Не помешает
Цитата(Kornev @  15.7.2012,  18:45 Найти цитируемый пост)
   PCTSTR *ppArgv = (PCTSTR*) CommandLineToArgvW(GetCommandLineW(), &nArgc);



Цитата(Kornev @  15.7.2012,  18:45 Найти цитируемый пост)
Еще, я так пологаю, что после изменеия  WINVER на 0x0501 моя служба перестанет работать в Windows 2000.
Это так? 

Нет.

Автор: Kornev 15.7.2012, 19:55
Вторая ошибка устранилась после замены функции GetCommandLine() на функцию GetCommandLineW()

Однако этим проблемы не закончились...
Компилирую службу без #include <winsock2.h> Все отлично работает. Служба стартует, останавливается, и т.д.
Только добавляю строчку #include <winsock2.h>, все...
Служба не стартует.
Ошибка 1053: Служба не ответила на запрос своевременно.

Хоть у кого нибудь есть мысли по этому поводу?
Я даже не знаю что и выкладывать из исходников...
Изначально примеры программирования служб от Рихтера используют именнованые каналы для сетевого взаимодействия. Я эти функции не вырезал. Может они как то конфликтуют с сокетами?

Автор: feodorv 15.7.2012, 19:59
У Вас явно с инклюдами что-то не в порядке. Ну не может быть такого:
Цитата(Kornev @  15.7.2012,  18:45 Найти цитируемый пост)
#ifdef UNICODE
   PCTSTR *ppArgv = (PCTSTR*) CommandLineToArgvW(GetCommandLine(), &nArgc);
#else
   PCTSTR *ppArgv = (PCTSTR*) __argv;
#endif

Цитата(Kornev @  15.7.2012,  18:45 Найти цитируемый пост)
c:\cd\03-timeservice\timeservice.cpp(272) : error C2664: 'CommandLineToArgvW' : cannot convert parameter 1 from 'char *' to 'const unsigned short *'

При том, что
Код

#ifdef UNICODE
#define GetCommandLine  GetCommandLineW
#else
#define GetCommandLine  GetCommandLineA
#endif // !UNICODE


Автор: Kornev 15.7.2012, 20:07
Цитата(feodorv @ 15.7.2012,  19:59)
У Вас явно с инклюдами что-то не в порядке. Ну не может быть такого:
Цитата(Kornev @  15.7.2012,  18:45 Найти цитируемый пост)
#ifdef UNICODE
   PCTSTR *ppArgv = (PCTSTR*) CommandLineToArgvW(GetCommandLine(), &nArgc);
#else
   PCTSTR *ppArgv = (PCTSTR*) __argv;
#endif

Цитата(Kornev @  15.7.2012,  18:45 Найти цитируемый пост)
c:\cd\03-timeservice\timeservice.cpp(272) : error C2664: 'CommandLineToArgvW' : cannot convert parameter 1 from 'char *' to 'const unsigned short *'

При том, что
Код

#ifdef UNICODE
#define GetCommandLine  GetCommandLineW
#else
#define GetCommandLine  GetCommandLineA
#endif // !UNICODE

Спасибо огромное за подсказку заменить #include <Windows.h> на #include <winsock2.h>
После таких действий служба опять начала нормально стартовать, останавливаться.

Не сочтите за извращение. Но на всякий случай отмечу, что все эти примеры компилирую на VC6 установленной под Win 7 с установленым пакетом SDK February 2003 Edition ver 5.2.3790.0    2003-02    Last version with VC6 support


Автор: feodorv 15.7.2012, 20:19
Цитата(Kornev @  15.7.2012,  21:07 Найти цитируемый пост)
Не сочтите за извращение. 

Не сочту)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)