Отправляет email-рассылки с помощью сервиса Sendsay

Инвестиции: Вопрос-Ответ

  Все выпуски  

C/C++ Вопрос-Ответ Выпуск № 32


Информационный Канал Subscribe.Ru

C/C++ Вопрос-Ответ

Выпуск      : 32
Подписчиков : 2900
Cайт        : SoftMaker.com.ru
Архив       : C/C++ Вопрос-Ответ (архив)
В этом выпуске
Системное программирование в среде Windows.

Системное программирование в среде Windows

От ведущего

Здравствуйте уважаемые подписчики !

Как всегда, рад приветствовть вас на страницах этой рассылки.

Поздравляю всех подписчиков рассылки с наступающим праздником.

С Новым Годом !

Желаю всем вам веселого праздника, приятных выходных, творческих успехов и удачи в новом году. Будьте счастливы !

Напоминаю, что, как обычно, вы можете отправить свои пожелания (замечания, предложения, сообщения об ошибках) по поводу рассылки и сайта по этому адресу.

Если вы хотите создать и вести какой либо раздел в этой рассылке - также пишите мне.

И, как всегда, вы можете задать свои вопросы по программированию на сайте в форуме.
Или обсудить их в дискуссионном листе "Программирование. форум !!!".

Многим может быть также интересна рассылка: Visual С++ - расширенное программирование, где можно прочитать описания нестандартных приемов программирования с помощъю библиотеки MFC - 'трюков', 'хаков', недокументированных функций.

С уважением, Вахтуров Виктор.

Подписчикам

Чтобы заранее разрешить возможные недоразумения, прошу Вас помнить, что вопросы публикуются в рассылке только один раз. Поэтому, если Вам не ответили в этом выпуске, или ваш вопрос не был опубликован, пришлите его еще раз. Не стоит отвечать на вопрос, который был задан в предыдущем выпуске (за исключением случая, когда он снова опубликован в этом).

Для того, чтобы задать свой вопрос, пришлите письмо, кликнув по этой ссылке.
Для того, чтобы ответить на вопрос, надо кликнуть по ссылке "ответить", расположенной под текстом вопроса.

Небольшое примечание. Господа, если Вы хотите, чтобы Ваш e-mail был опубликован в рассылке, специально и явно укажите это в письме. Иначе e-mail адреса, указанные в теле Вашего письма в рассылке опубликованы не будут.

Вопросы

Для того, чтобы задать свой вопрос, кликните этой ссылке (вопрос будет опубликован в следующем номере).
Вы можете задавать любые вопросы, касающиеся программирования на языке C и C++. Это могут быть вопросы, касающиеся как конструкций языка, применения библиотек классов, шаблонов (таких как MFC или STL), использования компиляторов, так и самой философии программирования на C или C++. Здесь нет ограничений - спрашивайте и получайте ответы.

Вопрос № 120 ( Сергей Кузин )

Кто нибудь знает как к MS SQL Server подключиться не пользуясь платными библиотеками из Visual Studio.
Я работаю в Dev-Cpp? если можно то как из этой среды подключиться?

Ответить на вопрос

Вопрос № 121 ( mNOK )

Народ, я понимаю что такие вопросы могли уже пролетать в рассылке. Но все же хотелось бы спросить.
Может кто знает ссылки на скачивание хороших книг по программироваию на C++ ? Хотелось бы найти достойные книжки в электронном варианте, а то бумажные и дорого и много места занимают :) Очень прошу, поделитесь ссылками ! И если возможно, напишите названия и на каком языке книжки.

Ответить на вопрос

Вопрос № 122 ( mail_39769807 )

Здравствуйте, уважаемые участники рассылки !
Мой вопрос таков: не мог бы кто подсказать, как созавать ярлыки на рабочем столе, в меню (в главном и в меню "программы") и ярлыки на панели быстрого запуска как это делают инсталляторы ?
Заранее спасибо всем ответившим.

Ответить на вопрос

Вопрос № 123 ( Arsa )

Здравствуйте !

Вопрос насчет List Control - а.
Есть обычный список в режиме таблицы (Report). Установив ему стиль LVS_EDITLABELS можно получить список с редактируемым содержимым итемов. Но к сожалению, отредактировать возможно только содержимое первого столбца. В какой то программе я точно видел список, где редактировались все ячейки. Вот вопрос состоит в том как получить такой список, который выглядит как таблица и значение каждой его ячейки можно отредактировать ? Может быть, есть еще какие то стили ?
И попутный вопрос. А как делают так, что при редактировании ячейки списка вместо элемента Edit появляется Combo Box ?
Использую MFC.

Ответить на вопрос

Ответы

Ниже приведены вопросы предыдущего выпуска и ответы на них.

Вопрос № 115 ( Wishmaster )

Здрасьте:))
Вы мне не подскажите что это за глюк?? Я его (а он меня) уже очень давно
мучаем...
Скажу сразу - пишу я на Visual C++.NET с OpenGL'ем.
"Appl.cpp(90) : error C2664: 'sprintf' : cannot convert parameter 2 from
'std::string' to 'const char *'
No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called"
Как от него избавиться?
Ну или собсно вот такой аналогичный глюк:
"Appl.cpp(87) : error C2664: 'auxDIBImageLoadA' : cannot convert parameter 1
from 'std::string' to 'LPCSTR'
No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called"
Заранее благодарен! Жду ответа....

Ответ ( 123123 123123123 )

друг, дело в том ,что вызываемые тобой ф-ии(ты не написал какие) в качестве параметра требуют , по всей видимости тип указателя на char(char* и LPSTR одно и тоже)а ты пытаешся передать тип string из стандартного namespace.Совет такой: преобразовывай! Не помню какой метод но посмотри найдёш

Ответ ( силентий )

Какой же это глюк? Все правильно. Древняя как Юникс функция C sprintf
понятия не имеет об относительно молодой библиотеке классов C++ вообще
и классе string в частности. Решается данная проблема примерно так:

std::string s("Hello world\n");
printf("Here goes our string: %s", s.c_str());

Метод char* std::string::c_str() возвращает именно то, что нужно:
классическую сишную ASCIIZ-строку.

Ответ ( Шматко А.А. )

Любопытно, а почему используя STL, ты не переходишь на потоки C++?
Устаревший, неудобный, медленный и небезопасный C стиль в виде Xprintf и
Xscanf давно уж следует забыть... Если бы ты вместо sprintf использовал
std::ostream, проблем бы не было. sprintf() и знать не знает (да и не может
в принципе) о классах, а std::string не имеет перегруженного operator
char*(). Сознательно не имеет, так как теоретически такое преобразование
может быть небыстрым. Ведь std::string не обязан хранить всю строку в
"удобном" для преобразования виде, он её хранит в виде, удобном для других,
более часто использующихся операций. Но можно использовать метод
std::string::c_str(), который возвращает const char*, но в такую C-строку
нельзя будет записывать информацию, только читать. А чтобы каким-нибудь
scanf() прочитать в строку, то это только через промежуточные буферы,
например, через std::vector<char>.
Короткое резюме - переходи на потоки C++. И не верь, если будут
утверждать, что они медленные. У меня только ввод/вывод float-ов на 11%
медленнее, чем у С-потоков, но с этим я согласен мириться, учитывая какие
премущества мне эти потоки предоставляют. Остальное работает быстрее на
5-30%. А бинарный ввод/вывод (в смысле не форматированный operator<<() и
operator>>(), а методами std::basic_istream<>::read() и
std::basic_ostream<>::write()) по скоростям не уступают WinAPIшным
ReadFile() и WriteFile().

Ответ ( Максим Шифман )

Нужно понимать, что std::string - это стандартный контейнер. Нельзя используя функцию sprintf осуществлять запись в него! Нужно либо использовать функции этого контейнера для работы с хранящейся в контейнере строкой (append, например), либо создавать промежуточный буфер, формировать в нем строку, а затем на основе этого буфера конструировать контейнер. Например так:

long i = 12345;
char buf[64];
sprintf(buf, "%d", i);
 
string str(buf); // Здесь мы конструируем контейнер из
                 // строки buf - "12345".
str.append(buf); // А так мы, например, добавляем к тому, что
                 // содержится в str еще одну подстроку.
                 // Теперь в str будет: "1234512345"

Если теперь строку, содержащуюся в str нужно передать в функцию в качестве параметра типа char* (или LPCSTR) пишем так:

FunctionX(str.c_str()); // Функция c_str() контейнера
                        // возвращает ссылку на хранящуюся
                        // в нем строку.

Ответ ( DarkSide )

Hello q,

Блин, все же русским языком написано. Ну нельзя скастить std::string к LPCSTR. Есть вообще-то метод str.c_str() возвращающий null-treminated строку. Надо читать то, что тебе пишет компилятор.

Ответ ( Neco )

У меня тоже такое было и я так понял, что это связано с управляемой
памятью, т.е. под Нэтом эти функции юзать нельзя - надо учиться
прогить по-другому. В общем, на C++ .NET я так и не начал писать -
мутный он. Да и не вижу смысла.

Ответ ( LifeMaker )

char* (он же - LPCSTR) это один тип данных, а std::string - абсолютно
другой.
char* - указатель на массив символов.
string (или std::string, если быть более точным) - это класс из
стандартной библиотеки.
В твоём случае, функции требуют строк в стиле языка C, а не string.
Класс string содержит специальный метод для получения С-строк -
c_str().

Т.е. корректый вызов выглядит следующим образом:

string str;
 ...
sprintf(str.c_str(),...);

Ответ ( Георгий )

По поводу первой ошибки - используй что-то вроде:

string str = "123";
sprintf(lalala, "lalala", str.c_str());

Вторая должна аналогично испраляться.

Ответ ( zeus_2003 )

Здравствуйте, q. Вы писали:

>>Здрасьте:))
>>Вы мне не подскажите что это за глюк?? Я его (а он меня) уже очень давно
>>мучаем...
>>Скажу сразу - пишу я на Visual C++.NET с OpenGL'ем.
>>"Appl.cpp(90) : error C2664: 'sprintf' : cannot convert parameter 2 from
>>'std::string' to 'const char *'
>>No user-defined-conversion operator available that can perform this
>>conversion, or the operator cannot be called"
>>Как от него избавиться?
>>Ну или собсно вот такой аналогичный глюк:
>>"Appl.cpp(87) : error C2664: 'auxDIBImageLoadA' : cannot convert parameter 1
>>from 'std::string' to 'LPCSTR'
>>No user-defined-conversion operator available that can perform this
>>conversion, or the operator cannot be called"
>>Заранее благодарен! Жду ответа....

вообще это ошибка преобразования типов.
и, кстати, неплохо было бы написать проблемный кусок кода.
видимо это что-то вроде
sprintf(bud,name,value); // где name имеет тип std::string Решение:
std::string есть фунцкция c_str(), которая
возвращает const char*.
т.е. пишете, например, вот так:

std::string name="%d";
int i=666;
char buf[256];
sprintf(buf,name.c_str(),i);// c_str() вернет указатель на
                            // const char, как и просит
                            // sprintf

аналогично и с неизвестной мне функцией auxDIBImageLoadA(видимо
подгружающей битмапы).
последовательность дейтсвий такова: ставим курсор на "LPCSTR",
нажимаем F12 = видим, что LPSTR это тот же const char*.
следовательно пишем:
auxDIBImageLoadA(text.c_str(), ... );
Вопрос № 116 ( Smart )

Наверно я задаю не новый вопрос. Но пока не разобрался как это можно сделать.
Мне хотелось бы решить проблему с запуском приложения несколько раз. Точнее есть даже две задачи.

1. Сделать так, чтобы приложение запускалось только один раз. Моя программа должна запускаться из автозагрузки и окна у нее нет. Но пользователь не видит работает программа или нет (ему по сути дела должно быть все равно), но он может прост озапустить .exe файл программы. И вот надо это предотвратить.
2. Это уже просто интересно. Надо сосчитать сколько копий приложения запущено. Например Total Commander когда его запускаешь несколько раз пишет в заголовке номер. Например "[4] Total Commander".

Если кто т оподелится кусочком кода на C++ будет просто прекрасно !

Ответ ( Шматко А.А. )

Это несложно. Первое. Создаёшь при старте программы именованный мьютекс
HANDLE hMutex=CreateMutex(NULL, FALSE,
"myMutex__969C164C-C4E8-4ff6-BF7D-EB0A4C98F127"). Проверить на ошибки не
забыть. Здесь в качестве имени используется GUID - ну точно уникальное имя.
Затем пытаешься его захватить WaitForSingleObject(hMutex, 0). Если
получилось, то это первый экземпляр программы - держишь его захваченным всё
время работы программы, а перед завершением программы ReleaseMutex(hMutex) и
CloseHandle(hMutex). Если захват мьютекса провалится, тот
WaitForSingleObject() тут же (ведь таймаут-то нулевой) вернёт WAIT_TIMEOUT -
значит программа уже запущена. CloseHandle() и выход.
Второе. Посчёт количества запущеных экземпляров программы проще всего
осуществлять семафорами. Создаёшь именованный семафор с нулевым начальным
счётчиком и максимальным значением побольше, например HANDLE
hSema=CreateSemaphore(NULL, 0, std::numeric_limits::max(),
"mySemaphore__969C164C-C4E8-4ff6-BF7D-EB0A4C98F127"), и тут же
ReleaseSemaphore(hSema, 1, &numApps), где LONG numApps - это переменная для
хранения количества экземпляров приложения. Перед выходом из программы
WaitForSingleObject(hSema, 0), чтобы уменьшить счётчик, ну и
CloseHandle(hSema) естественно. Последний запущенный экземпляр будет знать,
сколько таких экземпляров было загружено до него. Если нужно, чтобы об этом
знали все экземпляры, можно периодически делать
ReleaseSemaphore()/WaitForSingleObject() - так как ReleaseSemaphore() с
нулевым счётчиком освобождения вызывать нельзя почему-то - или при
старте/перед выходом рассылать SendMessage() своим окошкам. Чтобы не
случилось коллизий, освобождение/захват семафора и рассылку сообщений нужно
окаймлять именованным мьютексом. Тогда можно будет гарантировать
транзакционность пары операций "изменение счётчика"/"рассылка его значения".

Ответ ( Alexander )

1. Сделать так, чтобы приложение запускалось только один раз.
Моя программа должна запускаться из автозагрузки и окна у нее нет.
Но пользователь не видит работает программа или нет
(ему по сути дела должно быть все равно), но он может прост
озапустить .exe файл программы. И вот надо это предотвратить.

Ответ: можжно использовать мьютексы, например в Builder:
В модуле проекта:

bool Check(void) {
  HANDLE hm = OpenMutex(MUTEX_ALL_ACCESS, false,
                                          "MutexProgram");
  if (hm != NULL) return true;
  hm = CreateMutex(NULL, false, "MutexProgram");
}
 ...
 try
        {
                if (Check()) exit();
                Application->Initialize();
                Application->Title = "Network connections";
                Application->CreateForm(__classid(TMainForm),
                                           &MainForm);
                Application->Run();
        }

Писал на скорую руку. Могут быть ошибки.

2. Это уже просто интересно. Надо сосчитать сколько копий приложения запущено.
Например Total Commander когда его запускаешь несколько раз пишет в заголовке номер.
Например "[4] Total Commander".

Ответ (для Delphi):

program CrtApp;

uses
  SysUtils, WinTypes, WinProcs, WinCrt;

var
  NumInstances, SavePrevInst: word;

procedure GetInstanceData(hInst, Offset, Size: Word);
                                 far; external 'KERNEL';
begin
  SavePrevInst := hPrevInst;
  NumInstances := 0;
  while hPrevInst <> 0 do
  begin
    GetInstanceData(hPrevInst, Ofs(hPrevInst),
                               SizeOf(hPrevInst));
    Inc(NumInstances);
  end;
  Writeln('Уже запущено ', NumInstances, ' копий программы');
  hPrevInst := SavePrevInst;
end.

Ответ ( zEma )

Ну на самом деле все не очень трудно. Есть такая функция
EnumProcesses. Прочитать про нее можно в MSDN или тут:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/perfmon/base/enumprocesses.asp
C ее помощью можно получить список запущенных процессов. Точнее их ID.
По ID можно получить handle, а по хэндлу - имя файла, из которого
процесс запускался.
Таким образом, при запуске процессов проверяем, запусткали ли нас или
нет. Точно так же можно посчитать, сколько раз нас уже запускали

Ответ ( DarkSide )

Hello q,

IMHO, проще уже сервис написать, благо там даже тэмплейты есть.

Ответ ( Neco )

Чтобы посчитать количество экземпляров, это, пожалуй, надо куда-то,
типа реестра, записывать. Заодно и на корректность закрытия можно
будет проконтролировать. А если просто надо избежать двойного запуска,
то используй mutex'ы.

Ответ ( PadalkaAlex )

1.
Попробуй BOOL lsWindow(HWND hwnd).
Функция пределяет, существует ли окно для некоторого дескриптора Если окно с дескриптором hwnd существует (сделать выход из программы), функция возвращает ненулевое значение, иначе - нуль (продолжить работу).
2.
Можно попробовать писать статистику через файл (работает точно, сам проверял) или попробовать в цикле проверять по hwnd (не проверял).
Вопрос № 117 ( QQQz )

Подскажите пожалуйста, а как сделать в заголовке окна мигающую иконку как в браузере Maxthon ? Она там как бы переливается несколькими цветами когда идет загрузка страницы. Пишу на Visual C++.

Ответ ( 3V )

Самый простой путь - циклически по таймеру менять через SetClassLong иконку для главного окна (она, кстати, и на панели задач тогда меняться будет).
Можно нарисовать несколько иконок, добавить в ресурсы, потом загрузить их все и сделать массив дескрипторов, можно "склеить" все иконки в один битмап, на его основе создать Image List и пользоваться всякими там ImageList_GetIcon для получения очередной иконки.
Я как то давно сделал такое в одном из проектов. Прикольно конечно... Но в общем - просто еще один бантик.
Вопрос № 118 ( QQQz )

Подскажите пожалуйста, а как можно сделать такие закладки для переключения между окнами просмотра как в браузерах Opera, Mozilla, MyIE, и.т.д. ?

Ответ ( DarkSide )

Hello q,

Ну это смотря где писать. У меня есть вполне работающий пример на C++ Builder, могу кинуть если хочешь. darkside-list@yandex.ru

Ответ ( 3V )

Нда... на столь общий вопрос можно дать только весьма общий ответ (хотя, в чем собственно, вопрос то ?).
Создается контрол "закладок" (Tab Control), суется либо в панель инструментов, которая приклеивается куда нужно (вверх, вниз), либо помещается прямо в главное окно. Потом обрабатываешь всякие WM_SIZE/WM_SIZING-и, WM_WINDOWPOSCHANGED/WM_WINDOWPOSCHANGING-и, и.т.д. короче, правильно позиционируешь контрол.
Когда создаеш очередное окно документа - добавляешь соответствующую вкладку. Ну, и ловишь от Tab Control-а уведомления и соответствующим образом переключаешь окна.
З.Ы. Может, тебе поможет вот это: "Закладки в окне документа MDI приложения" (Visual C++)
Вопрос № 119 ( Diza IX )

Hello, All !

Приветствую вас, программисты :) Есть ли кто в рассылке, кто работал с
графикой, или пишет графические приложения ?

Дайте совет plz по следующим вопросам.

- Какие есть бесплатные библиотеки для работы с файлами форматов:
gif, jpeg, png, tiff (если знаете библиотеки для работы с другими
форматами, то тоже буду рад ссылкам !). Надо уметь читать и записывать
файлы разных граф. форматов. Основная трудность - как читать сжатые
форматы, типа jpeg, а потом их записывать, выбирая еще степень сжатия.

- Поделитесь пожалуйста ссылками на документацию/мануалы/книги по работе
с БОЛЬШИМИ изображениями. Если знаете хорошие бумажные книжки по работе с
графикой, то тоже - напишите, название (можно с ISBN).
В первую очередь хочется получить информацию по работе с большими растрами.
Например, сделать качественный растровый редактор только средствами винды,
наверно не получится (тот же фотошоп по слухам имеет свой менеджер
памяти. Наверняка как то кеширует отображаемую картинку при разных
масштабах просмотра, и.т.д. Хотелось бы побольше узнать об алгоритмах
обработки растровых изображений.

- Интересуют также любые исходники на перечисленные выше темы.
Может, кто подкинет пару ссылочек на спец. ресурсы, посвященные данной
тематике ? Есть ли русскоязычные хорошие ресурсы ?

Ответ ( 3V )

Про библиотеки.
Для JPEG есть LibJPEG (вроде, свободно распространяемая).
Для PNG - LibPNG (кажется, так называется).
Один из простых способов работать с граф. файлами в винде - интерфейс IPicture (правда, там степень сжатия не выберешь). Насчет использования этого интерфейса посмотри, например, здесь: Загрузка изображений форматов GIF, Jpeg, EMF. Интерфейс IPicture.

Про книжки.
Не знаю, как там с большими битмапами. Я читал одну толковую книжку по графике в винде. Называется "Программирование графики под Windows". Автор - Фень Юань. Книжка понравилась. Правда, там есть некоторые не совсем корректные моменты, но в общем, очень даже ничего. Много рассказано про внутреннее устройство GDI. Про растры тоже достаточно написано. Есть примеры преобразований растров (повороты, применение фильтров, и.т.д.) - все делается через DIB-секции.

Про инет ресурсы.
Лучший ресурс, конечно, google. Только надо хорошо представлять себе чего ты хочешь :)
Наверняка, что то можно найти на codeguru.com и codeproject.com.
Анонсы книг по C/C++
Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP, Windows 2000.
Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP, Windows 2000.

Автор: М. Руссинович, Д. Соломон

Книга посвящена внутреннему устройству и алгоритмам работы основных компонентов операционной системы Microsoft Windows - Windows Server 2003, Windows XP и Windows 2000 - и файловой системы NTFS.

Детально рассмотрены системные механизмы: диспетчеризация ловушек и прерываний, DPC, АРС, LPC, RPC, синхронизация, системные рабочие потоки, глобальные флаги и др. Также описываются все этапы загрузки операционной системы и завершения ее работы. В четвертом издании книги больше внимания уделяется глубокому анализу и устранению проблем, из-за которых происходит крах операционной системы или из-за которых ее не удается загрузить. Кроме того, рассматриваются детали реализации поддержки аппаратных платформ AMD х64 и Intel IA64.

Книга состоит из 14 глав, словаря терминов и предметного указателя.
Книга предназначена системным администраторам, разработчикам серьезных приложений и всем, кто хочет понять, как устроена операционная система Windows.

Названия всех команд, диалоговых окон и других интерфейсных элементов операционной системы приведены как на английском языке, так и на русском.

Страница книги на Озоне
Недокументированные возможности Windows 2000 (+CD-ROM)
Недокументированные возможности Windows 2000 (+CD-ROM)

Автор: Свен Шрайбер

Данная книга предназначена для системных программистов, желающих максимально эффективно использовать возможности операционной системы, для которой они разрабатывают программное обеспечение.

В книге содержится огромный объем информации, к которой можно применить атрибут 'не документировано', кроме того, многие сведения ранее нигде не публиковались.

Страница книги на Озоне
Рассылки и дискуссионные листы компьютерной тематики
Рассылки
Программирование на JavaScript

Все аспекты программирования на JavaScript - нестандартные приемы, ОРИГИНАЛЬНЫЕ скрипты, авторские статьи и наработки. "JavaScript solutions" - в каждом выпуске готовый к применению ИНТЕРЕСНЫЙ скрипт (исходный код с комментариями).

Дискуссионные листы
Программирование. Форум !!!

Самый популярный дискуссионный лист по программированию на subscribe.ru, существующий с момента открытия сервиса дискуссионных листов !

Задайте здесь любой вопрос по программированию - и Вы получите ответ. Участвуйте в оживленных дискуссиях, обсуждайте интересные темы. Давайте ответы сами. Ведь это форум !!! Здесь просто интересно ! Присоединяйтесь !

Вебстроительство. Форум !!!

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

Поисковые системы. Форум !!!

Этот дискуссионный лист посвящен обсуждению поиковых систем, методов индексации сайтов поисковиками, способам оптимизации сайта под поисковые системы.

Хостинг. Обзоры и обсуждения платного и бесплатного хостинга.

Вы ищете хостинг (платный, бесплатный) ? Хотите спросить совета в выборе ? Можете обсудить это здесь. Поделитесь советом, если знаете. Или узнайте больше. Все о хостинге.


Всего доброго. До встречи в следующем номере.

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cppqa
Архив рассылки
Отписаться Вебом Почтой
Вспомнить пароль

В избранное