Работа с путями в Delphi XE8: получение полного пути DLL-библиотеки
При разработке программ на языке Delphi часто возникает необходимость работы с путями к файлам, в том числе и с путями к DLL-библиотекам. В некоторых случаях, когда используется функция GetModuleFileName, может возвращаться сокращенный путь к файлу, что может быть неприемлемо для дальнейшей работы с этим путем.
Проблема с получением полного пути
При компиляции COM-объекта в Delphi XE8 64-битной версии с использованием следующего кода:
function TUtility.GetDLLPath: WideString;
var
Buffer: array [0 .. C_MAX_PATH_LEN] of char;
begin
GetModuleFileName(hInstance, Buffer, Length(Buffer));
Result := Buffer;
end;
при вызове из VBScript получаем путь в сокращенном виде:
C:\PROGRA~2\XYZ\AAABBB~1\64\Tools.dll
Решение проблемы
Для получения полного пути к файлу необходимо использовать функцию GetLongPathName. Это связано с тем, что GetModuleFileName возвращает путь в том формате, в котором модуль был загружен, и может использовать как короткое, так и длинное имя файла, а также префикс "\?\".
Пример использования GetLongPathName
Вот пример функции, которая принимает сокращенный путь и возвращает полный:
function LongPathName(const ShortPathName: string): string;
var
Retval: DWORD;
Buff: array [0..MAX_PATH-1] of Char;
begin
Retval := GetLongPathName(PChar(ShortPathName), Buff, Length(Buff));
Win32Check(Retval <> 0);
Result := Buff;
end;
Обратите внимание, что функция GetLongPathName возвращает количество символов в полном пути, включая завершающий нулевой символ, если оно помещается в буфер указанного размера.
Возможные проблемы и их решения
Если функция GetLongPathName не работает в среде Delphi D2007, возможно, вы пропустили указание соглашения о вызовах. Необходимо добавить stdcall; перед external.... Также важно использовать правильное имя функции: GetLongPathNameA для ANSI-версии или Unicode-версию, если вы работаете с WideString.
Заключение
Для получения полного пути к DLL-библиотеке в Delphi XE8 следует использовать функцию GetLongPathName, которая позволит избежать проблем, связанных с сокращенными путями. Пример кода выше демонстрирует, как можно реализовать такую функцию на Object Pascal.
Описание контекста: При работе с путями к DLL-библиотекам в Delphi XE8 для получения полного пути необходимо использовать функцию `GetLongPathName`, так как `GetModuleFileName` может возвращать сокращенный путь.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.