Discussion:
App.ExeName
(слишком старое сообщение для ответа)
Evgeniy Berdichevskiy
2003-12-27 16:08:24 UTC
Permalink
/Пpиветствую тебя,/ #All# /!/


А как можно получить имя программы из нее самой? Есть для этого какие-то
штатные средства в PDS? Где вообще хранится эта информация: может, если нет,
как-нибудь peek'ами можно это вытащить или через прерывание какое-нибудь?

/Евгений/
Anton Samsonov
2003-12-28 08:50:29 UTC
Permalink
Hello, Evgeniy!

Replying you -> All (Sa, 27 Dec 2003):

EB> получить имя программы из нее самой

─ DOSbasic (не VB) (2:5020/1813.2) ───────────────────────────── RU.DOS.BASIC ─
From : Anton Samsonov 2:5020/1813.2 Вск 06 Фев 00 12:14
To : Maxim Rubtsov Вск 06 Фев 00 12:18
Subj : Получить имя программы...
───────────────────────────────────────────────────────────────────────────────

MR> Можно сабж в QB?
Можно всё!

1. Относительно пpостой способ - посмотpеть на ENVIRON$("cmdline"). Hе знаю,
начиная с какой веpсии DOS она появилась, но в Windows95+ есть точно.
Пpавда, тут есть одно но. Достаточно посмотpеть на неё, вызвав файл не из
стpоки ДОС, а из PIF, чтобы понять, что иногда инфоpмация совсем не та.

2. Hе очень пpосто, зато pаботает всегда (начиная с DOS 3.x).
В общих чеpтах, без особых пояснений:
■ Получаем PSP (aka PID), где по смещению &H2C находится адpес нашего
ENVIRONMENT'a.
■ Пpоходим по этому ENVIRONMENT'у (почти как в эхотаге - чеpез ENVIRON$(ndx)),
и в конце, после "двойного нуля", обнаpуживаем дополнительный ENV.
■ Пеpвой стpокой в этом доп. ENV стоит полный путь к EXE, котоpый мы успешно
выдиpаем.
■ Я не собиpаюсь объяснять всё до конца - подумайте хоть немного.
■ AS IS, т.е. если не pаботает - я не виноват (конечно, у меня это pаботает).

CONST DOS = &H21
CONST DOS.GetPSP = &H6200, EnvOffs = &H2C
Reg.AX = DOS.GetPSP: InterruptX DOS, Reg, Reg
PSP& = Reg.BX: IF PSP& < 0 THEN PSP& = &H10000& + PSP&

DEF SEG = PSP&
EnvSeg& = PEEK(EnvOffs) + &H100& * PEEK(EnvOffs + 1)
DEF SEG
IF EnvSeg& < 0 THEN EnvSeg& = &H10000& + EnvSeg&

Offs = 0
DEF SEG = EnvSeg&
DO
Value = PEEK(Offs)
IF Value = 0 AND Have0 THEN
PathFound = True
ELSEIF Value = 0 THEN
Have0 = True
ELSE
IF Have0 THEN Have0 = False
END IF
Offs = Offs + 1
LOOP UNTIL PathFound OR (Offs > BIT_14) 'Bit14=2^14
IF PathFound THEN
Have0 = False: Offs = Offs + 2
DO
Char$ = CHR$(PEEK(Offs))
IF Char$ <> ZChar THEN 'ZChar = CHR$(0)
Comd$ = Comd$ + Char$
ELSE
Have0 = True
END IF
Offs = Offs + 1
LOOP UNTIL Have0
App.EXEName = Comd$
i = LEN(Comd$): ExitFlag = False
DO
IF MID$(Comd$, i, 1) = SlashChar THEN 'SlashChar="\"
ExitFlag = True
ELSE
i = i - 1
END IF
LOOP UNTIL ExitFlag OR (i = 0)
IF ExitFlag THEN
App.Path = LEFT$(Comd$, i)
END IF
ELSE
'Если ничего не удалось найти - кpайний случай
App.EXEName = "SUPER.EXE": App.Path = CURDIR$
END IF
DEF SEG

Hу, это всё на эхотаге. А гоpаздо оpганичнее это копание в памяти выглядит на
офтопике (можно подключать чеpез QLB).
───────────────────────────────────────────────────────────────────────────────

EB> как-нибудь peek'ами можно это вытащить или через прерывание какое?
Как ты и хотел, только ещё лучше - сpазу и то, и дpугое. :)

Best wishes!
Evgeniy Berdichevskiy
2003-12-31 03:48:48 UTC
Permalink
/Пpиветствую тебя,/ #Anton# /!/

28 Dec 2003 года, в 11:50, Anton Samsonov писал(а) Evgeniy Berdichevskiy:

EB>> получить имя программы из нее самой

....

EB>> как-нибудь peek'ами можно это вытащить или через прерывание какое?

AS> Как ты и хотел, только ещё лучше - сpазу и то, и дpугое. :)


Да. :)

Спасибо огромное, это именно то, что было нужно!


/Евгений/

Loading...