powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Путь к каталогу, откуда запустили данное приложение, нужен
16 сообщений из 16, страница 1 из 1
Путь к каталогу, откуда запустили данное приложение, нужен
    #32233086
Kaban16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, вопрос: Как определить внутри приложения каталог, из которого это приложение запустили? Приложение на PB, надо в момент выполнения знать, из какого каталога его запустили. Например, лежит приложение в каталоге C:\Progra~1\MyApp\, после запуска надо, чтобы приложение знало, что оно запущено из каталога C:\Progra~1\MyApp\ ... WinAPI-шные функции не предлагать, т.к. они разные для разных виндов, и тогда встанет проблема определения версии виндов и т.д.
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32233126
Механик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Определение откуда работает в PFC:

n_cst_filesrv lnv_filesrv

f_SetFileSrv(lnv_filesrv, TRUE)
is_runfromdirectoty = lnv_filesrv.of_GetCurrentDirectory ()
f_SetFileSrv(lnv_filesrv, FALSE)
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32233129
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего сложного - функция GetLibraryList() возвращает все библиотеки с описанием их путей, по библиотеке, в которой лежит Application и можно определить путь запущенного приложения.

Приведу свою реализацию.

Функция f_StrToArray - используется для перевода стрингового списка значений с разделителем в массив значений:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
global type f_strtoarray from function_object
end type

forward prototypes
global function integer f_strtoarray (string value, character divchar, ref string result[])
end prototypes

global function integer f_strtoarray (string value, character divchar, ref string result[]); /*************************************************************
Description:
------------
  Converting string with list values from div char to string array

Return value:
-------------
  Count items from array

Revision history:
-----------------
  1.0  Initial version
*************************************************************/ 
string l[]
result = l

if Len( value ) =  0  then
  return  0 
end if

int b, p, c, w
p =  1 
c =  0 
w = Len( divChar )
b = Pos( value, divChar,  1  )
do while b >  0 
  c++
  l[c] = Mid( value, p, b - p)
  p = b + w
  b = Pos( value, divChar, p)
loop

if p <= Len( value ) then
  c++
  l[c] = Mid( value, p )
end if

result = l

return c
end function


Собственно сама функция f_GetLibraryPath, возвращающая путь к указанной библиотеке:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
global type f_librarypath from function_object
end type

forward prototypes
global function string f_librarypath (string libraryname)
end prototypes

global function string f_librarypath (string libraryname); /*************************************************************
Description:
------------
  Return path from library

Return value:
-------------
  Path from library or NULL if library in library list not found

Revision history:
-----------------
  1.0  Initial version
*************************************************************/ 

string s
SetNull( s )

if Len( libraryName ) =  0  then
  return s
end if

libraryName = '\' + Lower( Trim( libraryName ) )

string libs[]
int c, p, i
c = f_StrToArray( GetLibraryList(), ',', libs )

for i =  1  to c
  p = LastPos( Lower( libs[i]), libraryName )
  if p >  0  then
    return Mid( libs[i],  1 , p -  1  )
  end if
end for

return s
end function


Пример использования:
Код: plaintext
MessageBox( 'Path', f_LibraryPath( 'asc_system.pbl' ) )


Исходники содраны с source глобальных функций, так что их спокойно можно мигрировать в PB.
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32233274
Sergey Schwarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор: Анатолий Московский (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. Далее разбор пути как показано выше.

Хотя мне больше нравится первый вариант.
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32233435
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот откуда вот это бредятное :-) WinAPI-шные функции не предлагать, т.к. они разные для разных виндов взялось?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getmodulefilename.asp

The GetModuleFileName function retrieves the fully qualified path for the specified module.

Requirements
Client: Included in Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, and Windows 95.
Server: Included in Windows Server 2003, Windows 2000 Server, and Windows NT Server.
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32233615
Фотография DenisVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полностью потдерживаю Филиппа!
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32235413
KOLCHOZ_POSTEVENT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поставь первым оператором в open event объекта аппликации
messagebox("",getcurrentdirectory())
и узнаешь откуда стартовал...
Проверено.
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32238641
Kaban16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Филипп
Филипп, из какой библиотеки функция GetModuleFileNameA ? Не из kernel32.dll ли ? И почему это при обращении к функции GetModuleFileNameA в 98-х виндах я получаю ругань? (Сейчас под рукой 98-х нет, проверить и точно сказать, какая ругань, не могу, надо дома проверить, но смысл ругани - не могу загрузить dll или вызвать из нее функцию, точно не помню). В NT, 2K, XP - без проблем. Вот только клиент норовит поставить приложение под те винды, которые у него есть, и сильно не хочет менять на другие...
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32238661
Kaban16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Московский (avm@trais.com.ua) (Выход с логина Sergey Schwarz) !

В какой версии PB появился тип ClassDefinition ? В 6.5 его не обнаружено... Или надо подключать PFC?
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32238683
Kaban16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS ! В какой версии PB появилась функция GetLibraryList() ? В PB 6.5 такой красивой штуки нет... ИМХО, впервые она появляется только в версии 7.0, да?
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32238706
Kaban16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KOLCHOZ_POSTEVENT! И тот же вопрос к Вам: ф-ция getcurrentdirectory() живет в KERNEL32.DLL? Объявление такое?

Function ulong GetCurrentDirectory (ulong nBufferLength, ref string lpBuffer) Library "KERNEL32.DLL" Alias for "GetCurrentDirectoryA"

Тогда где же параметры? Или есть билдерная прокладка, делающая подстановку параметров?

Или это какая-то билдеровская функция? Тогда в какой версии она появилась? В 6.5 ее нет...
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32238753
KOLCHOZ_POSTEVENT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это родная Powerbuilder функция из 8 версии.
У меня уже нет горячо любимой шестерки.
Дайте немножко подумать.
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32238874
KOLCHOZ_POSTEVENT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значится так,докладываю,что проверено и что отработало.
Делается вшивый bat файл c:\katalog.bat с таким содержанием
dir >c:\katalog.txt

Первой выполняемой командой поставлена
run("c:\katalog.bat")
Четвертой строкой в c:\katalog.txt искомый маршрут.
Kак вы его потянете,последовательным чтением или importfile в datawindow-ваши дела.
Должен сказать ,что на восьмерке run иногда капризулит,на шестерке за ним это не водилось.
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32238909
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Kaban16
А может, если уж в 98-х виндах проблемы, определить окружение (т.е., версию Windows)?
GetEnvironment, OSType, OSFixesRevision, OSMajorRevision, OSMinorRevision - вот эти слова должны помочь :-)
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32239666
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kaban16 , декларация приблизительно такая же как вам сообщил Sergey Schwarz ещё 11 августа, работает на ВСЕХ клиентах упомянутых в Майкрософтовской доке:

Function ulong GetModuleFileName (ulong hinstModule, ref string lpszPath, ulong cchPath ) Library "KERNEL32.DLL" Alias for "GetModuleFileNameA"
...
Рейтинг: 0 / 0
Путь к каталогу, откуда запустили данное приложение, нужен
    #32239667
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kaban16 , ClassDefinition появился в Powerbuilder 6.0, куда вы там смотрите?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Путь к каталогу, откуда запустили данное приложение, нужен
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]