Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Путь к каталогу, откуда запустили данное приложение, нужен / 16 сообщений из 16, страница 1 из 1
11.08.2003, 16:43
    #32233086
Kaban16
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к каталогу, откуда запустили данное приложение, нужен
Народ, вопрос: Как определить внутри приложения каталог, из которого это приложение запустили? Приложение на PB, надо в момент выполнения знать, из какого каталога его запустили. Например, лежит приложение в каталоге C:\Progra~1\MyApp\, после запуска надо, чтобы приложение знало, что оно запущено из каталога C:\Progra~1\MyApp\ ... WinAPI-шные функции не предлагать, т.к. они разные для разных виндов, и тогда встанет проблема определения версии виндов и т.д.
...
Рейтинг: 0 / 0
11.08.2003, 17:08
    #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
11.08.2003, 17:08
    #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
11.08.2003, 18:37
    #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
12.08.2003, 00:41
    #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
12.08.2003, 10:00
    #32233615
DenisVK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к каталогу, откуда запустили данное приложение, нужен
Полностью потдерживаю Филиппа!
...
Рейтинг: 0 / 0
13.08.2003, 14:28
    #32235413
KOLCHOZ_POSTEVENT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к каталогу, откуда запустили данное приложение, нужен
Поставь первым оператором в open event объекта аппликации
messagebox("",getcurrentdirectory())
и узнаешь откуда стартовал...
Проверено.
...
Рейтинг: 0 / 0
18.08.2003, 10:32
    #32238641
Kaban16
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к каталогу, откуда запустили данное приложение, нужен
2 Филипп
Филипп, из какой библиотеки функция GetModuleFileNameA ? Не из kernel32.dll ли ? И почему это при обращении к функции GetModuleFileNameA в 98-х виндах я получаю ругань? (Сейчас под рукой 98-х нет, проверить и точно сказать, какая ругань, не могу, надо дома проверить, но смысл ругани - не могу загрузить dll или вызвать из нее функцию, точно не помню). В NT, 2K, XP - без проблем. Вот только клиент норовит поставить приложение под те винды, которые у него есть, и сильно не хочет менять на другие...
...
Рейтинг: 0 / 0
18.08.2003, 10:43
    #32238661
Kaban16
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к каталогу, откуда запустили данное приложение, нужен
Анатолий Московский (avm@trais.com.ua) (Выход с логина Sergey Schwarz) !

В какой версии PB появился тип ClassDefinition ? В 6.5 его не обнаружено... Или надо подключать PFC?
...
Рейтинг: 0 / 0
18.08.2003, 11:00
    #32238683
Kaban16
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к каталогу, откуда запустили данное приложение, нужен
ASCRUS ! В какой версии PB появилась функция GetLibraryList() ? В PB 6.5 такой красивой штуки нет... ИМХО, впервые она появляется только в версии 7.0, да?
...
Рейтинг: 0 / 0
18.08.2003, 11:14
    #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
18.08.2003, 11:41
    #32238753
KOLCHOZ_POSTEVENT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к каталогу, откуда запустили данное приложение, нужен
Это родная Powerbuilder функция из 8 версии.
У меня уже нет горячо любимой шестерки.
Дайте немножко подумать.
...
Рейтинг: 0 / 0
18.08.2003, 12:45
    #32238874
KOLCHOZ_POSTEVENT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к каталогу, откуда запустили данное приложение, нужен
Значится так,докладываю,что проверено и что отработало.
Делается вшивый bat файл c:\katalog.bat с таким содержанием
dir >c:\katalog.txt

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

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


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