· Начало · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› Каталог программы

Посл.отвђт Сообщенiе


Дата: Июн 8, 2004 16:11:08

Здрасти всем!
Есть программа "PROGA.EXE". Она будет лежать в какой-нибудь папке. Как из этой программы узнать, где она находится.


Дата: Июн 8, 2004 16:14:21

нулевой аргмент командной строки. если каталог не указан, читаем текущий.


Дата: Июн 8, 2004 16:30:10

А научным языком?


Дата: Июн 8, 2004 16:40:08

GetCommandLine возвращает указатель на командную строку, начинающуюся с имени приложения (в си-программах для этого можно юзать argv[0]);
имя может быть как полным (с путем), так и без пути. если пути опаньки (а наличие пути определяется по наличию слеш, который может быть как левосторонним, так и правосторонним, NT - это вам не 9x), тогда мы вызываем GetCurrentDirectory.


Дата: Июн 8, 2004 16:49:18

GetModuleFileName


Дата: Июн 8, 2004 16:59:31

А если такая штука:
В командере (тотальном, виндовом) из папки C:\Windows набрать C:\Programs\Asm\Proga\Proga.exe, то GetCurrentDirectory возвращает "C:\Windows", хотя надо получить "C:\Programs\Asm\Proga".


Дата: Июн 8, 2004 17:11:38 · Поправил: The Svin

GetAppPath proc lpPathBuffer:DWORD

    invoke GetModuleFileName,0,lpPathBuffer,128  ; return length in eax

    mov ecx,lpPathBuffer
    lea ecx,[ecx+eax-6]                 ; add length to ecx - 6

  ; -----------------------------------------
  ; read backwards until first "\" character
  ; -----------------------------------------

  @@:
    mov al,[ecx]                        ; load byte at address in ECX
    dec ecx                             ; dec ECX
    cmp al,'\'                          ; compare if "\"
    jne @B                              ; jump back to @@: if not "\"

    mov byte ptr [ecx+2],0              ; write zero terminator after "\"

    ret

GetAppPath endp


Дата: Июн 8, 2004 17:16:49

> GetModuleFileName
не юзабельно, слишком много аргументов и вообще... мой метод проще ;)

> В командере (тотальном, виндовом) из папки C:\Windows набрать C:\Programs\Asm\Proga\Proga.exe, то
> GetCurrentDirectory возвращает "C:\Windows", хотя надо получить "C:\Programs\Asm\Proga".
еше раз - сначала смотришь в commandline, затем в getcurdir, ну и...


Дата: Июн 8, 2004 17:21:38 · Поправил: don_dampster

The Svin:
Пережевал и положил в рот.

Спасибо (за угощенье).


Дата: Июн 8, 2004 17:56:04

kaspersky
Понимал бы что в колбасных обрезках :)
Шутка юмора.
Если серьёзно:
Не только не проще твой метод - он вообще может не сработать. Ты просто неучитываешь как попадает в определённое место эта самая командная строка.

Доказательство несостоятельности метода Касперски:
Без дебагера и прочего.
Пишем простую прогу:
start:
	invoke GetCommandLine
	invoke MessageBox,0,eax,eax,0
	call ExitProcess	
	end start


Она показывает командную строку как все поняли.
Если мы кликнем на проге в каком-нить Экплорере то увидим
полное имя файла. Кто запустил прогу Эксплорер. Прочитал объект, взял полное имя файловое объекта и через CreateProcess и куда этот криейт дальше прыгает создал процесс, и вот при вызове криейта он это самое имя передал как командную строку создания процесса.
Теперь попробуем запустить это иначе.
Например в Far в NT 4.0 я захожу в директорию и просто набираю "имяпроги" (без пути)
Опа что же видим:
видим одно имя проги в боксе и нифига больше.
Кто ленив - вот простая программка.
Зайдите в каталог в которой её сохранили, и просто наберите в командной строке Фара msgline и нажмите Enter.
Я вижу MessageBox с надписью 'msglin' и больше ни фига - ни пути ни даже буковок '.exe'

Почему он не проще даже если бы срабатывал нужно доказывать или замнём?


_1836936__msgline.rar