Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Три вопроса по Delphi

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Audciz



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
1) Подскажите, как в Delphi запускать другие проги (например exe-шники)
2) Какими командами можно работать с памятью (например делать трейнеры)
3) Какими командами можно работать с реестром.

Всего записей: 649 | Зарегистр. 13-02-2003 | Отправлено: 12:12 26-08-2003
MMV

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IMHO
1) Win32 API CreateProcess, CreateProcessEx (SDK под рукой нет. Когда то делал это)
2) Тоже наверное Win32 API (не надо было)
3) В дельфи своя библиотека есть для работы с реестром. но в 4 версии там были ошибки в Enumerate (Исправили благо библиотека в исходниках, почти вся)
Иначе тоже через Win32 API

Всего записей: 39 | Зарегистр. 18-12-2001 | Отправлено: 15:05 26-08-2003
Bonch



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Audciz
1) ShellExecute
2) Не работал
3) F1, TRegistry

Всего записей: 2016 | Зарегистр. 17-07-2001 | Отправлено: 15:50 26-08-2003
MMV

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
1) ShellExecute  

Тоже можно. даже гараздо проще.  
Но.  
ShellExecute устаревший API, не рекомендованный к использованию.
CreateProcess дает больше возможностей по синхронизации выполнения процессов.

Всего записей: 39 | Зарегистр. 18-12-2001 | Отправлено: 16:00 26-08-2003
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MMV
Да нет, это WinExec - устаревший, из Win 3.11. Про ShellExecute не встречал сведений об его устарелости, разве что по сравнению с ShellExecuteEx. ShellExecute вполне хорош для своих целей, н-р, для автоматического запуска приложения, ассоциированного с типом файла, это эмуляция двойного клика в Проводнике по файлу (как один из вариантов использования). CreateProcess такого не умеет напрямую.
Audciz
А чего такое трейнеры? По моему, никто здесь не понял ...
Ищи в MSDN строку "Memory Management Functions", будут там тебе всякие функции.

Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 17:18 26-08-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Audciz С реестром можно работать двумя способами, при помощи чистого АПИ или при помощи стандартных классов. АПИ ищи по RegOpenKeyEx и так далее по Хэлпу, а при помощи классов тебе уже сказали F1 TRegistry.
По работе с памятью смотри в SDK Memory Management Functions.
По поводу WinExec не согласен со всеми. Если мне надо просто запустить внешний процесс, и ничего более я именно его использую. Но иногда помогает только ShellExecute, например при запуске бат файла, когда что екзек что криэт, не хотели работать. Так что ИМХО надо все уметь использоватьв зависимости от цели.


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 00:52 27-08-2003
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата из MSDN:

Цитата:
 
If a malicious user were to create an application called "Program.exe" on a system, any program that incorrectly calls WinExec using the Program Files directory will run this application instead of the intended application.  
 
To avoid this problem, use CreateProcess rather than WinExec.  
 

Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 15:45 27-08-2003
Audciz



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Спасибо всем... Ещё два вопросика: 1)Как можно отправлять прогу в трей в Delphi7.
2)Я написал инспектор задач, который выводит все видимые и невидимые процессы в списке. Я пытался сделать так, чтобы при выборе программы и по нажатию кнопки эта прога закрывалась. Было зто давно, и я уже не помню какую команду я использовал, но роисходила такая проблемма: названия прог были в формате String, не совместимом с PAnsiChar. Для команды по закрытию прог нужен параметр Handle-кодовое название программы,- в формате PAnsiChar. Надеюсь Вы поймёте, что я имею в виду. Я хочу узнать, как можно из String'а перевести в PAnsiChar или какую-нибудь другую, более удобную команду для закрытия приложений и тому подобное.

Всего записей: 649 | Зарегистр. 13-02-2003 | Отправлено: 12:43 28-08-2003
woffer

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Audciz
1)Api функция Shell_NotifyIcon
2)Функция PChar

Всего записей: 935 | Зарегистр. 11-10-2002 | Отправлено: 15:00 28-08-2003 | Исправлено: woffer, 15:03 28-08-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Audciz я не совсем понимаю, зачем Хэндл должен быть в формате PAnsiChar. Все проги терминетятся при помощи TerminateProcess. Там точно хэндл DWORD

Цитата:
 
The TerminateProcess function terminates the specified process and all of its threads.  
 
BOOL TerminateProcess(
 
    HANDLE hProcess, // handle to the process  
    UINT uExitCode // exit code for the process  
   );
 
 
Parameters
 
hProcess
 
Identifies the process to terminate.  
Windows NT: The handle must have PROCESS_TERMINATE access. For more information, see Process Objects.  
 
uExitCode
 
Specifies the exit code for the process and for all threads terminated as a result of this call. Use the GetExitCodeProcess
 function to retrieve the process's exit value. Use the GetExitCodeThread function to retrieve a thread's exit value.

Поэтому не понимаю твою проблему. Даже если ты все хэндлы заносишь в что то типа stringgrida, то никто не мешает тебе в крайнем случае(если не можешь строку в чило перевести ) создать соответствующий массив хэндлов. При терминате смотришь соответсвующий индекс, и если хэндл не ноль то килл процесс. Хотя проще все таки при помощи Val перевести строку в число, и его передать как параметр в функцию термината.
По поводу как вставить иконку(так как прогу в трей ну никак нельзя отправить уж слишком он маленький, а прога большая ) в трей - это старый старый FAQ. Надо было просто ввести где нибудь в поисковике это слово и ты получил бы кучу примеров как это делать. Я не удивлюсь если бы ты и здесь зделал фильтр на это слово, то нашел бы ответ. А так тебе правильно сказали, Shell_NotifyIcon. Вот пример,

Цитата:
 
       uses ShellAPI;
 
var
       IconData:TNOTIFYICONDATA;
 
        IconData.cbSize:=sizeof(IconData);
        IconData.Wnd:=Handle;
        IconData.uID:=100;
        IconData.uFlags:=NIF_MESSAGE+NIF_ICON+NIF_TIP;
        IconData.uCallbackMessage:=WM_USER+1;
        IconData.hIcon:=Application.Icon.Handle;
        StrPCopy(IconData.szTip, '  My Cool Hint  ');
        Shell_NotifyIcon(NIM_ADD, @IconData);
 
      Так же можно NIM_MODIFY, а в конце работы NIM_DELETE. Кстати, тебе еще надо будет обрабатывать WndProc, чтобы трей как то отвечал тебе.
 



----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 00:47 29-08-2003
Audciz



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А где можно посмотреть помощь по этим командам, а то я в Delphi пока начинающий и не во всём разбираюсь...

Всего записей: 649 | Зарегистр. 13-02-2003 | Отправлено: 08:51 30-08-2003
Almaz



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Audciz

Цитата:
где можно посмотреть помощь по этим командам

start menu | delphi | Help | MS SDK Help files пифагор: царских путей в геометрии нет

Цитата:
я в Delphi пока начинающий  
ну, блин, тебя и угораздило, если честно, то WinAPI - тааааакая гадость, особенно если через дельфи. удачи тебе

Всего записей: 2219 | Зарегистр. 20-06-2002 | Отправлено: 12:09 30-08-2003
EAS



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
WinAPI - тааааакая гадость

Не гадость, а относительно низкоуровеневое программирование под вынь. Если программить сА-Авсем без WinAPI, то дальше консоли не уйдешь. Под дельфями его использовать конечно не удобно -- язык другой, хотя бы, да и некоторые функции почему-то Borland проигнорировал и не декларировал. Смотря что пишешь, конечно, но нередко без него - никуда.

Всего записей: 441 | Зарегистр. 18-07-2003 | Отправлено: 03:58 31-08-2003
Almaz



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EAS

Цитата:
WinAPI - тааааакая гадость, особенно если через дельфи

к счастью имею дело с ним редко, даже если приходится - стараюсь найти что-нибудь чужое в обертке от дельфи, лучше всего с кодами, дело вкуса и конкретных задач. ничего кроме MS SDK, который с дельфи, не читал, впечатления от этой справки - самые негативные.

Цитата:
Если программить сА-Авсем без WinAPI, то дальше консоли не уйдешь

имхо, преувеличение. никто не мешает пользоваться сторонними компонентами.

Всего записей: 2219 | Зарегистр. 20-06-2002 | Отправлено: 10:15 31-08-2003
Arion



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
имхо, преувеличение. никто не мешает пользоваться сторонними компонентами.

 
Ну ну. Чего тогда стоит программист, который для банального определения версии операционной системы судорожно ищет в сети бесплатную компоненту.

Всего записей: 436 | Зарегистр. 29-06-2003 | Отправлено: 15:42 31-08-2003
Almaz



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arion

Цитата:
Чего тогда стоит программист, который для банального определения версии операционной системы судорожно ищет в сети бесплатную компоненту

программисты и задачи ихние - оч.разные бывают. Audciz одно нужно, мне совсем другое. искать судорожно не надо, должно быть уже готово.
мои потребности про версию:
по минимуму - SysUtils.Win32Platform (чтоб отсечь 95, один раз всего было нужно)
по максимуму rxLib.VCLUtils.GetWindowsVersion (мне удобней посмотреть коды rxLib, чем корячиться с хелпом про GetVersionEx)
для меня WinAPI - только в случае крайней необходимости, стараюсь избегать как дурного тона, для меня он всегда оборачивается тратой времени и противным осадком на душе.
ну не удобен SDK help для дельфи, копи-паст не проходит!
добавлено

Цитата:
Если программить сА-Авсем без WinAPI, то дальше консоли не уйдешь

весь наш флейм, который, кстати, надо заканчивать, начался вот с этой очень некорректной, имхо сказанной в запале, фразы. и тут же ниже очень правильно:

Цитата:
Смотря что пишешь, конечно

Всего записей: 2219 | Зарегистр. 20-06-2002 | Отправлено: 16:26 31-08-2003 | Исправлено: Almaz, 17:29 31-08-2003
Audciz



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Спасиба за помощь, с этими командами я ещё поработаю, но никто мне так и не ответил на мой вопрос
Цитата:
2) Какими командами можно работать с памятью (например делать трейнеры)
. А трейнеры я вам скажу, это программы которые могут изменять данные из памяти. Чаще всего их используют дла игр.
 
Добавлено
И ещё вопросик сможет ли TRegistry удалить неверный ключ из реестра, который как-бы существует но по-правде не существует. Эту проблему я описал в разделе "Реестр Windows XP/2000". Помогите кто может...

Всего записей: 649 | Зарегистр. 13-02-2003 | Отправлено: 18:53 31-08-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Audciz я конечно не понимаю зачем человеку, который только начинает изучать Дельфи лезть в память процессов. Там же голимый АПИ, да еще в Сяшном описании. Но раз ты так просишь, то вот одка фунция. Набираешь ее в едиторе, нажимаешь Ф1 и получаешь весь список фунций по своей просьбе. (только после головной боли в тщетных попытках разобраться не пиши - где взять компоненту для создания тренера )
 
The WriteProcessMemory function writes memory in a specified process. The entire area to be written to must be accessible, or the operation fails.  
 
BOOL WriteProcessMemory(
 
    HANDLE hProcess, // handle to process whose memory is written to  
    LPVOID lpBaseAddress, // address to start writing to  
    LPVOID lpBuffer, // pointer to buffer to write data to
    DWORD nSize, // number of bytes to write
    LPDWORD lpNumberOfBytesWritten // actual number of bytes written  
   );
 
 
Parameters
 
hProcess
 
Identifies an open handle to a process whose memory is to be written to. The handle must have PROCESS_VM_WRITE and PROCESS_VM_OPERATION access to the process.  
 
lpBaseAddress
 
Points to the base address in the specified process to be written to. Before any data transfer occurs, the system verifies that all data in the base address and memory of the specified size is accessible for write access. If this is the case, the function proceeds; otherwise, the function fails.  
 
lpBuffer
 
Points to the buffer that supplies data to be written into the address space of the specified process.  
 
nSize
 
Specifies the requested number of bytes to write into the specified process.  
 
lpNumberOfBytesWritten
 
Points to the actual number of bytes transferred into the specified process. This parameter is optional. If lpNumberOfBytesWritten is NULL, the parameter is ignored.  

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 00:55 01-09-2003
EAS



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Недопонял, слегоца, это как:

Цитата:
И ещё вопросик сможет ли TRegistry удалить неверный ключ из реестра, который как-бы существует но по-правде не существует

Существует, все-таки или нет? ИМХО слово как-бы здесь неуместно.
 
Если ключ не существует, то:
1. TRegistry.KeyExists(...) скажет false
1.1 TRegistry.OpenKey(..., false) вернет false,  
из чего уже можно сделать какие-нибудь выводы, надо ли вообще что-нибудь удалять.
2. Если ветка есть, то проверить наличие значения можно функцией TRegistry.ValueExists(...)
3. Если попытаться прочесть несуществующее значение, то TRegistry.Read*(...) кинет ERegistryException
4. TRegistry.DeleteValue(...) вернет false, как собственно и TRegistry.DeleteKey(...)
 
Таким образом, есть два варианта: сперва определится с существованием ключа, а потом уже его удалять; удалять невзирая ни на что, хотя это, имхо, некрасиво.
Ну, и про исключения не забывать, ессно. А также RTFM .

Всего записей: 441 | Зарегистр. 18-07-2003 | Отправлено: 04:13 01-09-2003 | Исправлено: EAS, 04:16 01-09-2003
Audciz



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ShIvADeSt
Ладно... Все-равно спасибо. Лучше подучу Delphi, а потом за это возьмусь.
EAS
Я говорюкак-бы потому-что, когда создаёшь в одном ключе другой ключ, с существующим именем, то REGEDIT пишет, что нельзя, мол потому-что уже существует такой ключ. А когда я создаю в том же ключе, где находится глючный ключ, другие с такими же названиями, то REGEDIT ничего не пишет.

Всего записей: 649 | Зарегистр. 13-02-2003 | Отправлено: 19:00 02-09-2003
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Три вопроса по Delphi


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru