вторник, 15 января 2013 г.

Изменение параметров сетевых интерфейсов через WinApi

Всё началось с простого вопроса: как через WinApi в Delphi работать с сетевыми адаптерами, например включить или отключить сетевой интерфейс, узнать или изменить IP-адрес, проверить наличие Wi-Fi и т.д.? Быстрый гуглинг вывел на данный раздел MSDN: IP Helper
Пока разбирался, написал несколько простейший примеров использования основных функций, которые в данной статье и представлены.

понедельник, 14 января 2013 г.

Управление службами через командную строку (консоль) Windows

Для работы со службами в Windows, существует утилита командной строки sc, также для управления можно использовать утилиту net. В данной стать я не буду пытаться описать все их параметры. Цель статьи - показать как со службами производить основные действия: установка, удаление, запуск, остановка.

KickNetwork: "пинаем" глючный сетевой адаптер

Появился у меня глючный китайский PCI WiFi адаптер TP-LINK 150Mbps Wireless N Adapter (PCI\VEN_168C&DEV_002D). Не то чтобы совсем глючный, с большего он работает вполне себе хорошо, но совершенно не любит p2p соединения: так и норовит перестать видеть роутер при запущенном uTorrent'e. Другими словами, мой WiFi-адаптер, то и дело пишет "соединение ограничено", хотя на других устройствах WiFi работает замечательно и роутер ни при чём. Уж не знаю почему так происходит, вот только перестановка дров ничего не дала. Однако, было замечено, что достаточно переподключиться к беспроводной сети и проблема на время исчезает. Но есть загвоздка: т.к. соединение не рвётся, выключать и включать соединение надо вручную. Чтож, займёмся нашим любимым делом, проектированием "костылей".

Функция выполнения консольной команды в Delphi (в том числе в 2009, 2010, XE)

function ExecAndWait(const FileName, Params: ShortString; const WinState: Word): boolean; export;
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: ShortString;
begin
  CmdLine :=Filename+ Params;
  FillChar(StartInfo, SizeOf(StartInfo), #0);
  with StartInfo do
  begin
    cb := SizeOf(StartInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WinState;
  end;
  Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);
  if Result then
  begin
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    { Free the Handles }
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;
end;

Функция определения каталога Windows в Delphi

function GetWindowsDir: string;
var
p : PChar;
begin
GetMem(p, MAX_PATH);
result := '';
if GetWindowsDirectory(p, MAX_PATH) > 0 then
result := string(p);
FreeMem(p);
end;

Системные ошибки Windows. Их перехват в Delphi



В Delphi код  последней системной ошибки живет в GetLastError

Перечень системный ошибок Windows, с которыми мне довелось встретится:
123 - Ошибка соединения
267 - Неверное имя папки

воскресенье, 13 января 2013 г.

Включение и отключение сетевого адаптера (интерфейса) через консоль Windows


Включить (отключить) сетевой адаптер (интерфейс) в Windows через консоль можно используя системную утилиту netsh, выглядеть команда будет следующим образом:

netsh interface set interface name="Имя сетевого интерфейса" admin=enable //включение
netsh interface set interface name="Имя сетевого интерфейса" admin=disable //отключение
Просмотреть сетевые интерфейсы в системе можно командой:
netsh  interface show interface
Следует помнить, что в случае, если имя сетевого интерфейса имеет русские символы, то, при использовании команды из bat-файла, необходимо учесть возможные проблемы с кодировкой, рассмотренные в этой статье.
Так же, не забывайте, что в Windows 7, данную команду надо выполнять от имени администратора.
Подробнее об утилите netsh можно почитать в Википедии

Ошибка XCOPY "Недопустимы путь". Использование русских символов в комманде XCOPY.

Команда виндовой консоли (cmd)  XCOPY гораздо лучше своего досовского собрата COPY тем, что позволяет копировать всё содержимое папки с подпапками, что не заменимо при написании bat-файлов для задач резервного копирования. И, если описание этой команды найти не сложно (например, тут), то описание ошибок практически невозможно.
Обычно после написания первого скрипта мы получаем ошибку "Недопустимый путь".
Вызвана она может быть следующими причинами (в продолжении):

Нет звука BS.Player PRO

bsplayer no sound
Поставил себе Bsplayer, а точнее BS.Player Pro v2.63 Build 1071 Final. Но вот беда: не воспроизводит звук!
Чтож, попробуем обновить кодеки. У меня Win7 x64, так что попробуем shark007 codec pack.
Хм, внезапно всё заработало.

Windows XP. Не найден windows\system32\config\system


Вот так сегодня началось утро. Windows\system32\config\system это файл реестра. Да, винде без него никуда. Нижняя строчка предлагает восстановить систему с установочного диска винды, но мы этого делать не станем :) По опыту знаю, что в большинстве случаев подобные глюки вызваны ошибками файловой системы. Потому, грузим Mini Windows XP (windows PE) с любого live-cd (я, например, использовал Alkid, но рекомендую Hiren's Boot CD) и прогоняем checkdisk:
CHKDSK C:\ /F
 Вуаля, винда снова жива :)

P.S. После восстановления винды советую прогнать комп на вирусы и дать юзеру по башке, т.к. в 90% такие ошибки следствие неверного отключения ПК.
P.P.S. Да, если вирус удалил какой-нибудь системный файл, можно вместо переустановки попробовать скопировать их с работоспособной машины.

Windows 7. Флешка не отображается после форматирования Acronis Disk Director Suite 10.0

И черт меня дернул отформатировать свою флешку этой кривой софтиной под названием Acronis Disk Director Suite 10.0. После форматирования мой flash drive из списка дисков пропал, а в диспетчере устройств можно было наблюдать следующую картину:

Мучился я долго, в итоге решение вышло неожиданным:

Железо. Запуск БП без материнки

Просто как напоминание :)
Чтобы запустить блок питания без материнки надо замкнуть на разъеме основного питания материнской платы зеленый контакт с любым соседним черным. Кусок скребки подойдет.
 Вот как-то так
К слову, ATX-ные БП включать без нагрузки не рекомендуется. 



Windows Installer. Ошибка 1610 и 25001.

Что делать, если если при установке программы выдается ошибка 1610 или при удалении ошибка 25001?
И то и то ошибки Установщика Виндовс (Windows Installer). Это связано с глючной конфигурацией установочных пакетов (.msi), как правило, проявляется если предыдущая установка (удаление) не была завершена успешно. Лечится слующим образом:

1) Лезем в реестр (Пуск - Выполнить - regedit)
2) Лезем в ветку HKEY_LOCAL_MACHINE \ Software \ Classes \ Products
3) В нем находятся папки, названия из которых состоят из набора символов. Ищем ту, внутри которой параметр ProductName имеет название программы-пациента и удаляем всю папку
4) Если нужной папки не нашлось (либо удаление должного эффекта не достигло) удаляем все из HKEY_LOCAL_MACHINE \ Software \ Classes \ Features и удаляем все из папки C:\Windows\Intaller

Лечим ошибку 1610 и ошибку 25001

Android. Набор софта для Nook Simple Touch


У меня радость, обзавелся отличной читалкой Barnes & Noble Nook Simple Touch with GlowLight.

6 дюймов счастья
На мой взгляд, лучшая читалка 2012 года. Чтобы не плодить тысячный обзор, кому интересно, прочтет о ней тут.
Дело в том, что на борту этой читалки живет Android 2.1. А значит, мы можем получить root права и значительно расширить ее функционал с помощью сторонних приложений!

Внимание! Процесс получения root-прав не описывается в этой статье. Здесь представлен только список программ, игр и утилит, протестированных на Nook Simple Touch! 
Как получить root-права написано здесь

Delphi 2010. Метод Get компонента idFtp работает не правильно?

 
На днях понадобилось написать небольшую программку. Программа проста как валенок: скачать файл с фтп, откорректировать его должным образом, залить на другой фтп. В целях экономии времени выбор языка пал на Делфи, ведь там есть удобный компонент работы сidFtp! 
Подумано - сделано, быстро вояю программку и довольный смотрю на результат: он же, мягко говоря, сильно отличается от ожидаемого... Т.е. на выходе файл совсем не такой как должен быть. Ну, что поделать, начинаю усердно отлаживать код редактирования скаченного файла...
По прошествии нескольких часов я потерял веру в жизнь и законы физики: в коде все абсолютно верно! Значит, ошибка кроется в другом. В чем же?Обращаю свой взор на скачанный файл... Ах тыж екарный через плечо бабай, в рот мне ноги, WTF?!! Размер скачанных файлов с фтп отличается от оригинального! И ладно бы они были меньше, так ведь они больше!! Не веря свои глазам скачиваю файлы вручную и прогоняю на них свой код. Все работает как часы!
Ну... что поделать? Завариваем крепкий чай и вперед!