Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Простай программа для работы с СОМ-портом, Прошу помощи с объяснением 
V
    Опции темы
cambit
Дата 15.2.2012, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уважаемые СПЕЦЫ! Я в Visual С++ полный "0", и, учитывая возраст (за 40) и работу, особо вникать не получится, поэтому прошу помочь: существует одна задача: нужно написать программу, которая бы резидентно висела-бы в Windows и при нажатии кнопки (сторонней, подключенной к СОМ-порту), запускала бы на выполнение медиаплеер. Нашел вот эту статью (http://www.pcports.ru/articles/com_3.php), но как изменить код, чтоб запускался файл при появлении логической "1" например, на выводе DSR(не принципиально), а не показать цифру в окошке, как в статье, не знаю. Помогите!!! Если можно - по-подробнее, начиная с САМОГО начала.
PM MAIL   Вверх
borisbn
Дата 15.2.2012, 16:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



легко. вместо этой строки
Цитата
MessageBox(NULL,"Произошло событие","Info",MB_OK);

пишете
Код
ShellExecute( 0, "open", "C:\\path\\to\\program.exe", "", "C:\\path\\to", SW_SHOW );



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
cambit
Дата 15.2.2012, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, дружище! А можно чуть проблему усложнить? Мне не нужно вообще никакое окно - просто должен запускаться файл - и все (реальное применение сего устройства - при нажатии кнопки включения микрофона для объявления по громкой связи хочу проигрывать звон колокольчиков из wav-файла  - аля аэропорт или вокзал). что мне из указанного в статье примера выбросить и, главное, куда его вставить? Я запустил Microsoft Visual C++ 6.0, выбрал "MFC APPWizard (exe), прошел этот мастер до конца, используя самоучитель для MS C++ 6.0, а вот куда дальше код вставлять - не пойму...
PM MAIL   Вверх
borisbn
Дата 16.2.2012, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(cambit @  15.2.2012,  19:58 Найти цитируемый пост)
MFC APPWizard (exe)

Это не нужно. Выбирайте "Win32 Application"
user posted image
далее
user posted image
далее в файле <имя проекта>.cpp появится ф-ция
Код
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)

В ней нужно вставить
Код
SetCommMask(hFile, EV_CTS|EV_DSR);
AfxBeginThread(proc1,0);

предварительно открыв COM-порт и записав дескриптор в hFile.
А в ф-ции proc1 уже вызываете ShellExecute


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 16.2.2012, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(cambit @  15.2.2012,  19:58 Найти цитируемый пост)
хочу проигрывать звон колокольчиков из wav-файла 

Для этого есть готовая функция - PlaySound, так что никакое приложение запускать не надо

А программу вашу лучше всего оформить как сервис (если сможете  smile )

PM MAIL   Вверх
cambit
Дата 16.2.2012, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Для открытия порта в файл Test.cpp вставил код
Код

hFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL,
        OPEN_EXISTING, 0,NULL);

    if(hFile==INVALID_HANDLE_VALUE)
    {
        MessageBox("Не удалось открыть порт!", "Ошибка", MB_ICONERROR);
    }
    else
    {
        MessageBox("Порт успешно открыт", "Ok", MB_OK);
    }
    
    return TRUE;  // return TRUE  unless you set the focus to a control
}

Это правильно?
Затем добавляем:
Цитата(borisbn @  16.2.2012,  09:22 Найти цитируемый пост)
В ней нужно вставить

код C++
1:SetCommMask(hFile, EV_CTS|EV_DSR);
2:AfxBeginThread(proc1,0);


Просто дописать две строчки?


Цитата(xvr @  16.2.2012,  12:28 Найти цитируемый пост)
А программу вашу лучше всего оформить как сервис 

Это и планировалось...

Цитата(xvr @  16.2.2012,  12:28 Найти цитируемый пост)
(если сможете   )

Если поможете smile 
PM MAIL   Вверх
bsa
Дата 16.2.2012, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 
PM   Вверх
xvr
Дата 16.2.2012, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(cambit @  16.2.2012,  12:37 Найти цитируемый пост)
Если поможете

Немного помогу - вот хидер для регистрации сервиса. Использование:
Код

#include "serv_mgr.h"

class MyServiceMgr : public ServiceMgr {
public:

 virtual void error(const char *msg) {::error(1,"SCM: %s",msg);}
 virtual void warning(const char *msg) {::error(0,"SCM: %s",msg);}
 virtual void get_serv_info(ServInfo &SI)
  {
   SI.serv_name="YourService";
   SI.displ_name="Your service Name";
  }
};

void install_service(bool inst)
{
 MyServiceMgr sm;
 if (inst) sm.install(); else sm.remove();
}

Для тела сервиса у меня готовой обертки увы нету, придется вам самому  smile 


Это сообщение отредактировал(а) xvr - 16.2.2012, 12:48

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  serv_mgr.zip 1,48 Kb
PM MAIL   Вверх
cambit
Дата 16.2.2012, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @  16.2.2012,  12:39 Найти цитируемый пост)
Для домашних заданий, курсовых,


Простите, но тут чисто прикладное задание - никаким обучением и не пахнет - я ж написал:
Цитата(cambit @  15.2.2012,  19:58 Найти цитируемый пост)
для объявления по громкой связи хочу проигрывать звон колокольчиков из wav-файла


Добавлено через 9 минут и 40 секунд
Цитата(xvr @  16.2.2012,  12:48 Найти цитируемый пост)
придется вам самому   

Тогда вряд-ли... Если я с азами никак не разберусь... я представлял себе это по-проще - запуск без окна из какой-нибудь ветки реестра...
Давайте вернемся к самой программе - 

Цитата(cambit @  16.2.2012,  12:37 Найти цитируемый пост)
Это правильно?

Цитата(cambit @  16.2.2012,  12:37 Найти цитируемый пост)
Просто дописать две строчки?

Так правильно я делаю или нет?
PM MAIL   Вверх
cambit
Дата 16.2.2012, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ладно, будем шаг за шагом.
Добавил в Test.cpp код открытия порта, как показал выше, пробую запустить отладку - получаю ошибку -
Код

E:\SOFT\ANNOUNCE\Test\Test.cpp(17) : error C2660: 'MessageBoxA' : function does not take 3 parameters
E:\SOFT\ANNOUNCE\Test\Test.cpp(21) : error C2660: 'MessageBoxA' : function does not take 3 parameters

Что не так?

Это сообщение отредактировал(а) cambit - 16.2.2012, 17:20
PM MAIL   Вверх
borisbn
Дата 16.2.2012, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



в MessageBox добавьте первым параметром 0


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
t_gran
Дата 16.2.2012, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Цитата

Что не так?

cambit, так вам же компилятор явно говорит, что данная функция не принимает 3 параметра, т.к. она принимает 4 (MessageBox function).
Цитата

... я представлял себе это по-проще - запуск без окна из какой-нибудь ветки реестра...

Вы наверное не совсем понимает, что такое реестр. Реестр - это хранилище данных и не более того.
Цитата

Простите, но тут чисто прикладное задание - никаким обучением и не пахнет - я ж написал:

Да, но если вам нужен код, то это именно сюда.

В общем решил я немного облегчить ваши поиски. Тут я вам написал не большую демку. Она полностью рабочая. Это сервис, который вы устанавливаете, и который каждую секунду прослушивает 1-ый com-порт. Как только приходит какой либо пакет, системный динамик вашего ПК будет издавать звук. Чем длиннее будет пришедший пакет, тем дольше будет сигнал. Сразу оговорюсь, что я перед тем как вам выложить, его хорошо проверил - работает. Вам осталось прикрутить звук который вам нужен, и вставить вызов функции вместо Beep().
Установка сервиса:
Код

   com2beep.exe install

Удаление сервиса:
Код

   com2beep.exe uninstall

Где управление сервисами, я думаю объяснять не нужно? Как только поставите, придётся запустить в ручную. Но после перезапуска системы, это уже не понадобится.
Код

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

TCHAR* serviceName = "com2beep";
SERVICE_STATUS serviceStatus;
SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
HANDLE stopServiceEvent = 0;

//----------------------------------------------//
HANDLE Connect(BYTE number)
{
   TCHAR name[16];
   sprintf(name, "\\\\.\\COM%u", number);
   
   HANDLE handle = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, NULL,
                              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

   if (handle == INVALID_HANDLE_VALUE)
   {
      return handle;
   }

   COMMTIMEOUTS tmt;
   tmt.ReadIntervalTimeout = MAXDWORD;
   tmt.ReadTotalTimeoutMultiplier = 0;
   tmt.ReadTotalTimeoutConstant = 10;
   tmt.WriteTotalTimeoutMultiplier = 0;
   tmt.WriteTotalTimeoutConstant = 100;
   
   if (SetCommTimeouts(handle, &tmt) == FALSE)
   {
      CloseHandle(handle);
      handle = INVALID_HANDLE_VALUE;
      return handle;
   }

   DCB comDCM;
   memset(&comDCM, 0, sizeof(comDCM));
   comDCM.DCBlength = sizeof(DCB);
   comDCM.BaudRate = CBR_19200;
   comDCM.ByteSize = 8;
   comDCM.Parity = NOPARITY;
   comDCM.StopBits = ONESTOPBIT;
   comDCM.fAbortOnError = TRUE;
   comDCM.fDtrControl = DTR_CONTROL_HANDSHAKE;
   comDCM.fRtsControl = RTS_CONTROL_HANDSHAKE;
   comDCM.fBinary = TRUE;
   comDCM.fParity = FALSE;
   comDCM.fInX = comDCM.fOutX = FALSE;
   comDCM.XonChar = 0x11;
   comDCM.XoffChar = 0x13;
   comDCM.fErrorChar = FALSE;
   comDCM.fNull = FALSE;
   comDCM.fOutxCtsFlow = FALSE;
   comDCM.fOutxDsrFlow = FALSE;
   comDCM.XonLim = 256;
   comDCM.XoffLim = 256;
   
   if (SetCommState(handle, &comDCM) == FALSE)
   {
      CloseHandle(handle);
      handle = INVALID_HANDLE_VALUE;
      return handle;
   }

   return handle;                           
}
//----------------------------------------------//
void Disconnect(HANDLE handle)
{
   if (handle != INVALID_HANDLE_VALUE)
   {
      CloseHandle(handle);
      handle = INVALID_HANDLE_VALUE;
   }
}
//----------------------------------------------//
DWORD GetCountBytesFromPort(HANDLE handle)
{
   BYTE data[1024];
   static const DWORD length = sizeof(data) / sizeof(*data);
   
   DWORD feedback;

   ReadFile(handle, data, length, &feedback, NULL);
   
   return feedback;
}
//----------------------------------------------//
void WINAPI ServiceControlHandler(DWORD controlCode)
{
   switch (controlCode)
   {
      case SERVICE_CONTROL_INTERROGATE:
         break;

      case SERVICE_CONTROL_SHUTDOWN:
      case SERVICE_CONTROL_STOP:
         serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
         SetServiceStatus(serviceStatusHandle, &serviceStatus);

         SetEvent(stopServiceEvent);
         return;

      case SERVICE_CONTROL_PAUSE:
         break;

      case SERVICE_CONTROL_CONTINUE:
         break;

      default:
      {
         break;
      }
   }

   SetServiceStatus(serviceStatusHandle, &serviceStatus);
}
//----------------------------------------------//
void WINAPI ServiceMain(DWORD argc, TCHAR* argv[])
{
   serviceStatus.dwServiceType = SERVICE_WIN32;
   serviceStatus.dwCurrentState = SERVICE_STOPPED;
   serviceStatus.dwControlsAccepted = 0;
   serviceStatus.dwWin32ExitCode = NO_ERROR;
   serviceStatus.dwServiceSpecificExitCode = NO_ERROR;
   serviceStatus.dwCheckPoint = 0;
   serviceStatus.dwWaitHint = 0;

   serviceStatusHandle = RegisterServiceCtrlHandler(serviceName, ServiceControlHandler);

   if (serviceStatusHandle == 0)
   {
      return;
   }

   serviceStatus.dwCurrentState = SERVICE_START_PENDING;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);

   stopServiceEvent = CreateEvent(0, FALSE, FALSE, 0);

   serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
   serviceStatus.dwCurrentState = SERVICE_RUNNING;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);

   HANDLE handle = Connect(1);

   if (handle != INVALID_HANDLE_VALUE)
   {
      // Вот тут вставляйте свои хотелки
      do
      {
         DWORD length = GetCountBytesFromPort(handle);
         if (length)
         {
            Beep(1000, 10*length);
         }
      }
      while (WaitForSingleObject(stopServiceEvent, 1000) == WAIT_TIMEOUT);
      
   }

   Disconnect(handle);

   serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);

   CloseHandle(stopServiceEvent);
   stopServiceEvent = 0;

   serviceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
   serviceStatus.dwCurrentState = SERVICE_STOPPED;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
}
//----------------------------------------------//
void RunService()
{
   SERVICE_TABLE_ENTRY serviceTable[] =
   {
      { serviceName, ServiceMain },
      { 0, 0 }
   };

   StartServiceCtrlDispatcher(serviceTable);
}
//----------------------------------------------//
void InstallService()
{
   SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);

   if (serviceControlManager)
   {
      TCHAR path[ _MAX_PATH + 1];
      if (GetModuleFileName(0, path, sizeof(path) / sizeof(path[0])) > 0)
      {
         SC_HANDLE service = CreateService(serviceControlManager,
                                           serviceName, serviceName,
                                           SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
                                           SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, path,
                                           0, 0, 0, 0, 0);
         if (service)
         {
            CloseServiceHandle(service);
         }
      }

      CloseServiceHandle(serviceControlManager);
   }
}
//----------------------------------------------//
void UninstallService()
{
   SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CONNECT);

   if (serviceControlManager)
   {
      SC_HANDLE service = OpenService(serviceControlManager,
                                      serviceName, SERVICE_QUERY_STATUS | DELETE);
      if (service)
      {
         SERVICE_STATUS serviceStatus;
         if (QueryServiceStatus(service, &serviceStatus))
         {
            if (serviceStatus.dwCurrentState == SERVICE_STOPPED)
            {
               DeleteService(service);
            }
         }

         CloseServiceHandle(service);
      }

      CloseServiceHandle(serviceControlManager);
   }
}
//----------------------------------------------//
int main(int argc, char** argv)
{
   if (argc > 1 && strcmp(argv[1], "install") == 0)
   {
      InstallService();
   }
   else if (argc > 1 && strcmp(argv[1], "uninstall") == 0)
   {
      UninstallService();
   }
   else
   {
      RunService();
   }

   return 0;
}


Бинарник с исходником прикрепляю ниже.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  com2beep.7z 4,84 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
borisbn
Дата 16.2.2012, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



алгоритм д.б. примерно такой
Код

DWORD WINAPI MyThreadProc( LPVOID lpParameter )
{
    while( 1 ) {
        ULONG lpEvtMask=0;
        HANDLE hFile = (HANDLE)lpParameter;
        WaitCommEvent( hFile, &lpEvtMask, NULL);
        PlaySound( "c:\\Full\\Path\\To\\wave_file.wav" );
    }
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    HANDLE hFile = CreateFile ...
    SetCommMask(hFile, EV_CTS|EV_DSR);
    HANDLE thread = CreateThread( 0, 0, MyThreadProc, (void*)hFile, 0 );
    WaitForSingleObject( thread,  INFINITE );
}

могут быть какие-то нюансы, но в общем - как-то так.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
cambit
Дата 16.2.2012, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(t_gran @  16.2.2012,  18:27 Найти цитируемый пост)
В общем решил я немного облегчить ваши поиски

Спасибо огромное, не ожидал! Обычно ограничиваются "смотри здесь ..." и т.д. Но, не посчитайте за наглость, есть несколько уточнений. Я не совсем пока не понял сути программы, но по Вашему описанию 
Цитата(t_gran @  16.2.2012,  18:27 Найти цитируемый пост)
Как только приходит какой либо пакет

в моем случае пакет не будет приходить - не откуда, протокол RS-232 не используется. При нажатии кнопки на микрофоне на какой-либо вывод СОМ-порта (СTS или DSR или др.- аппаратно не важно) банально будет подана логическая "1" и все, палец отпустили - пропала. Поэтому я и отталкивался от статьи, указанной в первом посту, где функция SetCommMask() отслеживает события на заданных входах СОМ-порта.
И еще пара мелочей - дребезг контактов выключателя -желательно бы сделать паузу приблизительно 0,2 сек.после старта PlaySound, чтоб не допустить запуска нескольких экземпляров процессов воспроизведения звукового файла, но с этим я думаю справлюсь сам. И, на конец, файл должен воспроизвестись один раз, пока нажата кнопка, второй раз - только после отпускания и её повторного нажатия.
Еще раз спавибо за участие!!!!!! Если не прав - значит что-то не понял, прошу сильно не пинать...

Это сообщение отредактировал(а) cambit - 16.2.2012, 20:29
PM MAIL   Вверх
t_gran
Дата 17.2.2012, 02:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Код

... дребезг контактов выключателя -желательно бы сделать паузу приблизительно 0,2 сек.после старта PlaySound

Да хоть сколько smile Для потока, тем же Sleep воспользуйтесь.

Код

И, на конец, файл должен воспроизвестись один раз, пока нажата кнопка, второй раз - только после отпускания и её повторного нажатия.

Это тоже мелочь. Вы сейчас хотя бы реализуйте рабочую программу, а там и с этим разберётесь. Можно будет воспользоваться либо объектом синхронизации, либо свой костыль прикрутить в виде логической переменной (а-ля: isNowPlaySound).

cambit, теперь картина стала ясней.
Давайте попробуем так. Работу этой версии не смог проверить, в связи с отсутствием возможности установить управляющие аппаратные сигналы. Но сниффером видно, что программа слушает порт. Попробуйте.
Код

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
TCHAR* serviceName = "com2beep";
SERVICE_STATUS serviceStatus;
SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
HANDLE stopServiceEvent = 0;
//----------------------------------------------//
HANDLE Connect(BYTE number)
{
   TCHAR name[16];
   sprintf(name, "\\\\.\\COM%u", number);
   
   HANDLE handle = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, NULL,
                              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

   return handle;                         
}
//----------------------------------------------//
void Disconnect(HANDLE handle)
{
   if (handle != INVALID_HANDLE_VALUE)
   {
      CloseHandle(handle);
      handle = INVALID_HANDLE_VALUE;
   }
}
//----------------------------------------------//
void WINAPI ServiceControlHandler(DWORD controlCode)
{
   switch (controlCode)
   {
      case SERVICE_CONTROL_INTERROGATE:
         break;
      case SERVICE_CONTROL_SHUTDOWN:
      case SERVICE_CONTROL_STOP:
         serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
         SetServiceStatus(serviceStatusHandle, &serviceStatus);
         SetEvent(stopServiceEvent);
         return;
      case SERVICE_CONTROL_PAUSE:
         break;
      case SERVICE_CONTROL_CONTINUE:
         break;
      default:
      {
         break;
      }
   }
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
}
//----------------------------------------------//
DWORD WINAPI Sounder(LPVOID lpParameter)
{
   DWORD lpEvtMask;
   HANDLE handle = (HANDLE)lpParameter;

   while (WaitForSingleObject(stopServiceEvent, 200) == WAIT_TIMEOUT)
   {
      if (GetCommModemStatus(handle, &lpEvtMask) && lpEvtMask)
      {
         Beep(1000, 100);
      }
   }

   return 0;
}
//----------------------------------------------//
void WINAPI ServiceMain(DWORD argc, TCHAR* argv[])
{
   serviceStatus.dwServiceType = SERVICE_WIN32;
   serviceStatus.dwCurrentState = SERVICE_STOPPED;
   serviceStatus.dwControlsAccepted = 0;
   serviceStatus.dwWin32ExitCode = NO_ERROR;
   serviceStatus.dwServiceSpecificExitCode = NO_ERROR;
   serviceStatus.dwCheckPoint = 0;
   serviceStatus.dwWaitHint = 0;
   serviceStatusHandle = RegisterServiceCtrlHandler(serviceName, ServiceControlHandler);
   if (serviceStatusHandle == 0)
   {
      return;
   }
   serviceStatus.dwCurrentState = SERVICE_START_PENDING;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
   stopServiceEvent = CreateEvent(0, FALSE, FALSE, 0);
   serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
   serviceStatus.dwCurrentState = SERVICE_RUNNING;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);

   HANDLE handle = Connect(1);
   //SetCommMask(handle, EV_CTS|EV_DSR);

   if (handle != INVALID_HANDLE_VALUE)
   {
      CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Sounder, (LPVOID)handle, 0, 0);
      WaitForSingleObject(stopServiceEvent, INFINITE);
   }

   Disconnect(handle);

   serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
   CloseHandle(stopServiceEvent);
   stopServiceEvent = 0;
   serviceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
   serviceStatus.dwCurrentState = SERVICE_STOPPED;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
}
//----------------------------------------------//
void RunService()
{
   SERVICE_TABLE_ENTRY serviceTable[] =  {{serviceName, ServiceMain},
                                          { 0, 0 }};
   StartServiceCtrlDispatcher(serviceTable);
}
//----------------------------------------------//
void InstallService()
{
   SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
   if (serviceControlManager)
   {
      TCHAR path[_MAX_PATH + 1];
      if (GetModuleFileName(0, path, sizeof(path) / sizeof(path[0])) > 0)
      {
         SC_HANDLE service = CreateService(serviceControlManager,
                                           serviceName, serviceName,
                                           SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
                                           SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, path,
                                           0, 0, 0, 0, 0);
         if (service)
         {
            CloseServiceHandle(service);
         }
      }
      CloseServiceHandle(serviceControlManager);
   }
}
//----------------------------------------------//
void UninstallService()
{
   SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
   if (serviceControlManager)
   {
      SC_HANDLE service = OpenService(serviceControlManager,
                                      serviceName, SERVICE_QUERY_STATUS | DELETE);
      if (service)
      {
         SERVICE_STATUS serviceStatus;
         if (QueryServiceStatus(service, &serviceStatus))
         {
            if (serviceStatus.dwCurrentState == SERVICE_STOPPED)
            {
               DeleteService(service);
            }
         }
         CloseServiceHandle(service);
      }
      CloseServiceHandle(serviceControlManager);
   }
}
//----------------------------------------------//
int main(int argc, char** argv)
{
   if (argc > 1 && strcmp(argv[1], "install") == 0)
   {
      InstallService();
   }
   else if (argc > 1 && strcmp(argv[1], "uninstall") == 0)
   {
      UninstallService();
   }
   else
   {
      RunService();
   }
   return 0;
}


Это сообщение отредактировал(а) t_gran - 17.2.2012, 04:25

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  com2beep.7z 5,32 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
cambit
Дата 17.2.2012, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, Уважаемый! В понедельник попробую и отпишусь - сегодня в командировке. Еще раз спасибо!!!!
PM MAIL   Вверх
cambit
Дата 20.2.2012, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Чегото ничего не слышно... Подавал логические "1" и "0" на входа CTS и DSR - звука никакого небыло. В процессах com2beep есть. Что делать? Или может надо на оба входа сразу подать?

Это сообщение отредактировал(а) cambit - 20.2.2012, 16:42
PM MAIL   Вверх
borisbn
Дата 20.2.2012, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(cambit @  20.2.2012,  16:41 Найти цитируемый пост)
Что делать?

вставить вместо PlaySound
Код
MessageBox( 0, "Triggered !!!", "com2beep caption", MB_OK );

Если сообщение выводится, то проблема в параметрах PlaySound, если нет - то Вы просто не получаете события.
Если Вы написали свою программу, то выкладывайтё её сюда, если же взяли от t_gran и ничего не изменяли - то не нужно, она и так здесь есть.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
cambit
Дата 20.2.2012, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Использовал ту, что прислали. НО! Где в коде "PlaySound"?
Я видел только 
Код

Beep(1000, 100);

PM MAIL   Вверх
borisbn
Дата 20.2.2012, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(cambit @  20.2.2012,  17:24 Найти цитируемый пост)
НО! Где в коде "PlaySound"?

смотрел по диагонали... ну, замените этот Beep на MessageBox. Важно узнать, что не отрабатывает - перехват сигналов с порта или реакция на этот перехват.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
cambit
Дата 20.2.2012, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



М-Да.... Открыл прилагаемый файл com2beep.c в VC++ 6.0 нажал создать .ехе получил 5 ошибок и 5 предупреждений. Вот они:
com2beep.c
D:\Boock\com2beep\com2beep.c(14) : error C2275: 'HANDLE' : illegal use of this type as an expression
        c:\program files\microsoft visual studio\vc98\include\winnt.h(207) : see declaration of 'HANDLE'
D:\Boock\com2beep\com2beep.c(14) : error C2146: syntax error : missing ';' before identifier 'handle'
D:\Boock\com2beep\com2beep.c(14) : error C2065: 'handle' : undeclared identifier
D:\Boock\com2beep\com2beep.c(15) : warning C4047: '=' : 'int ' differs in levels of indirection from 'void *'
D:\Boock\com2beep\com2beep.c(17) : warning C4047: 'return' : 'void *' differs in levels of indirection from 'int '
D:\Boock\com2beep\com2beep.c(90) : error C2275: 'HANDLE' : illegal use of this type as an expression
        c:\program files\microsoft visual studio\vc98\include\winnt.h(207) : see declaration of 'HANDLE'
D:\Boock\com2beep\com2beep.c(90) : error C2146: syntax error : missing ';' before identifier 'handle'
D:\Boock\com2beep\com2beep.c(90) : warning C4047: '=' : 'int ' differs in levels of indirection from 'void *'
D:\Boock\com2beep\com2beep.c(93) : warning C4047: '!=' : 'int ' differs in levels of indirection from 'void *'
D:\Boock\com2beep\com2beep.c(99) : warning C4022: 'Disconnect' : pointer mismatch for actual parameter 1
Error executing cl.exe.

com2beep.exe - 5 error(s), 5 warning(s)

Что-то не так сделал?
Я так полагаю, этот код вставлять нужно в созданный ранее проект?

Это сообщение отредактировал(а) cambit - 20.2.2012, 18:30
PM MAIL   Вверх
t_gran
Дата 20.2.2012, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Тестируйте. Сам отпишусь только завтра, ибо у нас уже за полночь, а завтра на работу. :-(

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  com2beep.7z 4,40 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
t_gran
Дата 21.2.2012, 05:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Всё, можете забирать. Прикрутил я звук и протестировал. У меня работает на УРА.
Код

#include <windows.h>
#include <shlwapi.h>
#include <stdio.h>
#include <stdlib.h>

#define SOUND_NAME "melody.wav"

TCHAR* serviceName = "com2sound";
SERVICE_STATUS serviceStatus;
SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
HANDLE stopServiceEvent = 0;

//----------------------------------------------//
HANDLE Connect(BYTE number)
{
   TCHAR name[16];
   sprintf(name, "\\\\.\\COM%u", number);

   HANDLE handle = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, NULL,
                              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

   return handle;
}
//----------------------------------------------//
void Disconnect(HANDLE handle)
{
   if (handle != INVALID_HANDLE_VALUE)
   {
      CloseHandle(handle);
      handle = INVALID_HANDLE_VALUE;
   }
}
//----------------------------------------------//
void WINAPI ServiceControlHandler(DWORD controlCode)
{
   switch (controlCode)
   {
      case SERVICE_CONTROL_INTERROGATE:
         break;
      case SERVICE_CONTROL_SHUTDOWN:
      case SERVICE_CONTROL_STOP:
         serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
         SetServiceStatus(serviceStatusHandle, &serviceStatus);
         SetEvent(stopServiceEvent);
         return;
      case SERVICE_CONTROL_PAUSE:
         break;
      case SERVICE_CONTROL_CONTINUE:
         break;
      default:
      {
         break;
      }
   }
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
}
//----------------------------------------------//
void GetSoundName(LPTSTR pszName)
{
   TCHAR path[_MAX_PATH];
   GetModuleFileName(NULL, path, sizeof(path));
   PathRemoveFileSpec(path);
   sprintf(pszName, "%s\\%s", path, SOUND_NAME);
}
//----------------------------------------------//
DWORD WINAPI Sounder(LPVOID lpParameter)
{
   TCHAR sndname[_MAX_PATH];
   GetSoundName(sndname);
   
   DWORD lpEvtMask = 0;
   HANDLE handle = (HANDLE)lpParameter;
   while (WaitForSingleObject(stopServiceEvent, 200) == WAIT_TIMEOUT)
   {
      if (GetCommModemStatus(handle, &lpEvtMask) && lpEvtMask)
      {
         PlaySound(sndname, NULL, SND_SYNC | SND_FILENAME);
      }
   }
   return 0;
}
//----------------------------------------------//
void WINAPI ServiceMain(DWORD argc, TCHAR* argv[])
{
   serviceStatus.dwServiceType = SERVICE_WIN32;
   serviceStatus.dwCurrentState = SERVICE_STOPPED;
   serviceStatus.dwControlsAccepted = 0;
   serviceStatus.dwWin32ExitCode = NO_ERROR;
   serviceStatus.dwServiceSpecificExitCode = NO_ERROR;
   serviceStatus.dwCheckPoint = 0;
   serviceStatus.dwWaitHint = 0;
   serviceStatusHandle = RegisterServiceCtrlHandler(serviceName, ServiceControlHandler);
   if (serviceStatusHandle == 0)
   {
      return;
   }
   serviceStatus.dwCurrentState = SERVICE_START_PENDING;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
   stopServiceEvent = CreateEvent(0, FALSE, FALSE, 0);
   serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
   serviceStatus.dwCurrentState = SERVICE_RUNNING;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);

   HANDLE handle = Connect(1);

   if (handle != INVALID_HANDLE_VALUE)
   {
      CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Sounder, (LPVOID)handle, 0, 0);
      WaitForSingleObject(stopServiceEvent, INFINITE);
   }
   Disconnect(handle);

   serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
   CloseHandle(stopServiceEvent);
   stopServiceEvent = 0;
   serviceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
   serviceStatus.dwCurrentState = SERVICE_STOPPED;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
}
//----------------------------------------------//
void RunService()
{
   SERVICE_TABLE_ENTRY serviceTable[] =  {{serviceName, ServiceMain},
                                          { 0, 0 }};
   StartServiceCtrlDispatcher(serviceTable);
}
//----------------------------------------------//
void InstallService()
{
   SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
   if (serviceControlManager)
   {
      TCHAR path[_MAX_PATH + 1];
      if (GetModuleFileName(0, path, sizeof(path) / sizeof(path[0])) > 0)
      {
         SC_HANDLE service = CreateService(serviceControlManager,
                                           serviceName, serviceName,
                                           SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
                                           SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, path,
                                           0, 0, 0, 0, 0);
         if (service)
         {
            CloseServiceHandle(service);
         }
      }
      CloseServiceHandle(serviceControlManager);
   }
}
//----------------------------------------------//
void UninstallService()
{
   SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
   if (serviceControlManager)
   {
      SC_HANDLE service = OpenService(serviceControlManager,
                                      serviceName, SERVICE_QUERY_STATUS | DELETE);
      if (service)
      {
         SERVICE_STATUS serviceStatus;
         if (QueryServiceStatus(service, &serviceStatus))
         {
            if (serviceStatus.dwCurrentState == SERVICE_STOPPED)
            {
               DeleteService(service);
            }
         }
         CloseServiceHandle(service);
      }
      CloseServiceHandle(serviceControlManager);
   }
}
//----------------------------------------------//
int main(int argc, char** argv)
{
   if (argc > 1 && strcmp(argv[1], "install") == 0)
   {
      InstallService();
   }
   else if (argc > 1 && strcmp(argv[1], "uninstall") == 0)
   {
      UninstallService();
   }
   else
   {
      RunService();
   }
   return 0;
}

Как протестируете, отпишитесь.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  com2sound.7z 88,03 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
cambit
Дата 27.2.2012, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Извините, господа, некоторое время отсутствовал. Прогу попробовал - работает на УРА! Спасибо огромное!!!!     
И даже не надо делать защиту от дребезга контактов - прога ждет окончания воспроизведения файла. А вот дальше  - снова воспроизводит тот же файл по кругу, пока не отпущу кнопку. А надо бы чтобы один раз - и все... Что и, главное, куда дописать?

Это сообщение отредактировал(а) cambit - 27.2.2012, 17:55
PM MAIL   Вверх
t_gran
Дата 28.2.2012, 04:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Цитата

А надо бы чтобы один раз - и все...

Не вопрос, сделаем. Только уточните, мелодия должна полностью проиграть, или играть до тех пор, пока кнопка нажата? 


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
cambit
Дата 5.3.2012, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вы имеете ввиду, если кнопка отпущена раньше? До конца файла, конечно.

Это сообщение отредактировал(а) cambit - 5.3.2012, 10:47
PM MAIL   Вверх
t_gran
Дата 5.3.2012, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



cambit, забирайте. Не забудьте пометить тему как решённую.


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  archive.7z 87,05 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
cambit
Дата 5.3.2012, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Упс... извините. Инсталирую службу, захожу в администрирование - службы, пытаюсь стартовать службу - стартует и сразу останавливается, т.к. говорит "... нечего делать..." Все предыдущие запускались нормально...
PM MAIL   Вверх
t_gran
Дата 5.3.2012, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



cambit, прошу меня извинить. Т.к. у меня нет физически подключенного устройства, я использовал для тестирования эмулятор, ну и скомпилировал программу с ориентацией на 10-ый com-порт.   Можете посмотреть, в исходниках там видно. Ну вот, исправленная версия.


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  com2sound.7z 87,05 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
cambit
Дата 13.3.2012, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Cпасибо, Уважаемый ! Все работает. Благодарю за помощь!!!
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

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


 




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


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

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