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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подружить пример Рихтера программ-я служб иWINSOCK, Служба от Рихтера и winsock2.h 
:(
    Опции темы
Kornev
  Дата 15.7.2012, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день, форумчане!
Помогите подружить пример программирования служб от Рихтера и 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.
Это так?
PM MAIL WWW   Вверх
Kornev
Дата 15.7.2012, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



От первой ошибки избавился заменой флага на MB_DEFAULT_DESKTOP_ONLY
Поправьте меня если так делать нельзя или не правильно.

PM MAIL WWW   Вверх
feodorv
Дата 15.7.2012, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(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.
Это так? 

Нет.

Это сообщение отредактировал(а) feodorv - 15.7.2012, 19:56


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Kornev
  Дата 15.7.2012, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вторая ошибка устранилась после замены функции GetCommandLine() на функцию GetCommandLineW()

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

Хоть у кого нибудь есть мысли по этому поводу?
Я даже не знаю что и выкладывать из исходников...
Изначально примеры программирования служб от Рихтера используют именнованые каналы для сетевого взаимодействия. Я эти функции не вырезал. Может они как то конфликтуют с сокетами?
PM MAIL WWW   Вверх
feodorv
Дата 15.7.2012, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



У Вас явно с инклюдами что-то не в порядке. Ну не может быть такого:
Цитата(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



Это сообщение отредактировал(а) feodorv - 15.7.2012, 20:00


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Kornev
Дата 15.7.2012, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(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


PM MAIL WWW   Вверх
feodorv
Дата 15.7.2012, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



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

Не сочту)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
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.

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


 




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


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

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