Вот подпрограммы, работающие у меня в связке D1 и Win 3.1x:
function LaunchedFromDelphiIDE: Boolean;
{----------------------------------------------------------------}{ Осуществляем проверку запущенности приложения из-под Delphi }{ IDE. Идея взята из сообщения в Delphi-Talk от Ed Salgado }{ из Eminent Domain Software. }{----------------------------------------------------------------}begin
LaunchedFromDelphiIDE := Bool(PrefixSeg) {т.е. не DLL}and
Bool(PWordArray(MemL[DSeg: 36])^[8]);
end; {LaunchedFromDelphiIDE}function DelphiLoaded: Boolean;
{----------------------------------------------------------------}{ Проверяем, загружена ли Delphi. Дает правильные результаты }{ - если вызывающее приложение запущено отдельно, или из-под IDE}{ - если Delphi имеет открытый проект }{ - если Delphi минимизирована. }{ Автор идеи Wade Tatman (wtatman@onramp.net). }{----------------------------------------------------------------}begin
DelphiLoaded := false;
if WindowExists('TPropertyInspector', 'Object Inspector') thenif WindowExists('TMenuBuilder', 'Menu Designer') thenif WindowExists('TAppBuilder', '(AnyName)') thenif WindowExists('TApplication', 'Delphi') thenif WindowExists('TAlignPalette', 'Align') then
DelphiLoaded := true;
end; {DelphiLoaded}function DelphiInstalled: Boolean;
{----------------------------------------------------------------}{ Проверяем наличие Delphi.ini, ищем в нем путь к Библиотеке }{ Компонентов, после чего проверяем ее наличие по этому пути. }{----------------------------------------------------------------}var
IniFile: string;
begin
DelphiInstalled := false;
IniFile := WindowsDirectory + '\Delphi.ini';
if FileExists(IniFile) thenif FileExists(GetIni(IniFile, 'Library', 'ComponentLibrary')) then
DelphiInstalled := true;
end; {DelphiInstalled}
Я уверен, что один из приведенных выше методов вам поможет.Последние две
подпрограммы используют некоторые другие инкапсуляции Windows API и классов
Delphi, и они определены следующим образом:
function WindowExists(WindowClass, WindowName: string): Boolean;
{----------------------------------------------------------------}{ С помощью паскалевских строк проверяем наличие определенного }{ окна. Для поиска только имени окна (WindowName), используем }{ WindowClass '(AnyClass)'; для поиска только класса окна }{ (WindowClass), используем WindowName '(AnyName)'. }{----------------------------------------------------------------}var
PWindowClass, PWindowName: PChar;
AWindowClass, AWindowName: array[0..63] of Char;
beginif WindowClass = '(AnyClass)' then
PWindowClass := nilelse
PWindowClass := StrPCopy(PChar(@AWindowClass), WindowClass);
if WindowName = '(AnyName)' then
PWindowName := nilelse
PWindowName := StrPCopy(PChar(@AWindowName), WindowName);
if FindWindow(PWindowClass, PWindowName) <> 0 then
WindowExists := trueelse
WindowExists := false;
end; {WindowExists}function WindowsDirectory: string;
{----------------------------------------------------------------}{ Возвращаем путь к каталогу Windows (без обратной косой черты) }{----------------------------------------------------------------}const
BufferSize = 144;
var
ABuffer: array[0..BufferSize] of Char;
beginif GetWindowsDirectory(PChar(@ABuffer), BufferSize) = 0 then
WindowsDirectory := ''
else
WindowsDirectory := StrPas(PChar(@ABuffer));
end; {WindowsDirectory}function GetIni(const IniFile, Section, Entry: string): string;
{----------------------------------------------------------------}{ Получаем инициализационную 'profile' строку из определенного }{ пункта (Entry) определенной секции [Section] определенного }{ INI-файла (дополняем '.ini', если отсутствует). Возвращаем }{ нулевую строку, если IniFile, Section или Entry не найден. }{----------------------------------------------------------------}var
IniFileVar: string;
IniFileObj: TIniFile;
beginif StrEndsWith(IniFile, '.ini') then
IniFileVar := IniFile
else
IniFileVar := IniFile + '.ini';
IniFileObj := TIniFile.Create(IniFileVar);
GetIni := IniFileObj.ReadString(Section, Entry, '');
IniFileObj.Free;
end; {GetIni}
Перевод контента на русский язык:
Вы используете несколько функций в Delphi, чтобы проверить, запущено ли приложение из IDE Delphi, если Delphi загружен и если Delphi установлен.
Вот подробное описание каждой функции:
1. LaunchedFromDelphiIDE: эта функция проверяет, запущено ли приложение из IDE Delphi, смотрит на префиксный сегмент и проверяет, не является ли это DLL.
2. DelphiLoaded: эта функция проверяет, загружен ли Delphi, поиска специальных классов окон, которые обычно присутствуют, когда Delphi запущен (например, "TPropertyInspector", "TMenuBuilder" и т.д.). Если какие-либо из этих окон найдены, функция возвращает True.
3. DelphiInstalled: эта функция проверяет, установлен ли Delphi, смотрит на файл под названием "Delphi.ini" в директории Windows и проверяет, содержит ли он путь к библиотеке компонентов.
Функция WindowExists используется функцией DelphiLoaded, чтобы поискать специальные классы окон, а функция WindowsDirectory возвращает путь к директории Windows. Функция GetIni читает значение из файла INI.
В целом, эти функции seem полезны для определения запуска приложения из Delphi или установки/загрузки Delphi.
Некоторые предложения:
Вы можете рассмотреть более надежный способ проверки загруженности Delphi, например, поиск специальных регистрационных ключей или файлов.
Если вы планируете использовать эти функции в нескольких местах, вам может быть полезно упаковать их в отдельный класс или модуль для удобства повторного использования и обслуживания.
Рассмотрите добавление обработки ошибок в свои функции, если они могут неудачно выполниться (например, если файл INI отсутствует или повреждён).
В отношении альтернативных решений есть несколько идей:
Вместо использования WindowExists, вы могли бы использовать функцию FindWindowEx для поиска окон с конкретными именами классов или текстом окна.
Вы также можете использовать функцию SHGetSpecialPath для получения пути к директории Windows вместо жесткого кодирования.
Если вам нужно более надежное решение для проверки установки Delphi, вы можете рассмотреть использование функции RegKeyExists для поиска специальных регистрационных ключей или значений.
Пожалуйста, дайте мне знать, если у вас есть какие-либо конкретные вопросы о этих функциях или если вам нужно что-то другое!
В статье описаны три функции для проверки запущенности приложения из-под Delphi IDE, наличия Delphi и его установки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.