Показаны сообщения с ярлыком Delphi. Показать все сообщения
Показаны сообщения с ярлыком Delphi. Показать все сообщения

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

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

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

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

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 г.

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

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