Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Двадцатка самых популярных вопросов.   Найти похожие ветки 

 
Тимохов ©   (2004-03-29 17:09) [160]


> Игорь Шевченко ©   (29.03.04 17:01) [158]

как точно человек все определил...


 
Тимохов ©   (2004-03-29 17:09) [160]


> Игорь Шевченко ©   (29.03.04 17:01) [158]

как точно человек все определил...


 
panov ©   (2004-03-29 17:14) [161]

Удалено модератором


 
panov ©   (2004-03-29 17:14) [161]

Удалено модератором


 
panov ©   (2004-03-29 17:16) [162]

6 вопрос.

Как запустить другую программу и дождаться ее окончания.

Пример:


unit ufCreateProcess;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

//Функция для создания нового процесса
//Параметры:
// aCommand:  Строка для выполнения исполняемого файла(полный путь)
// aShow:     Показывать/не показывать окно нового процесса
// aWaitExit: Ожидать/не ожидать завершения процесса
function ExecCmd(const aCommand: String;const aShow, aWaitExit: Boolean): Boolean;
var
 pi:PROCESS_INFORMATION;
 si:STARTUPINFO;
 cmdLine,Path: String;
begin
 Result := False;
 ZeroMemory(@si,sizeof(si));
 si.cb:=SizeOf(si);
 si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
 if aShow then si.wShowWindow := SW_SHOWNORMAL else si.wShowWindow := SW_HIDE;
 Path := ExtractFilePath(aCommand);
 cmdLine := aCommand;

 Result :=
        CreateProcess( nil,             // No module name (use command line).
                       PChar(cmdLine),  // Command line.
                       nil,             // Process handle not inheritable.
                       nil,             // Thread handle not inheritable.
                       False,           // Set handle inheritance to FALSE.
                       0,               // No creation flags.
                       nil,             // Use parent"s environment block.
                       PChar(Path),     // Use parent"s starting directory.
                       si,              // Pointer to STARTUPINFO structure.
                       pi );             // Pointer to PROCESS_INFORMATION structure.
 if Result then
 begin
   if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );
   CloseHandle(pi.hThread);
   CloseHandle(pi.hProcess);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ExecCmd(ExtractFilePath(ParamStr(0))+"pkzip test.zip",True,False);
end;

end.


 
panov ©   (2004-03-29 17:16) [162]

6 вопрос.

Как запустить другую программу и дождаться ее окончания.

Пример:


unit ufCreateProcess;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

//Функция для создания нового процесса
//Параметры:
// aCommand:  Строка для выполнения исполняемого файла(полный путь)
// aShow:     Показывать/не показывать окно нового процесса
// aWaitExit: Ожидать/не ожидать завершения процесса
function ExecCmd(const aCommand: String;const aShow, aWaitExit: Boolean): Boolean;
var
 pi:PROCESS_INFORMATION;
 si:STARTUPINFO;
 cmdLine,Path: String;
begin
 Result := False;
 ZeroMemory(@si,sizeof(si));
 si.cb:=SizeOf(si);
 si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
 if aShow then si.wShowWindow := SW_SHOWNORMAL else si.wShowWindow := SW_HIDE;
 Path := ExtractFilePath(aCommand);
 cmdLine := aCommand;

 Result :=
        CreateProcess( nil,             // No module name (use command line).
                       PChar(cmdLine),  // Command line.
                       nil,             // Process handle not inheritable.
                       nil,             // Thread handle not inheritable.
                       False,           // Set handle inheritance to FALSE.
                       0,               // No creation flags.
                       nil,             // Use parent"s environment block.
                       PChar(Path),     // Use parent"s starting directory.
                       si,              // Pointer to STARTUPINFO structure.
                       pi );             // Pointer to PROCESS_INFORMATION structure.
 if Result then
 begin
   if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );
   CloseHandle(pi.hThread);
   CloseHandle(pi.hProcess);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ExecCmd(ExtractFilePath(ParamStr(0))+"pkzip test.zip",True,False);
end;

end.


 
stone ©   (2004-03-29 17:19) [163]


> panov ©  

ExtractFileDir

ЗЫ. еще pkzip не работает с длинными именами


 
stone ©   (2004-03-29 17:19) [163]


> panov ©  

ExtractFileDir

ЗЫ. еще pkzip не работает с длинными именами


 
stone ©   (2004-03-29 17:23) [164]

сорри не доглядел


 
stone ©   (2004-03-29 17:23) [164]

сорри не доглядел


 
zamkom ©   (2004-03-29 17:30) [165]

Игорь Шевченко ©   (29.03.04 16:37) [153]
Прошу прощения, но если использовать
OemToChar(PChar(S),PChar(S))
не в функции как указано вами а при обработке т.е.
вот так
S:="текст";
OemToChar(PChar(S),PChar(S));

То при выполнении этого кода возникает ошибка.
Предлагаю использовать вот такой код
CharToOem(@Result[1],@Result[1]);
В этом случае даже если писать так
S:="текст";
CharToOem(@S[1],@S[1]);
то никакой ошибки не выскочит и текст благополучно сконвертится.


 
zamkom ©   (2004-03-29 17:30) [165]

Игорь Шевченко ©   (29.03.04 16:37) [153]
Прошу прощения, но если использовать
OemToChar(PChar(S),PChar(S))
не в функции как указано вами а при обработке т.е.
вот так
S:="текст";
OemToChar(PChar(S),PChar(S));

То при выполнении этого кода возникает ошибка.
Предлагаю использовать вот такой код
CharToOem(@Result[1],@Result[1]);
В этом случае даже если писать так
S:="текст";
CharToOem(@S[1],@S[1]);
то никакой ошибки не выскочит и текст благополучно сконвертится.


 
Игорь Шевченко ©   (2004-03-29 17:41) [166]

zamkom ©   (29.03.04 17:30)

Как объявлена переменная S ? и как установлена опция компилятора $H ?


 
Игорь Шевченко ©   (2004-03-29 17:41) [166]

zamkom ©   (29.03.04 17:30)

Как объявлена переменная S ? и как установлена опция компилятора $H ?


 
Юрий Зотов ©   (2004-03-29 17:53) [167]

CloseHandle(pi.hThread) лучше вызывать ДО WaitForSingleObject, чтобы сразу освободить ненужный системный ресурс.


 
Юрий Зотов ©   (2004-03-29 17:53) [167]

CloseHandle(pi.hThread) лучше вызывать ДО WaitForSingleObject, чтобы сразу освободить ненужный системный ресурс.


 
zamkom ©   (2004-03-29 17:53) [168]

Игорь Шевченко ©   (29.03.04 17:41) [166]
var
S : String;

а насчет компилятора $H так ниче не трогал и не изменял как по умолчанию там все стоит так и не трогал.


 
zamkom ©   (2004-03-29 17:53) [168]

Игорь Шевченко ©   (29.03.04 17:41) [166]
var
S : String;

а насчет компилятора $H так ниче не трогал и не изменял как по умолчанию там все стоит так и не трогал.


 
panov ©   (2004-03-29 17:54) [169]

>Юрий Зотов ©   (29.03.04 17:53) [167]
CloseHandle(pi.hThread) лучше вызывать ДО WaitForSingleObject, чтобы сразу освободить ненужный системный ресурс.

Не помню, в каком случае, но у меня возникала ошибка, если в таком порядке были написаны операторы(CloseHandle(pi.hThread) до Wait)


 
panov ©   (2004-03-29 17:54) [169]

>Юрий Зотов ©   (29.03.04 17:53) [167]
CloseHandle(pi.hThread) лучше вызывать ДО WaitForSingleObject, чтобы сразу освободить ненужный системный ресурс.

Не помню, в каком случае, но у меня возникала ошибка, если в таком порядке были написаны операторы(CloseHandle(pi.hThread) до Wait)


 
Verg ©   (2004-03-29 17:55) [170]


> zamkom ©   (29.03.04 17:30) [165]


> не в функции как указано вами а при обработке т.е.


Ну так, на то там и фунция.

S:="текст";
S:= Win2Dos(S);

Вот и не будет никаких ошибок.

Просто @S[1] и pchar(S) - это две болших разницы.


 
Verg ©   (2004-03-29 17:55) [170]


> zamkom ©   (29.03.04 17:30) [165]


> не в функции как указано вами а при обработке т.е.


Ну так, на то там и фунция.

S:="текст";
S:= Win2Dos(S);

Вот и не будет никаких ошибок.

Просто @S[1] и pchar(S) - это две болших разницы.


 
Юрий Зотов ©   (2004-03-29 17:59) [171]

> panov ©   (29.03.04 17:54) [169]

> Не помню, в каком случае, но у меня возникала ошибка, если в
> таком порядке были написаны операторы CloseHandle(pi.hThread)
> до Wait

Тут и помнить не надо - при любой попытке использовать pi.hThread после CloseHandle(pi.hThread) будет ошибка. Если такой попытки нет - ошибки не будет.


 
Юрий Зотов ©   (2004-03-29 17:59) [171]

> panov ©   (29.03.04 17:54) [169]

> Не помню, в каком случае, но у меня возникала ошибка, если в
> таком порядке были написаны операторы CloseHandle(pi.hThread)
> до Wait

Тут и помнить не надо - при любой попытке использовать pi.hThread после CloseHandle(pi.hThread) будет ошибка. Если такой попытки нет - ошибки не будет.


 
panov ©   (2004-03-29 18:11) [172]

>Юрий Зотов ©   (29.03.04 17:59) [171]
Ну не думаю, что здесь порядок имеет существенное значение в любом случае-)


 
panov ©   (2004-03-29 18:11) [172]

>Юрий Зотов ©   (29.03.04 17:59) [171]
Ну не думаю, что здесь порядок имеет существенное значение в любом случае-)


 
Игорь Шевченко ©   (2004-03-29 18:13) [173]

zamkom ©   (29.03.04 17:53)

Все правильно, возникает ошибка. Потому что в этом случае константа находится в сегменте кода и по месту ее преобразовывать нельзя. Нужно функцию использовать.
Почему срабатывает @S[1] - потому что в этом случае компилятор делает копию строки. Но для функции в FAQ это не требуется.


 
Игорь Шевченко ©   (2004-03-29 18:13) [173]

zamkom ©   (29.03.04 17:53)

Все правильно, возникает ошибка. Потому что в этом случае константа находится в сегменте кода и по месту ее преобразовывать нельзя. Нужно функцию использовать.
Почему срабатывает @S[1] - потому что в этом случае компилятор делает копию строки. Но для функции в FAQ это не требуется.


 
Юрий Зотов ©   (2004-03-29 18:20) [174]

> panov ©   (29.03.04 18:11) [172]

IMHO, для ПРИМЕРА как раз имеет. Потому что именно ПРИМЕР должен показывать ГРАМОТНОЕ решение. Мы все помним пресловутый пример с "Synhronize аж во весь Execute" - а ведь тоже вполне правильный пример.


 
Юрий Зотов ©   (2004-03-29 18:20) [174]

> panov ©   (29.03.04 18:11) [172]

IMHO, для ПРИМЕРА как раз имеет. Потому что именно ПРИМЕР должен показывать ГРАМОТНОЕ решение. Мы все помним пресловутый пример с "Synhronize аж во весь Execute" - а ведь тоже вполне правильный пример.


 
panov ©   (2004-03-29 18:41) [175]

>Юрий Зотов ©   (29.03.04 18:20) [174]

Согласен, что это так-)
Так и сделаю, но теперь уже не вспомнить, почему же я стал сам так делать. ПРограмма работала именно так, и никак иначе-)


 
panov ©   (2004-03-29 18:41) [175]

>Юрий Зотов ©   (29.03.04 18:20) [174]

Согласен, что это так-)
Так и сделаю, но теперь уже не вспомнить, почему же я стал сам так делать. ПРограмма работала именно так, и никак иначе-)


 
N169   (2004-03-29 18:57) [176]

+ кстати, "вечным" вопросам (иконка в трее, перехват ctrl-alt-del) можно было бы сопоставлять специальный значок-картинку, которая была бы ссылкой на соотв. раздел FAQ или список связанных тем (в архиве). Очень удобно.


 
N169   (2004-03-29 18:57) [176]

+ кстати, "вечным" вопросам (иконка в трее, перехват ctrl-alt-del) можно было бы сопоставлять специальный значок-картинку, которая была бы ссылкой на соотв. раздел FAQ или список связанных тем (в архиве). Очень удобно.


 
panov ©   (2004-03-29 19:19) [177]

>stone ©   (29.03.04 17:19) [163]

ExtractFileDir

Если эту функцию использовать, то в конец нужно добавлять вручную еще "\".


 
panov ©   (2004-03-29 19:19) [177]

>stone ©   (29.03.04 17:19) [163]

ExtractFileDir

Если эту функцию использовать, то в конец нужно добавлять вручную еще "\".


 
Piter ©   (2004-03-29 19:35) [178]

panov (29.03.04 18:41) [175]

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


 
Piter ©   (2004-03-29 19:35) [178]

panov (29.03.04 18:41) [175]

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


 
panov ©   (2004-03-29 20:23) [179]

Пока обрабатывается такой список вопросов:
Как поместить иконку приложения в System Tray
Как спрятать (свернуть) приложение при нажатии на кнопку «закрыть» в области заголовка формы или при нажатии Alt-F4
Как получить список файлов в каталоге и его подкаталогах
Как перекодировать строку из кодировки OEM в ANSI и обратно.
Как выполнить длительную(по времени) процедуру в дополнительном потоке и одновременно обновлять TProgressBar в основном потоке.
Как запустить другую программу и дождаться ее окончания.
Как запустить процесс от имени другого пользователя
Почему во время выполнения дополнительного потока не обновляются объекты на основной форме (Synchronize аж во весь Execute)
Как создать таймер средствами Win32Api
Как получить список процессов
Как преобразовать тип String к Pchar и обратно
Как уменьшить размер программы
Динамическое создание объектов, включая создание массива объектов и назначения единой процедуры обработки
Почему при динамическом создании объект остается невидимым.
Как найти компонент по имени.
Как послать сообщение окну.
Как эмулировать нажатие клавиши или кнопки мыши.
Как прочитать заголовок или Edit из чужого окна
Как передать строку (длинные данные) из одной программы в другую
Как закрыть чужое приложение из моего
Как узнать время работы Windows после последней загрузки системы
Как перехватить Ctrl+Alt+Del
Как скрыть программу от Ctrl+Alt+Del
Как не дать снять мою программу из Task Manager
Как передать String из EXE в DLL и обратно
Почему текст не загружается целиком в TMemo(символ #0 в середине текста)
Глобальные хуки (стандартная ошибка - неглобальные переменные)
Как избавиться от Scrollbars в MDIForm

Как перенести/установить/настроить алиасы BDE на другой компьютер
Как нормализовать вид ScrollBar (90% ответ - Fetchall :)).
Вопрос про точное хранение денежных сумм и т.п..
Как в выпадающий список DBComboBox вывести все значения поля из таблицы?
Как вставить TCheckBox в поле DBGrid ?
Как раскрасить отдельные строки в TDBGgrid

Определение IP по DNS-имени хоста и наоборот
Где взять proxies.pas
Куда делись TClientSocket/TServerSocket из Delphi7 и где их взять
Как узнать локальный МАС (IP) локального и удаленного компьютера
Как отправить файл по сети на другой компьютер
Как разговаривать по сети
Как отправить письмо с вложением
Как установить - разорвать соединение DialUp
Как запретить доступ к моему компу, но чтоб остались общие ресурсы
Как получить доступ к общим ресурсам удаленного компьютера, зная пароль
Как самому написать Sniffer
Как самому написать Proxy
Как самому написать FireWall
Как получить в локальной сети список:
- имен пользователей
- ресурсов
- доменов
- рабочих групп,
Как работать с низкоуровневыми сокетами WinSock

Как уменьшить мерцание на TImage?
Как сграбить экран?
Как распечатать рисунок?
Как отобразить рисунок очень больших размеров?
Как создать AVI из последовательности BMP?
Как преобразовать JPEG<->BMP
Как преобразовать ... в MP3?
Как создать (полу)прозрачную форму?

Как записать байт в порт (LPT,COM,USB,TCP/IP) и поймать его обратно со второй ножки.
Как русифицировать кнопки на стандартном окне MessageDlg

Как в Word:
- открыть документ
- напечатать документ
- работать с таблицами

http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1077992645&n=0
Диалог  выбора папки:
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078389217&n=0
Хинт :
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078223087&n=0
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078646471&n=1


 
panov ©   (2004-03-29 20:23) [179]

Пока обрабатывается такой список вопросов:
Как поместить иконку приложения в System Tray
Как спрятать (свернуть) приложение при нажатии на кнопку «закрыть» в области заголовка формы или при нажатии Alt-F4
Как получить список файлов в каталоге и его подкаталогах
Как перекодировать строку из кодировки OEM в ANSI и обратно.
Как выполнить длительную(по времени) процедуру в дополнительном потоке и одновременно обновлять TProgressBar в основном потоке.
Как запустить другую программу и дождаться ее окончания.
Как запустить процесс от имени другого пользователя
Почему во время выполнения дополнительного потока не обновляются объекты на основной форме (Synchronize аж во весь Execute)
Как создать таймер средствами Win32Api
Как получить список процессов
Как преобразовать тип String к Pchar и обратно
Как уменьшить размер программы
Динамическое создание объектов, включая создание массива объектов и назначения единой процедуры обработки
Почему при динамическом создании объект остается невидимым.
Как найти компонент по имени.
Как послать сообщение окну.
Как эмулировать нажатие клавиши или кнопки мыши.
Как прочитать заголовок или Edit из чужого окна
Как передать строку (длинные данные) из одной программы в другую
Как закрыть чужое приложение из моего
Как узнать время работы Windows после последней загрузки системы
Как перехватить Ctrl+Alt+Del
Как скрыть программу от Ctrl+Alt+Del
Как не дать снять мою программу из Task Manager
Как передать String из EXE в DLL и обратно
Почему текст не загружается целиком в TMemo(символ #0 в середине текста)
Глобальные хуки (стандартная ошибка - неглобальные переменные)
Как избавиться от Scrollbars в MDIForm

Как перенести/установить/настроить алиасы BDE на другой компьютер
Как нормализовать вид ScrollBar (90% ответ - Fetchall :)).
Вопрос про точное хранение денежных сумм и т.п..
Как в выпадающий список DBComboBox вывести все значения поля из таблицы?
Как вставить TCheckBox в поле DBGrid ?
Как раскрасить отдельные строки в TDBGgrid

Определение IP по DNS-имени хоста и наоборот
Где взять proxies.pas
Куда делись TClientSocket/TServerSocket из Delphi7 и где их взять
Как узнать локальный МАС (IP) локального и удаленного компьютера
Как отправить файл по сети на другой компьютер
Как разговаривать по сети
Как отправить письмо с вложением
Как установить - разорвать соединение DialUp
Как запретить доступ к моему компу, но чтоб остались общие ресурсы
Как получить доступ к общим ресурсам удаленного компьютера, зная пароль
Как самому написать Sniffer
Как самому написать Proxy
Как самому написать FireWall
Как получить в локальной сети список:
- имен пользователей
- ресурсов
- доменов
- рабочих групп,
Как работать с низкоуровневыми сокетами WinSock

Как уменьшить мерцание на TImage?
Как сграбить экран?
Как распечатать рисунок?
Как отобразить рисунок очень больших размеров?
Как создать AVI из последовательности BMP?
Как преобразовать JPEG<->BMP
Как преобразовать ... в MP3?
Как создать (полу)прозрачную форму?

Как записать байт в порт (LPT,COM,USB,TCP/IP) и поймать его обратно со второй ножки.
Как русифицировать кнопки на стандартном окне MessageDlg

Как в Word:
- открыть документ
- напечатать документ
- работать с таблицами

http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1077992645&n=0
Диалог  выбора папки:
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078389217&n=0
Хинт :
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078223087&n=0
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078646471&n=1


 
Piter ©   (2004-03-29 21:31) [180]

panov (29.03.04 17:16) [162]
ZeroMemory(@si,sizeof(si));


а нафига?

извините, что убегаю немного:
Как получить список процессов
вопрос N10

Будем пользоваться функцией CreateToolhelp32Snapshot, она реализована как в NT системах, так и в 9x. В NT она использует пресловутую NtQuerySystemInformation, которая недокументированна.
Заголовок CreateToolhelp32Snapshot и остальные типы описаны в модуле TlHelp32.
CreateToolhelp32Snapshot может делать снимок процессов и куч, модулей, потоков, используемых процессом. Она заносит требуемые данные в некоторую структуру (снимок) и возвращает ее описатель. После использования нужно закрыть описатель.
Работать со снимком можно с помощью функций Process32First, Process32Next, Thread32First , Thread32Next и так далее (описаны в Win32 SDK в разделе "Tool Help Functions"). Эти функции заносят информацию о конкретном процессе, потоке и т.д. из снимка в структуры типа TProcessEntry32, TThreadEntry32.
Итак, будем получать список процессов и заносить их названия в ListBox1, который лежит у нас на форме:

procedure TForm1.Button1Click(Sender: TObject);
var HSnapShot: THandle;
 pe: TProcessEntry32;
begin
listbox1.Clear; //очишаем наш ListBox1
HSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //нам нужен снимок процессов
pe.dwSize := sizeof(ProcessEntry32); //перед использованием TProcessEntry32 нужно заполнить поле dwSize
if Process32First(HSnapShot, pe) then // если первая запись о процессах получена - продолжаем
 repeat
   listbox1.Items.Add(pe.szExeFile); // добавляем в ListBox
 until ( not Process32Next(HSnapShot,pe) ); // получаем запись о следующем процессе, если не получаем - выходим из цикла
closehandle(HSnapShot); // закрываем описатель снимка
end;


 
Piter ©   (2004-03-29 21:31) [180]

panov (29.03.04 17:16) [162]
ZeroMemory(@si,sizeof(si));


а нафига?

извините, что убегаю немного:
Как получить список процессов
вопрос N10

Будем пользоваться функцией CreateToolhelp32Snapshot, она реализована как в NT системах, так и в 9x. В NT она использует пресловутую NtQuerySystemInformation, которая недокументированна.
Заголовок CreateToolhelp32Snapshot и остальные типы описаны в модуле TlHelp32.
CreateToolhelp32Snapshot может делать снимок процессов и куч, модулей, потоков, используемых процессом. Она заносит требуемые данные в некоторую структуру (снимок) и возвращает ее описатель. После использования нужно закрыть описатель.
Работать со снимком можно с помощью функций Process32First, Process32Next, Thread32First , Thread32Next и так далее (описаны в Win32 SDK в разделе "Tool Help Functions"). Эти функции заносят информацию о конкретном процессе, потоке и т.д. из снимка в структуры типа TProcessEntry32, TThreadEntry32.
Итак, будем получать список процессов и заносить их названия в ListBox1, который лежит у нас на форме:

procedure TForm1.Button1Click(Sender: TObject);
var HSnapShot: THandle;
 pe: TProcessEntry32;
begin
listbox1.Clear; //очишаем наш ListBox1
HSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //нам нужен снимок процессов
pe.dwSize := sizeof(ProcessEntry32); //перед использованием TProcessEntry32 нужно заполнить поле dwSize
if Process32First(HSnapShot, pe) then // если первая запись о процессах получена - продолжаем
 repeat
   listbox1.Items.Add(pe.szExeFile); // добавляем в ListBox
 until ( not Process32Next(HSnapShot,pe) ); // получаем запись о следующем процессе, если не получаем - выходим из цикла
closehandle(HSnapShot); // закрываем описатель снимка
end;


 
Игорь Шевченко ©   (2004-03-30 10:34) [181]

Piter ©   (29.03.04 21:31)


> Будем пользоваться функцией CreateToolhelp32Snapshot, она
> реализована как в NT системах, так и в 9x.


Кроме Windows NT.

"Requires Windows XP, Windows 2000 Professional, Windows Me, Windows 98, or Windows 95."


 
Игорь Шевченко ©   (2004-03-30 10:34) [181]

Piter ©   (29.03.04 21:31)


> Будем пользоваться функцией CreateToolhelp32Snapshot, она
> реализована как в NT системах, так и в 9x.


Кроме Windows NT.

"Requires Windows XP, Windows 2000 Professional, Windows Me, Windows 98, or Windows 95."


 
VMcL ©   (2004-03-30 16:02) [182]

2 [0]
Работа со значками на рабочем столе.

P.S. У меня есть небольшой простой пример:
http://igp.org.ua/vmcl/?id=view_article&aid=1
http://vvmcl.amillo.net/?id=view_article&aid=1 (зеркало)
Зацените, если будет время. С замечаниями прошу в ICQ или сюда.


 
VMcL ©   (2004-03-30 16:02) [182]

2 [0]
Работа со значками на рабочем столе.

P.S. У меня есть небольшой простой пример:
http://igp.org.ua/vmcl/?id=view_article&aid=1
http://vvmcl.amillo.net/?id=view_article&aid=1 (зеркало)
Зацените, если будет время. С замечаниями прошу в ICQ или сюда.


 
Юрий Зотов ©   (2004-03-30 16:33) [183]

> panov

Еще один супервопрос - как определить версию системы.

Готовый ответ здесь:
http://delphi84.valuehost.ru/cgi-bin/forum.pl?id=1077391423&n=2


 
Юрий Зотов ©   (2004-03-30 16:33) [183]

> panov

Еще один супервопрос - как определить версию системы.

Готовый ответ здесь:
http://delphi84.valuehost.ru/cgi-bin/forum.pl?id=1077391423&n=2


 
Rouse_ ©   (2004-03-30 16:51) [184]

Ребят, мы забыли еще одну вещь, я сейчас специально пересмотрел все вопросы - а где вопросы по базам? Там же их тоже куча должна быть?


 
Rouse_ ©   (2004-03-30 16:51) [184]

Ребят, мы забыли еще одну вещь, я сейчас специально пересмотрел все вопросы - а где вопросы по базам? Там же их тоже куча должна быть?


 
Romkin ©   (2004-03-30 16:55) [185]

Нету? Любимый вопрос всех времен и народов - как загрузить jpeg в BLOB и потом ея оттуда извлечь?

function GetStreamImgType(Stream: TStream): TClass;
var
 StreamPos: int64;
 ImgSign: string;
begin
 StreamPos := Stream.Position;
 try
   //BMP если не определено
   Result := Graphics.TBitmap;
   //JPEG
   SetLength(ImgSign, 4);
   Stream.Seek(6, soFromCurrent);
   Stream.Read(ImgSign[1],4);
   if (UpperCase(ImgSign) = "JFIF") or (UpperCase(ImgSign) = "EXIF") then
     Result := Jpeg.TJPEGImage;
   //WMF
   Stream.Position := StreamPos;
   SetLength(ImgSign, 4);
   Stream.Read(ImgSign[1],4);
   if ImgSign = #$D7#$CD#$C6#$9A then
     Result := Graphics.TMetafile;
 finally
   Stream.Position := StreamPos;
 end;
end;

procedure LoadProperImage(Stream: TStream; Picture: TPicture);
var
 Img: TGraphic;
 StreamPos: int64;
begin
 StreamPos := Stream.Position;
 Img := TGraphicClass(GetStreamImgType(Stream)).Create;
 try
   Stream.Position := StreamPos;
   Img.LoadFromStream(Stream);
   Picture.Graphic := Img;
 finally
   Img.Free;
 end;
end;

function LoadPictureFromBLOB(Picture: TPicture; Field: TBlobField): boolean;
var
 Stream: TStream;
begin
 Result := False;
 if not Field.isNULL then
 begin
   Stream := TMemoryStream.Create;
   try
     Field.SaveToStream(Stream);
     Stream.Position := 0;
     LoadProperImage(Stream, Picture);
     Result := True;
   finally
     Stream.Free;
   end;
 end;
end;

procedure SavePictureToBlob(Picture: TPicture; Field: TBlobField);
var
 Stream: TStream;
begin
 if not (Field.DataSet.State in [dsEdit, dsInsert]) then
   Field.DataSet.Edit;
 Field.Clear;
 if Assigned(Picture.Graphic) then
   if not Picture.Graphic.Empty then
     begin
       Stream := TMemoryStream.Create;
       try
         Picture.Graphic.SaveToStream(Stream);
         Stream.Position := 0;
         Field.LoadFromStream(Stream);
       finally
         Stream.Free;
       end;
     end;
end;


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


 
Romkin ©   (2004-03-30 16:55) [185]

Нету? Любимый вопрос всех времен и народов - как загрузить jpeg в BLOB и потом ея оттуда извлечь?

function GetStreamImgType(Stream: TStream): TClass;
var
 StreamPos: int64;
 ImgSign: string;
begin
 StreamPos := Stream.Position;
 try
   //BMP если не определено
   Result := Graphics.TBitmap;
   //JPEG
   SetLength(ImgSign, 4);
   Stream.Seek(6, soFromCurrent);
   Stream.Read(ImgSign[1],4);
   if (UpperCase(ImgSign) = "JFIF") or (UpperCase(ImgSign) = "EXIF") then
     Result := Jpeg.TJPEGImage;
   //WMF
   Stream.Position := StreamPos;
   SetLength(ImgSign, 4);
   Stream.Read(ImgSign[1],4);
   if ImgSign = #$D7#$CD#$C6#$9A then
     Result := Graphics.TMetafile;
 finally
   Stream.Position := StreamPos;
 end;
end;

procedure LoadProperImage(Stream: TStream; Picture: TPicture);
var
 Img: TGraphic;
 StreamPos: int64;
begin
 StreamPos := Stream.Position;
 Img := TGraphicClass(GetStreamImgType(Stream)).Create;
 try
   Stream.Position := StreamPos;
   Img.LoadFromStream(Stream);
   Picture.Graphic := Img;
 finally
   Img.Free;
 end;
end;

function LoadPictureFromBLOB(Picture: TPicture; Field: TBlobField): boolean;
var
 Stream: TStream;
begin
 Result := False;
 if not Field.isNULL then
 begin
   Stream := TMemoryStream.Create;
   try
     Field.SaveToStream(Stream);
     Stream.Position := 0;
     LoadProperImage(Stream, Picture);
     Result := True;
   finally
     Stream.Free;
   end;
 end;
end;

procedure SavePictureToBlob(Picture: TPicture; Field: TBlobField);
var
 Stream: TStream;
begin
 if not (Field.DataSet.State in [dsEdit, dsInsert]) then
   Field.DataSet.Edit;
 Field.Clear;
 if Assigned(Picture.Graphic) then
   if not Picture.Graphic.Empty then
     begin
       Stream := TMemoryStream.Create;
       try
         Picture.Graphic.SaveToStream(Stream);
         Stream.Position := 0;
         Field.LoadFromStream(Stream);
       finally
         Stream.Free;
       end;
     end;
end;


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


 
Rouse_ ©   (2004-03-30 16:55) [186]

С постановкой некоторых из вопросов я немного не согласен, но ответы привел:

Вопрос:
Как определить имя DNS-хоста (компьютера) по IP?
Ответ:
Для этого воспользуемся функцией gethostbyaddr
Пример:
uses ..., WinSock;

function GetNameFromIP(const IP: String): String;
const  
 ERR_INADDR    = "Can not convert IP to in_addr.";
 ERR_HOST      = "Can not get host information.";
 RES_UNKNOWN   = "Unknown";
 ERR_WSA       = "Can not initialize WSA.";
 WSA_TYPE      = $101; //$202;
var
 WSA   : TWSAData;
 Host  : PHostEnt;
 Addr  : Integer;
 Err   : Integer;
begin
 Result := RES_UNKNOWN;
 Err := WSAStartup(WSA_TYPE, WSA);
 if Err <> 0 then  
 begin            
   MessageDlg(ERR_WSA, mtError, [mbOK], 0);
   Exit;
 end;
 Addr := inet_addr(PChar(IP));
 if Addr = INADDR_NONE then
 begin
   MessageDlg(ERR_INADDR, mtError, [mbOK], 0);
   WSACleanup;
   Exit;
 end;                                  
 Host := gethostbyaddr(@Addr, SizeOf(Addr), PF_INET);
 if Assigned(Host) then
   Result := Host.h_name
 else
   MessageDlg(ERR_HOST, mtError, [mbOK], 0);
 WSACleanup;
end;

Пример вызова:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Caption := GetNameFromIP("192.168.24.1");
end;

==============================================================================
Вопрос:
Как получить IP по имени DNS-хоста (компьютера)?
Ответ:
Воспользуемся функцией GetHostByName
Пример:
uses ..., WinSock

function GetIPFromName(DNS: string): string;
const
 ERR_HOST      = "Can not get host information.";
 RES_UNKNOWN   = "Unknown";
 ERR_WSA       = "Can not initialize WSA.";
 WSA_TYPE      = $101; //$202;
var
 WSA   : TWSAData;
 Host  : PHostEnt;
 Err   : Integer;
begin
 Result := RES_UNKNOWN;
 Err := WSAStartup(WSA_TYPE, WSA);
 if Err <> 0 then
 begin            
   MessageDlg(ERR_WSA, mtError, [mbOK], 0);
   Exit;
 end;
 Host := GetHostByName(PChar(DNS));
 if Assigned(Host.h_addr_list) then  
   Result :=                        
     inet_ntoa(PInAddr(Host.h_addr_list^)^)
 else
   MessageDlg(ERR_HOST, mtError, [mbOK], 0);
 WSACleanup;
end;

Пример вызова:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Caption := GetIPFromName("Rouse");
end;

==============================================================================
Вопрос:
Где взять proxies.pas
Ответ:
Данный модуль необходим только для DesignTime. Его требует DesignEditors.
Суррогатный способ обойти данное препятствие заключается в его "урезаном" аналоге:

unit Proxies;

interface

function IsProxyClass(ComponentClass: TClass): Boolean;

implementation

function IsProxyClass(ComponentClass: TClass): Boolean;
begin
 Result := True;
end;

end.

А также существует правильный способ:
Просто реорганизуйте ваш проект на использование RunTime пакетов и добавьте "DesignIDE.dcp" к вашему списку RunTime пакетов. Proxies.pas находится именно здесь, и вам не нужен исходный текст вообще.  

Почему это сделано? Просто доля уверенности, что вы не сможете распространять Design Time части (Property Editors, Component Editors), это запрещено по лицензии. DesignIDE.bpl не является свободно распространяемым, вы имеете право использовать его только на машине на которой установлена Delphi, подобно Component Libraries.


 
Rouse_ ©   (2004-03-30 16:55) [186]

С постановкой некоторых из вопросов я немного не согласен, но ответы привел:

Вопрос:
Как определить имя DNS-хоста (компьютера) по IP?
Ответ:
Для этого воспользуемся функцией gethostbyaddr
Пример:
uses ..., WinSock;

function GetNameFromIP(const IP: String): String;
const  
 ERR_INADDR    = "Can not convert IP to in_addr.";
 ERR_HOST      = "Can not get host information.";
 RES_UNKNOWN   = "Unknown";
 ERR_WSA       = "Can not initialize WSA.";
 WSA_TYPE      = $101; //$202;
var
 WSA   : TWSAData;
 Host  : PHostEnt;
 Addr  : Integer;
 Err   : Integer;
begin
 Result := RES_UNKNOWN;
 Err := WSAStartup(WSA_TYPE, WSA);
 if Err <> 0 then  
 begin            
   MessageDlg(ERR_WSA, mtError, [mbOK], 0);
   Exit;
 end;
 Addr := inet_addr(PChar(IP));
 if Addr = INADDR_NONE then
 begin
   MessageDlg(ERR_INADDR, mtError, [mbOK], 0);
   WSACleanup;
   Exit;
 end;                                  
 Host := gethostbyaddr(@Addr, SizeOf(Addr), PF_INET);
 if Assigned(Host) then
   Result := Host.h_name
 else
   MessageDlg(ERR_HOST, mtError, [mbOK], 0);
 WSACleanup;
end;

Пример вызова:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Caption := GetNameFromIP("192.168.24.1");
end;

==============================================================================
Вопрос:
Как получить IP по имени DNS-хоста (компьютера)?
Ответ:
Воспользуемся функцией GetHostByName
Пример:
uses ..., WinSock

function GetIPFromName(DNS: string): string;
const
 ERR_HOST      = "Can not get host information.";
 RES_UNKNOWN   = "Unknown";
 ERR_WSA       = "Can not initialize WSA.";
 WSA_TYPE      = $101; //$202;
var
 WSA   : TWSAData;
 Host  : PHostEnt;
 Err   : Integer;
begin
 Result := RES_UNKNOWN;
 Err := WSAStartup(WSA_TYPE, WSA);
 if Err <> 0 then
 begin            
   MessageDlg(ERR_WSA, mtError, [mbOK], 0);
   Exit;
 end;
 Host := GetHostByName(PChar(DNS));
 if Assigned(Host.h_addr_list) then  
   Result :=                        
     inet_ntoa(PInAddr(Host.h_addr_list^)^)
 else
   MessageDlg(ERR_HOST, mtError, [mbOK], 0);
 WSACleanup;
end;

Пример вызова:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Caption := GetIPFromName("Rouse");
end;

==============================================================================
Вопрос:
Где взять proxies.pas
Ответ:
Данный модуль необходим только для DesignTime. Его требует DesignEditors.
Суррогатный способ обойти данное препятствие заключается в его "урезаном" аналоге:

unit Proxies;

interface

function IsProxyClass(ComponentClass: TClass): Boolean;

implementation

function IsProxyClass(ComponentClass: TClass): Boolean;
begin
 Result := True;
end;

end.

А также существует правильный способ:
Просто реорганизуйте ваш проект на использование RunTime пакетов и добавьте "DesignIDE.dcp" к вашему списку RunTime пакетов. Proxies.pas находится именно здесь, и вам не нужен исходный текст вообще.  

Почему это сделано? Просто доля уверенности, что вы не сможете распространять Design Time части (Property Editors, Component Editors), это запрещено по лицензии. DesignIDE.bpl не является свободно распространяемым, вы имеете право использовать его только на машине на которой установлена Delphi, подобно Component Libraries.


 
Игорь Шевченко ©   (2004-03-30 17:02) [187]


> А также существует правильный способ:
> Просто реорганизуйте ваш проект на использование RunTime
> пакетов и добавьте "DesignIDE.dcp" к вашему списку RunTime
> пакетов. Proxies.pas находится именно здесь, и вам не нужен
> исходный текст вообще.  


И нафига, спрашивается, приложению использовать в run-time пакет, который нужен только в Design-time ?


 
Игорь Шевченко ©   (2004-03-30 17:02) [187]


> А также существует правильный способ:
> Просто реорганизуйте ваш проект на использование RunTime
> пакетов и добавьте "DesignIDE.dcp" к вашему списку RunTime
> пакетов. Proxies.pas находится именно здесь, и вам не нужен
> исходный текст вообще.  


И нафига, спрашивается, приложению использовать в run-time пакет, который нужен только в Design-time ?


 
Юрий Зотов ©   (2004-03-30 17:12) [188]

Еще одна суперпуперпроблема:
http://delphi84.valuehost.ru/cgi-bin/forum.pl?id=1080637822&n=0
Рекомендую ответ [19] из той же ветки.


 
Юрий Зотов ©   (2004-03-30 17:12) [188]

Еще одна суперпуперпроблема:
http://delphi84.valuehost.ru/cgi-bin/forum.pl?id=1080637822&n=0
Рекомендую ответ [19] из той же ветки.


 
Rouse_ ©   (2004-03-30 17:17) [189]

> [187] Игорь Шевченко ©   (30.03.04 17:02)
Вопрос не ко мне :)
Данный текст был взят из текущего FAQ и ответ, если не ошибаюсь был Анатолия Подгорецкого ...

Просто реорганизуйте ваш проект - действительно стоит изменить...


 
Rouse_ ©   (2004-03-30 17:17) [189]

> [187] Игорь Шевченко ©   (30.03.04 17:02)
Вопрос не ко мне :)
Данный текст был взят из текущего FAQ и ответ, если не ошибаюсь был Анатолия Подгорецкого ...

Просто реорганизуйте ваш проект - действительно стоит изменить...


 
Игорь Шевченко ©   (2004-03-30 17:21) [190]

Rouse_ ©   (30.03.04 17:17)

Ссылочку на FAQ ?


 
Игорь Шевченко ©   (2004-03-30 17:21) [190]

Rouse_ ©   (30.03.04 17:17)

Ссылочку на FAQ ?


 
Rouse_ ©   (2004-03-30 17:29) [191]

http://podgoretsky.com/ftp/Language/nps/ru.delphi.html#N144


 
Rouse_ ©   (2004-03-30 17:29) [191]

http://podgoretsky.com/ftp/Language/nps/ru.delphi.html#N144


 
Rouse_ ©   (2004-03-30 17:29) [192]

Про текущее FAQ я действительно напутал...


 
Rouse_ ©   (2004-03-30 17:29) [192]

Про текущее FAQ я действительно напутал...


 
Rouse_ ©   (2004-03-30 17:40) [193]

До кучи, также просмотрите, может допустил какую ошибку:

Вопрос:
Как получить МАС адрес по IP
Ответ: Воспользоваться функцией GetIpNetTable из IpHlpApi
Пример:

interface

 IPHLPAPI = "IPHLPAPI.DLL";
 MAX_ADAPTER_ADDRESS_LENGTH = 7; .
 
type

 // Так будет выглядеть МАС
 TMacAddress = array[0..MAX_ADAPTER_ADDRESS_LENGTH] of byte;

 // Это структура для единичного запроса
 TMibIPNetRow = packed record
   dwIndex         : DWORD;
   dwPhysAddrLen   : DWORD;
   bPhysAddr       : TMACAddress;  // Вот здесь и лежит МАС!!!
   dwAddr          : DWORD;
   dwType          : DWORD;
 end;
 
 TMibIPNetRowArray = array [0..512] of TMibIPNetRow;

 // запрашиваемая структура
 PTMibIPNetTable = ^TMibIPNetTable;
 TMibIPNetTable = packed record
   dwNumEntries    : DWORD;
   Table: TMibIPNetRowArray;
 end;
 
 {$EXTERNALSYM GetIpNetTable}
 function GetIpNetTable(pIpNetTable: PTMibIPNetTable;
   pdwSize: PULONG; bOrder: Boolean): DWORD; stdcall;
   
 function GetIpNetTable; external IPHLPAPI name "GetIpNetTable";
 
implementation
   
function GetMacFromIP(const IP: String): String;

 function GetMAC(Value: TMacAddress; Length: DWORD): String;
 var
   I: Integer;
 begin
   if Length = 0 then Result := "00-00-00-00-00-00" else
   begin
     Result := "";
     for i:= 0 to Length -2 do
       Result := Result + IntToHex(Value[i], 2) + "-";
     Result := Result + IntToHex(Value[Length-1], 2);
   end;
 end;

 // Получаем IP адрес, в отличии от работы с классом WC_IPADDRESS
 // здесь преобразование идет в обратном порядке!
 function GetDottedIPFromInAddr(const InAddr: Integer): String;
 begin
   Result := "";
   Result := IntToStr(FOURTH_IPADDRESS(InAddr));
   Result := Result + "." + IntToStr(THIRD_IPADDRESS(InAddr));
   Result := Result + "." + IntToStr(SECOND_IPADDRESS(InAddr));
   Result := Result + "." + IntToStr(FIRST_IPADDRESS(InAddr));
 end;

const
 ERR_MAC     = "Can not get ARP table.";
 RES_UNKNOWN = "Unknown";
var
 Table: TMibIPNetTable;
 Size: Integer;
 CatchIP: String;
 Err, I: Integer;
begin
 Result := RES_UNKNOWN;
 Size := SizeOf(Table);                      
 Err := GetIpNetTable(@Table, @Size, False);
 if Err <> NO_ERROR then                    
 begin
   MessageDlg(ERR_MAC, mtError, [mbOK], 0);
   Exit;
 end;
 // Теперь мы имеем таблицу из IP адресов и соответсвующих им MAC адресов
 for I := 0 to Table.dwNumEntries - 1 do     // Ищем нужный IP ...
 begin
   CatchIP := GetDottedIPFromInAddr(Table.Table[I].dwAddr);
   if CatchIP = IP then                      // И выводим его МАС ...
   begin
     Result := GetMAC(Table.Table[I].bPhysAddr, Table.Table[I].dwPhysAddrLen);
     Break;
   end;
 end;
end;


Пример вызова:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Caption := GetMacFromIP("192.168.24.1");
end;


 
Rouse_ ©   (2004-03-30 17:40) [193]

До кучи, также просмотрите, может допустил какую ошибку:

Вопрос:
Как получить МАС адрес по IP
Ответ: Воспользоваться функцией GetIpNetTable из IpHlpApi
Пример:

interface

 IPHLPAPI = "IPHLPAPI.DLL";
 MAX_ADAPTER_ADDRESS_LENGTH = 7; .
 
type

 // Так будет выглядеть МАС
 TMacAddress = array[0..MAX_ADAPTER_ADDRESS_LENGTH] of byte;

 // Это структура для единичного запроса
 TMibIPNetRow = packed record
   dwIndex         : DWORD;
   dwPhysAddrLen   : DWORD;
   bPhysAddr       : TMACAddress;  // Вот здесь и лежит МАС!!!
   dwAddr          : DWORD;
   dwType          : DWORD;
 end;
 
 TMibIPNetRowArray = array [0..512] of TMibIPNetRow;

 // запрашиваемая структура
 PTMibIPNetTable = ^TMibIPNetTable;
 TMibIPNetTable = packed record
   dwNumEntries    : DWORD;
   Table: TMibIPNetRowArray;
 end;
 
 {$EXTERNALSYM GetIpNetTable}
 function GetIpNetTable(pIpNetTable: PTMibIPNetTable;
   pdwSize: PULONG; bOrder: Boolean): DWORD; stdcall;
   
 function GetIpNetTable; external IPHLPAPI name "GetIpNetTable";
 
implementation
   
function GetMacFromIP(const IP: String): String;

 function GetMAC(Value: TMacAddress; Length: DWORD): String;
 var
   I: Integer;
 begin
   if Length = 0 then Result := "00-00-00-00-00-00" else
   begin
     Result := "";
     for i:= 0 to Length -2 do
       Result := Result + IntToHex(Value[i], 2) + "-";
     Result := Result + IntToHex(Value[Length-1], 2);
   end;
 end;

 // Получаем IP адрес, в отличии от работы с классом WC_IPADDRESS
 // здесь преобразование идет в обратном порядке!
 function GetDottedIPFromInAddr(const InAddr: Integer): String;
 begin
   Result := "";
   Result := IntToStr(FOURTH_IPADDRESS(InAddr));
   Result := Result + "." + IntToStr(THIRD_IPADDRESS(InAddr));
   Result := Result + "." + IntToStr(SECOND_IPADDRESS(InAddr));
   Result := Result + "." + IntToStr(FIRST_IPADDRESS(InAddr));
 end;

const
 ERR_MAC     = "Can not get ARP table.";
 RES_UNKNOWN = "Unknown";
var
 Table: TMibIPNetTable;
 Size: Integer;
 CatchIP: String;
 Err, I: Integer;
begin
 Result := RES_UNKNOWN;
 Size := SizeOf(Table);                      
 Err := GetIpNetTable(@Table, @Size, False);
 if Err <> NO_ERROR then                    
 begin
   MessageDlg(ERR_MAC, mtError, [mbOK], 0);
   Exit;
 end;
 // Теперь мы имеем таблицу из IP адресов и соответсвующих им MAC адресов
 for I := 0 to Table.dwNumEntries - 1 do     // Ищем нужный IP ...
 begin
   CatchIP := GetDottedIPFromInAddr(Table.Table[I].dwAddr);
   if CatchIP = IP then                      // И выводим его МАС ...
   begin
     Result := GetMAC(Table.Table[I].bPhysAddr, Table.Table[I].dwPhysAddrLen);
     Break;
   end;
 end;
end;


Пример вызова:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Caption := GetMacFromIP("192.168.24.1");
end;


 
Юрий Зотов ©   (2004-03-30 17:56) [194]

Предлагаю такую редакцию:

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

Если ошибка возникает при компиляции пакета, то просто добавьте в его секцию requires файл DesignIDE.dcp.

Если же ошибка возникает при компиляции приложения или DLL, то это означает, что проект или один из используемых им пакетов  неверно структурирован и подтягивает в свой run-time код специфичный design-time модуль. Реструктурируйте его так, чтобы run-time код нигде бы не ссылался на design-time модули.

Чтобы было понятнее - вот пример НЕВЕРНОЙ структуризации.

unit MyComp;
...
type
 TMyComponent = class(...)
 ...
 end;
 TMyComponentEditor = class(...)
 ...
 end;
...
end;

Поскольку модуль содержит не только сам компонент TMyComponent, но и его редактор TMyComponentEditor, то в uses будет необходимо указать DesignEditors - что и потащит за собой design-time код вместе с Proxies. Указав в requires пакета DesignIDE.dcp, проблему мы решим - но что произойдет при компиляции приложения, которое использует компонент TMyComponent?

Произойдет то, в его uses надо будет включить MyComp - а далее потащится весь тот же самый код. Но у проекта нет никакой секции requires и возникнет неразрешимая проблема. А чтобы она не возникла, нужно разбить модуль MyComp на два. В первом оставить только сам компонент и включить этот модуль в run-time пакет. А во второй вынести класс TMyComponentEditor, процедуру Register и ресурс с иконкой компонента (если она есть) - и вот этот второй модуль нужно включить в design-time пакет, а к нему в requires надо подключить тот самый DesignIDE.dcp.

Естественно, второй модуль будет ссылаться на первый - и это вполне нормально. Главное как раз в том, что первый не будет ссылаться на второй и, таким образом, design-time код окажется полностью отделен от run-time кода.


 
Юрий Зотов ©   (2004-03-30 17:56) [194]

Предлагаю такую редакцию:

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

Если ошибка возникает при компиляции пакета, то просто добавьте в его секцию requires файл DesignIDE.dcp.

Если же ошибка возникает при компиляции приложения или DLL, то это означает, что проект или один из используемых им пакетов  неверно структурирован и подтягивает в свой run-time код специфичный design-time модуль. Реструктурируйте его так, чтобы run-time код нигде бы не ссылался на design-time модули.

Чтобы было понятнее - вот пример НЕВЕРНОЙ структуризации.

unit MyComp;
...
type
 TMyComponent = class(...)
 ...
 end;
 TMyComponentEditor = class(...)
 ...
 end;
...
end;

Поскольку модуль содержит не только сам компонент TMyComponent, но и его редактор TMyComponentEditor, то в uses будет необходимо указать DesignEditors - что и потащит за собой design-time код вместе с Proxies. Указав в requires пакета DesignIDE.dcp, проблему мы решим - но что произойдет при компиляции приложения, которое использует компонент TMyComponent?

Произойдет то, в его uses надо будет включить MyComp - а далее потащится весь тот же самый код. Но у проекта нет никакой секции requires и возникнет неразрешимая проблема. А чтобы она не возникла, нужно разбить модуль MyComp на два. В первом оставить только сам компонент и включить этот модуль в run-time пакет. А во второй вынести класс TMyComponentEditor, процедуру Register и ресурс с иконкой компонента (если она есть) - и вот этот второй модуль нужно включить в design-time пакет, а к нему в requires надо подключить тот самый DesignIDE.dcp.

Естественно, второй модуль будет ссылаться на первый - и это вполне нормально. Главное как раз в том, что первый не будет ссылаться на второй и, таким образом, design-time код окажется полностью отделен от run-time кода.


 
Piter ©   (2004-03-30 18:24) [195]

Игорь Шевченко (30.03.04 10:34) [181]
Кроме Windows NT.


Ок. Надо изменить фразу
она реализована как в NT системах, так и в 9x.
на
она реализована в windows 95, 98, ME, 2000, XP и, вероятно, останется в следующих версиях.


 
Piter ©   (2004-03-30 18:24) [195]

Игорь Шевченко (30.03.04 10:34) [181]
Кроме Windows NT.


Ок. Надо изменить фразу
она реализована как в NT системах, так и в 9x.
на
она реализована в windows 95, 98, ME, 2000, XP и, вероятно, останется в следующих версиях.


 
Rouse_ ©   (2004-03-30 18:56) [196]

> [195] Piter ©   (30.03.04 18:24)
Если быть точным, то

Requirements
Client: Included in Windows XP, Windows 2000 Professional, Windows Me, Windows 98, and Windows 95.
Server: Included in Windows Server 2003 and Windows 2000 Server.


 
Rouse_ ©   (2004-03-30 18:56) [196]

> [195] Piter ©   (30.03.04 18:24)
Если быть точным, то

Requirements
Client: Included in Windows XP, Windows 2000 Professional, Windows Me, Windows 98, and Windows 95.
Server: Included in Windows Server 2003 and Windows 2000 Server.


 
Piter ©   (2004-03-30 20:25) [197]

Кстати, к данному ответу могу приплести тоже достаточно задаваемый вопрос про "убиение процесса", то есть про TerminateProccess.
Хотя лучше отдельным пунктом FAQ"а отметить я думаю... так что вот предлагаю еще один вопрос в FAQ "как убить чужой процесс"


 
Piter ©   (2004-03-30 20:25) [197]

Кстати, к данному ответу могу приплести тоже достаточно задаваемый вопрос про "убиение процесса", то есть про TerminateProccess.
Хотя лучше отдельным пунктом FAQ"а отметить я думаю... так что вот предлагаю еще один вопрос в FAQ "как убить чужой процесс"


 
Игорь Шевченко ©   (2004-03-30 21:26) [198]

Piter ©   (30.03.04 20:25)

Есть предложение не вносить вопрос про убийство чужого процесса в FAQ, потому как MS пишет, что использовать его надо очень осторожно и при крайней нужде. А горе-хацкеров нефиг плодить :)


 
Игорь Шевченко ©   (2004-03-30 21:26) [198]

Piter ©   (30.03.04 20:25)

Есть предложение не вносить вопрос про убийство чужого процесса в FAQ, потому как MS пишет, что использовать его надо очень осторожно и при крайней нужде. А горе-хацкеров нефиг плодить :)


 
Rouse_ ©   (2004-03-30 21:38) [199]

Ну тогда уж думаю стоит и это вычеркнуть:

Как перехватить Ctrl+Alt+Del
Как скрыть программу от Ctrl+Alt+Del
Как не дать снять мою программу из Task Manager
Как отправить письмо с вложением
Как установить - разорвать соединение DialUp
Как закрыть чужое приложение из моего

А вот вопросов по базам нинка не наблюдается... Что, разве в "Базах" никто не сидит?


 
Rouse_ ©   (2004-03-30 21:38) [199]

Ну тогда уж думаю стоит и это вычеркнуть:

Как перехватить Ctrl+Alt+Del
Как скрыть программу от Ctrl+Alt+Del
Как не дать снять мою программу из Task Manager
Как отправить письмо с вложением
Как установить - разорвать соединение DialUp
Как закрыть чужое приложение из моего

А вот вопросов по базам нинка не наблюдается... Что, разве в "Базах" никто не сидит?


 
Юрий Зотов ©   (2004-03-30 22:29) [200]

> Rouse_ ©   (30.03.04 21:38) [199]

Саш, для твоей же коллекции:

> А вот вопросов по базам нинка не наблюдается...
А казалось бы - ведь такое распространенное имя.

> Что, разве в "Базах" никто не сидит?
Нет, только в "Крестах".


 
Юрий Зотов ©   (2004-03-30 22:29) [200]

> Rouse_ ©   (30.03.04 21:38) [199]

Саш, для твоей же коллекции:

> А вот вопросов по базам нинка не наблюдается...
А казалось бы - ведь такое распространенное имя.

> Что, разве в "Базах" никто не сидит?
Нет, только в "Крестах".



Страницы: 1 2 3 4 5 6 7 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.27 MB
Время: 0.13 c
1-1082357539
wezz
2004-04-19 10:52
2004.05.09
Не устанавливается StatusBar1.Panels[0].Text


6-1079460407
КомофОнСамый
2004-03-16 21:06
2004.05.09
Как вызвать окно с диалапом?


8-1076589620
able
2004-02-12 15:40
2004.05.09
TImage сильно мерцает...


1-1082816283
jiurasic
2004-04-24 18:18
2004.05.09
Как работать с неизвестным типом данных?


3-1081458389
Igoryok
2004-04-09 01:06
2004.05.09
Как вызвать функцию из Access





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский