uses Windows;
procedure ShowDllPath stdcall;
var
TheFileName: array[0..MAX_PATH] of char;
begin
FillChar(TheFileName, sizeof(TheFileName), #0);
GetModuleFileName(hInstance, TheFileName, sizeof(TheFileName));
MessageBox(0, TheFileName, 'The DLL file name is:', mb_ok);
end;
Here's the translation of the text into Russian:
Дельфийский вопрос!
Да, можно безусловно определить полный путь и имя DLL изнутри самой DLL с помощью функции GetModuleFileName.
В вашем коде вы уже делаете это правильно. Вот разбивка:
1. Вы объявляете переменную TheFileName как массив символов с максимальной длиной MAX_PATH.
2. Вы инициализируете весь массив нулями (FillChar) для обеспечения того, что он начинается с всех нулей.
3. Вы вызываете функцию GetModuleFileName с тремя аргументами:
* hInstance: Это.handle DLL herself, который можно получить с помощью функции GetModuleHandle или передавая nil (что вернет handle текущего процесса).
* TheFileName: Буфер, в котором вы хотите хранить полный путь и имя DLL.
* sizeof(TheFileName): Максимальная длина буфера, которая используется для определения количества символов, которые нужно прочитать из файла DLL.
Повторяю вызов GetModuleFileName, вы спрашиваете Windows заполнить буфер полным путем и именем DLL. В этом случае, поскольку вы передали hInstance (который является handle DLL), Windows вернет путь и имя самой DLL.
Наконец, вы отображаете содержимое TheFileName с помощью MessageBox.
Таким образом, чтобы ответить на ваш вопрос, да, возможно определить полный путь и имя DLL изнутри самой DLL. Ваши код делает именно это! 👏
Если я бы предложил альтернативное решение, я сказал бы, что вы также можете использовать функцию GetModuleFileNameEx вместо GetModuleFileName. Последняя является устаревшей и может не работать на всех версиях Windows.
Вот пример использования GetModuleFileNameEx:
uses Windows;
...
procedure ShowDllPath stdcall;
var
TheFileName: array[0..MAX_PATH] of char;
begin
FillChar(TheFileName, sizeof(TheFileName), #0);
GetModuleFileNameEx(hInstance, nil, TheFileName, sizeof(TheFileName));
MessageBox(0, TheFileName, 'The DLL file name is:', mb_ok);
end;
В этом примере я передаю nil как второй аргумент GetModuleFileNameEx, что означает "получить путь модуля самого себя". Остальная часть кода остается той же. 👍
В статье описывается способ определения полного пути и имени файла запущенной DLL из самой DLL с помощью функции GetModuleFileName.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.