Автор: Анатолий Московский (avm@trais.com.ua)
Имя каталога определяется так:
string ls_AppPath
string ls_FullPath, ls_RevPath
int li_Pos, li_Pos2
// получение полного имени
ClassDefinition lcd
n_dummy_obj u
If IsNull(u) Then u = Create n_dummy_obj // если не autoinstantiated
lcd = u.ClassDefinition
ls_Fullpath = lcd.LibraryName
// выделение имени каталога
ls_RevPath = Reverse(ls_FullPath)
li_pos = Pos( ls_RevPath, "\")
li_pos2 = Pos(ls_RevPath, "/")
If li_pos2 > 0 and li_pos > li_pos2 Then
li_Pos = li_Pos2
End If
If li_pos > 0 Then
ls_AppPath = Left(ls_FullPath, Len(ls_FullPath) - li_pos)
Else
ls_AppPath = "."
End IF
return ls_AppPath
Вместо "n_dummy_obj" можно подставить любой(почти) класс, который
находится в исполняемом модуле. Для того чтобы при компиляции объект
поместился в EXE надо в проекте снять галку в поле "DLL/PBD" напротив
библиотеки с этим объектом.
Хотя если все библиотеки находятся в одном каталоге, можно не заботиться об
этом.
Есть еще и другой вариант (win32):
Описываешь external function:
function long GetModuleFileNameA (long module, ref string path, long length)
library "kernel32.dll"
А потом вызываешь ее:
ls_Fullpath = Space (255)
li_Ret = GetModuleFileNameA (Handle(GetApplication()), ls_FullPath, 255)
Здесь мы имеем полный путь к EXE. Далее разбор пути как показано выше.
Хотя мне больше нравится первый вариант.