|
|
| Посл.отвђт | Сообщен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 |