Добро пожаловать, гость ( Вход | Регистрация )
| -=CHE@TER=- |
Jan 5 2007, 00:35
Сообщение
#1
|
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,402 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 325 раз(а) |
Delphi programs in API.
На английском. Очень подробно всё описано, плюс есть исходные коды готовых юнитов. Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял). |
![]() ![]() |
| -=CHE@TER=- |
Apr 15 2012, 10:32
Сообщение
#2
|
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,402 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 325 раз(а) |
И ещё о нескольких устаревших (по мнению MSDN, где ими не советуют пользоваться) функциях.
Часто программе нужно где-то хранить настройки. Вариантов хранения два: 1) В файле. 2) В реестре. Microsoft настоятельно рекомендует пункт 2 и пользоваться для этих целей веткой реестра HKEY_CURRENT_USER \ Software, чтобы у каждого пользователя были свои настройки - т.е. каждый вошедший в систему пользователь мог настроить программу "под себя" (так как ему нравится). Как известно HKEY_CURRENT_USER загружается автоматически вместе с текущим профилем пользователя при входе в систему и у каждого пользователя эта ветка реестра будет своя (разумеется, кроме тех одинаковых вещей, которые по умолчанию добавляет туда сама система при создании профиля для нового пользователя). К слову, HKEY_LOCAL_MACHINE - это глобальная ветка, настройки в которой доступны всем пользователям (вернее будет сказать, что это настройки для всего компьютера), посему и писать туда не имея прав администратора вообще нельзя. Хранение же настроек в файле чревато тем, что у всех пользователей будут одни и те же настройки, а если каждый захочет менять под себя... будет мало хорошего. В принципе, можно хранить настройки в каталоге пользователя C:\Documents and Settings\USERNAME\Application Data\<ИМЯ ПРОГРАММЫ> (т.н. каталог %APPDATA% - который, как и ветка реестра, у каждого пользователя свой). Однако, и реестр и каталог пользователя "болеют" одной проблемой: при удалении программы, все эти вещи остаются. Т.е. система получается загажена неиспользуемыми данными - "мусором". Можно, конечно, сделать установщик, который будет все эти вещи чистить при удалении программы. Однако же: 1) Надо писать установщик. 2) Надо писать логику и обработку удаления программы. 3) Программа перестаёт быть portable (портативной - переносной, ей обязательно нужен будет доступ для записи либо в реестр, либо на жёсткий диск). Самый серьёзный пункт - это пункт 3. Но даже не в этом дело, а в том, что многие пользователи до сих пор, "по привычке", удаляют программу через SHIFT+DELETE, вместо "Установки и удаления", что сводит все старания из п.п. 1 и 2 на нет. Наконец, для программ, которые являются каким-то разовыми утилитами и которыми не пользуешься каждый день, все эти вещи просто лишние. И вот тут нас выручают настройки сохранённые в файл в каталоге программы - по завершении работы весь каталог с программой можно безболезненно удалить. И всё вернётся на круги своя. Настройки можно хранить и в своём формате, но гораздо удобнее, на тот случай, если программа навернётся при запуске из-за кривого файла настроек, делать это в .INI формате, который очень просто и быстро в таких ситуациях можно подправить ручками, а не писать для этого специальную программу-редактор. Уф, ладно, со вступлением закончил. (*улыбается*) Теперь переходим к практике. Для работы с .INI файлами есть в WinAPI следующие функции: GetPrivateProfile* - для чтения WritePrivateProfile* - для записи * - означает, что есть несколько функций, которые начинаются на эту строку, но имеют разные окончания. Для примера рассмотрим вот такой тестовый "test.ini" файл: CODE [Main] Param1=123 StrVal=String! Для того, чтобы прочитать оттуда нужно сделать следующее: CODE Var S: String; X: Integer; Begin ... // максимальный размер строки - 100 символов SetLength(S, 100); // меняем на тот, сколько реально было прочитано SetLength(S, GetPrivateProfileString('Main', 'StrVal', '', @S[1], Length(S), '.\test.ini')); X:=GetPrivateProfileInt('Main', 'Param1', 0, '.\test.ini'); Ну и писать, точно также, только через WritePrivateProfile*. Кстати, чтобы удалить из .INI достаточно написать (Nil - в качестве значения параметра, чтобы удалить): CODE WritePrivateProfileString('Main', 'StrVal', Nil, '.\test.ini'); И StrVal вообще исчезнет из .INI файла. Важные замечания: 1) Не путайте (Get/Write)PrivateProfile* и просто (Get/Write)Profile* - последние функции (без Private в названии) пишут в системный файл "WIN.INI"! А его лучше не трогать, к тому же доступа на запись в системный каталог может не быть. 2) Не забывайте писать '.\' в начале имени файла. Это важно - если написать просто 'test.ini', то этот файл будет сохранён в "C:\Windows\test.ini" - а прав записи туда может не быть. 3) Функций гораздо больше (не только *String и *Int) - см. справку по MSDN. Я, кстати, здесь не объяснил некоторые параметры (значения по умолчанию, например, если параметра в файле нет) - за всем этим, а также другими удобными вещами и прочими тонкостями - см. MSDN. 4) Как я уже говорил, MSDN настоятельно рекомендует не пользоваться этими функциями и посылает всех в реестр, однако же, они вполне себе спокойно работают и под Windows 7. P.S. В Delphi есть IniFiles при подключении которого через uses появится класс TIniFile работающий с .INI файлами и независящий от перечисленных WinAPI функций, однако же, как я уже писал в сообщении выше, для небольших программ на WinAPI подключение этого модуля чудовищно раздувает размер кода. |
-=CHE@TER=- Delphi, Asm, C, WinAPI, PHP, ... Jan 5 2007, 00:35
Siberian GRemlin Может не в тему, но не решился создавать новую тем... Jul 5 2007, 16:36
-=CHE@TER=- Может не в тему, но не решился создавать новую тем... Jul 5 2007, 16:44
-=CHE@TER=- Вопрос - кто знает, как по MUTEX'у процесса по... Jul 7 2007, 16:37
jTommy Вопрос - кто знает, как по MUTEX'у процесса по... Jul 8 2007, 16:01
-=CHE@TER=- Если я правильно понял ситуация такая: загружена т... Jul 9 2007, 12:10
jTommy Нет, всё гораздо хуже - программа при загрузке ком... Jul 9 2007, 20:09
-=CHE@TER=- Нет, всё гораздо хуже - программа при загрузке ком... Aug 22 2014, 11:14
Xplorer Handle'у процесса посылал WM_CLOSE - без толку... Jul 10 2007, 09:44
-=CHE@TER=- Бардак на корабле! © Попугай из Пиратов Карибс... Jul 10 2007, 12:51
Xplorer Я изменил код.
А вот, кстати, интересный тогда вп... Jul 10 2007, 13:54
-=CHE@TER=- Я изменил код.
Смотри в коде.Хе-хе, ты своё сообщ... Jul 10 2007, 22:04
-=CHE@TER=- Думаю, тут будет полезно приводить некоторые полез... Jul 16 2007, 16:40
Siberian GRemlin Извиняюсь, если не в тему (вроде это WinAPI). Хоте... Jul 19 2007, 09:14
-=CHE@TER=- Извиняюсь, если не в тему (вроде это WinAP). Хотел... Jul 19 2007, 13:51
-=CHE@TER=- А теперь моя очередь задавать вопрос. (*улыбается*... Jul 20 2007, 01:30
Xplorer Для 2000/XP/2003/Vista - RasGetConnectionStatistic... Jul 20 2007, 06:08
-=CHE@TER=- Xplorer!
RasGetConnectionStatistics - это как ... Jul 20 2007, 13:48
-=CHE@TER=- [b]Xplorer!
RasGetConnectionStatistics - это к... Jul 21 2010, 16:00
-=CHE@TER=- Переименовал тему - теперь тут можете обсуждать чт... Jul 23 2007, 19:01
-=CHE@TER=- Кстати, насчёт ReadKey / KeyPressed - вот, неплоха... Aug 11 2007, 13:54
-=CHE@TER=- Вопрос ко всем - возможно ли при помощи класса TFi... Apr 7 2008, 17:03
Xplorer S := TFileStream.Create('x.x', fmO... Apr 8 2008, 19:30
-=CHE@TER=- Xplorer!
Ой, спасибо большое!
Что-то я сто... Apr 9 2008, 10:09
-=CHE@TER=- Ещё пара глупых вопросов:
1. В Си можно сделать т... Jun 8 2008, 11:49
Grom PE -=CHE@TER=-, вопросы нормальные =)
1. Если я прав... Jun 8 2008, 12:28
-=CHE@TER=- Grom PE!
Спасибо большое, только создавать ещё... Jun 8 2008, 17:59
-=CHE@TER=- Небольшая программка для перезапуска зависших прил... Oct 12 2008, 19:56
-=CHE@TER=- Вопрос: кто-нибудь знает как получить ключи команд... Oct 13 2008, 08:16
-=CHE@TER=- Вот код тру перезапускалки:
Program WHungApp;
Us... Oct 13 2008, 10:55
-=CHE@TER=- PHP 5.2.1 + IIS 6
PHP has encountered an Access V... Oct 18 2008, 11:15
-=CHE@TER=- Очередная херня - столько времени убил, пока нагуг... Oct 31 2008, 15:54
-=CHE@TER=- Есть на форме UpDown1, ассоциированный (Associate)... Nov 15 2008, 07:32
Grom PE -=CHE@TER=-,
у меня с чистым созданным проектом вс... Nov 15 2008, 12:58
-=CHE@TER=- Еще попробуй перезапустить Delphi.Как оно всё оказ... Nov 15 2008, 13:08
-=CHE@TER=- Вопрос сложный, но может кто-то знает в чём прикол... Dec 18 2008, 18:26
-=CHE@TER=- Делал тут как-то плеер. И решил сделать для него в... Jan 2 2009, 19:53
-=CHE@TER=- Кто-нибудь знает, как можно проверить сокет на дох... Jun 25 2009, 04:10
-=CHE@TER=- Однако! Первая строчка с получением 0 байт у м... Dec 5 2009, 16:36
Siberian GRemlin Обычно указывается драйвер вызвавший эту ошибку. Е... Jun 25 2009, 06:22
-=CHE@TER=- Обычно указывается драйвер вызвавший эту ошибку. Е... Jun 25 2009, 11:56
Siberian GRemlin Полезную статейку нашёл. Даже если ошибка на чужом... Nov 2 2009, 10:11
-=CHE@TER=- Товарищи, объясните мне кто-нибудь такой феномен:
... Jan 15 2010, 19:26
Grom PE -=CHE@TER=-
Ну дык, процессор так работает, x shr... Jan 16 2010, 07:46
-=CHE@TER=- Думаю, что это лучше здесь разместить, чем в ссылк... Jan 23 2010, 18:35
Siberian GRemlin Может не в тему, но есть ли готовый модуль\би... Feb 15 2010, 15:45
Axsis пара ссылок с первой страницы гугла:
http://www.de... Feb 15 2010, 16:10
-=CHE@TER=- Чтобы долго не писать чего да как - приведу [/cut]... Apr 22 2010, 10:05
-=CHE@TER=- Иногда бывает надо при распаковке игровых архивов ... Jun 1 2010, 17:46
-=CHE@TER=- Блин, ставил по работе на удалённый сайт Joomla - ... Jul 27 2010, 17:38
-=CHE@TER=- Вчерась ковырял одну игрушку, где данные были упак... Aug 10 2010, 14:27
-=CHE@TER=- Вчерась ковырял одну игрушку, где данные были упак... Mar 7 2012, 20:37
Siberian GRemlin Сегодня у меня был очередной сеанс мозгофилии.
При... Jan 7 2011, 15:20
-=CHE@TER=- 1) Либо Inno: AnsiString -> WideString; Delphi:... Jan 7 2011, 23:20
Siberian GRemlin Собственно, я и спрашивал как правильно перегнать ... Jan 8 2011, 10:49
-=CHE@TER=- Locale - это, грубо так говоря, язык установленный... Jan 8 2011, 12:35
-=CHE@TER=- Ковырял тут по просьбе CMS одну. Собственно, были ... Jan 9 2011, 16:01
Siberian GRemlin Не подскажите ка можно на JavaScript вставить (гип... Apr 14 2011, 16:49
-=CHE@TER=- Если тебе просто что-то надо вставить, а не файл, ... Apr 14 2011, 18:26
Siberian GRemlin Мне нужно было именно на JS или jQ, ибо для AJAX н... Apr 15 2011, 11:12
-=CHE@TER=- Поставил я тут новый colorer для FAR и моя тачка з... Jul 23 2011, 13:01
Siberian GRemlin Намедни столкнулся с тем что IE не понимает InnerH... Jul 28 2011, 03:05
-=CHE@TER=- У Delphi такой смешной оптимизатор (компилирую про... Nov 11 2011, 15:15
-=CHE@TER=- Siberian GRemlin!
До меня, кажется, дошло, по... Nov 14 2011, 13:41
-=CHE@TER=- У Delphi такой смешной оптимизатор (компилирую про... Mar 12 2012, 09:13
Siberian GRemlin для каждой строки писать String[кол-во_символов] =... Mar 12 2012, 11:07
Siberian GRemlin Как я понимаю при конкатенации (дурацкое слово) ст... Nov 11 2011, 15:25
-=CHE@TER=- Похоже долго ты на Java писал. (*улыбается*)
Нет,... Nov 11 2011, 20:39
-=CHE@TER=- Писал я недавно патч для включения крови в German ... Jan 14 2012, 13:26
Siberian GRemlin Кто-нибудь знает где можно взять готовый код под P... Mar 24 2012, 09:13
-=CHE@TER=- Вот тут (за номером 7 самый простой, и ниже - до к... Mar 24 2012, 11:58
-=CHE@TER=- В Си есть такая замечательная функция, как sprintf... Apr 14 2012, 15:39
-=CHE@TER=- Проводя очередную чистку системы, натолкнулся на ф... Apr 19 2012, 13:23
Grom PE Сам у себя встречал такие файлы. Полюбопытствовал,... Apr 19 2012, 19:05
-=CHE@TER=- В очередной раз зайдя на сайт товарища Siberian GR... Apr 24 2012, 12:14
Siberian GRemlin Я так понимаю, ты знаешь способ создания динамичны... Apr 24 2012, 13:16
-=CHE@TER=- Я так понимаю, ты знаешь способ создания динамичны... Apr 24 2012, 15:37
Siberian GRemlin Месяц назад я только договорился с админом и мне в... Apr 24 2012, 15:49
-=CHE@TER=- О, блин, 4-ый PHP это уже здорово, чем вообще ниче... Apr 24 2012, 16:19
-=CHE@TER=- Нашёл в Delphi 7 охрененный косяк, который вынес м... May 30 2012, 10:22
-=CHE@TER=- Все, наверное, помнят, что в .BMP формате строки и... Sep 6 2012, 20:32
jTommy Ради интереса полез в свою "библию" - кн... Sep 8 2012, 20:52
-=CHE@TER=- Ты имеешь ввиду GFF?
Я нашёл там вот такое описани... Sep 9 2012, 12:43
jTommy Да, она самая, издание от 1997 года. Sep 9 2012, 21:25
-=CHE@TER=- Поделюсь двумя вещами.
1) Во-первых, в Delphi 7 к... Dec 15 2012, 09:29
-=CHE@TER=- Товарищи, у меня вопрос - может кто-нибудь помочь?... Apr 6 2013, 18:25
-=CHE@TER=- Нашёл вот такую штуку:
Это из исходных кодов ста... Apr 9 2013, 16:17
-=CHE@TER=- Исходные коды можно нагуглить, могу выложить, если... Apr 18 2013, 16:48
-=CHE@TER=- Я, походу, перестану скоро Delphi пользоваться, во... Apr 27 2013, 15:06
Siberian GRemlin Моя прога по работе использует TTimer и пока пробл... Apr 29 2013, 13:48
-=CHE@TER=- P. S. С получением текста помочь не могу, к сожале... Apr 30 2013, 11:40
-=CHE@TER=- Ну, ладно, пока никто с получением текста не помог... May 1 2013, 11:54
-=CHE@TER=- Сделал себе замечательный srvrun.bat для перезапус... Jun 6 2013, 17:11
Siberian GRemlin Возникла внезапная потребность использовать socks ... Jun 22 2013, 08:06
-=CHE@TER=- Мне не так давно было ещё одно откровение, которым... Jun 28 2013, 11:09
-=CHE@TER=- Часто пишу программы, которые со временем довольно... Sep 14 2013, 14:32
-=CHE@TER=- Пишу в последнее время на Си, так что недавно мне ... Nov 23 2013, 17:38
-=CHE@TER=- Недавно я тут писал про утилиту COMPRESS.EXE, сжим... Nov 27 2013, 15:42
-=CHE@TER=- Натолкнулся на то, что в нескольких играх использу... Feb 13 2014, 14:49![]() ![]() |
| Упрощённая версия | Сейчас: 7th December 2025 - 23:15 |