![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не понимаЮ. почему не работает GetModuleFileNameA
@!!ex © (2008-07-30 23:13:00)
Inst:=GetWindowLong(Wnd,GWL_HINSTANCE);
GetModuleFileNameA(Inst,PChar(Path),256);
Wnd - окно, чей экзешник надо найти.
Path ВСЕГДА содержит путь к программе, где этот код выполняется.
ПОЧЕМУ???
@!!ex (2008-07-31 10:31:00) [1]> [15] Игорь Шевченко © (31.07.08 09:52)
http://www.delphimaster.ru/cgi-bin/forum.pl?n=18&id=1217424279
Пост номер 15.
> В-третьих, использование psapi для получения пути своего
> же
> приложения, которое способно просто сообщить свой путь -
> уподоблю батонокидательству.
чем меньше делает отлаживаемое приложение - тем лучше.
В идеале оно вообще не должно знать ничего об отладке, но идел - не достижим.
Leonid Troyanovsky (2008-07-31 10:29:00) [2]
> Anatoly Podgoretsky © (31.07.08 10:22) [17]
> Ты про кактус?
Ага.
--
Regards, LVT.
Игорь Шевченко (2008-07-31 10:27:00) [3]Leonid Troyanovsky © (31.07.08 10:13) [16]
> Per aspera ad astra.
Скорее, per rectum
Anatoly Podgoretsky (2008-07-31 10:22:00) [4]
> Leonid Troyanovsky © (31.07.08 10:13) [16]
Ты про кактус?
Leonid Troyanovsky (2008-07-31 10:13:00) [5]
> Игорь Шевченко © (31.07.08 09:52) [15]
> автор, тебе чего вообще надо ? :)
Per aspera ad astra.
--
Regards, LVT.
Игорь Шевченко (2008-07-31 09:52:00) [6]автор, тебе чего вообще надо ? :)
Leonid Troyanovsky (2008-07-31 09:09:00) [7]
> @!!ex © (31.07.08 08:33) [13]
> Почему?
Во-первых, кривой.
Во-вторых, в нем нет нужды.
В-третьих, использование psapi для получения пути своего же
приложения, которое способно просто сообщить свой путь -
уподоблю батонокидательству.
--
Regards, LVT.
@!!ex (2008-07-31 08:33:00) [8]> [12] Leonid Troyanovsky © (31.07.08 07:57)
Почему?
Leonid Troyanovsky (2008-07-31 07:57:00) [9]
> @!!ex © (30.07.08 23:56) [9]
> Нашел код в инете.
В печь его.
--
Regards, LVT.
Leonid Troyanovsky (2008-07-31 07:51:00) [10]
> @!!ex © (30.07.08 23:49) [6]
> В Msg.wParam - Хэндл процесса. Он в сообщении посылает свой
> хэндл. Поулчает его через GetCurrentProcessId();
Извращенец.
Во-первых, это не хендл.
Во-вторых, для передачи хендла необходима DuplicateHandle.
А, в-третьих, проще послать искомый путь WM_COPYDATA.
--
Regards, LVT.
Loginov Dmitry (2008-07-30 23:59:00) [11]Тока $400000 замени на 0, так вернее будет (мало ли у кого какой baseaddress)
И размер буфера увеличь ;)
@!!ex (2008-07-30 23:56:00) [12]> [7] Alucard (30.07.08 23:53)
Я в курсе про буффер.
> [8] Loginov Dmitry © (30.07.08 23:54)
Да. Обе проги я пишу.
Нашел код в инете. Сделал. Вроде работает.
GetWindowThreadProcessId(Msg.wParam, @dwID);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, dwID);
GetModuleFileNameEx (hProcess, HMODULE($400000), PChar(Path),256);
CloseHandle (hProcess);
wParam - Хэндл окна.
Loginov Dmitry (2008-07-30 23:54:00) [13]> В Msg.wParam - Хэндл процесса. Он в сообщении посылает свой
> хэндл. Поулчает его через GetCurrentProcessId();
Это сторонняя программа такое вытворяет? ;)
Alucard (2008-07-30 23:53:00) [14]Можно использовать GetProcessImageFileName.
При получении строк из функций WinApi обычно требуется использовать уже выделенный буфер. Проще всего в данном случае использовать String в сочетании с SetLength и последующим приведением к PChar.
@!!ex (2008-07-30 23:49:00) [15]GetModuleFileNameEx(Msg.wParam,0,PChar(Path),256);
В Msg.wParam - Хэндл процесса. Он в сообщении посылает свой хэндл. Поулчает его через GetCurrentProcessId();
@!!ex (2008-07-30 23:39:00) [16]Как я понимаю, должна помочь:
GetModuleFileNameEx
Но при ее использовании я получаю на выходе пустую строку..
Loginov Dmitry (2008-07-30 23:28:00) [17]То, что GetWindowLong() возвращает адрес модуля в чужом адресном пространстве - по сути бесполезно, если конечно не баловаться внедрением туда своей DLL.
@!!ex (2008-07-30 23:28:00) [18]Мда... И как я пропустил, когда первый раз читал??
The GetModuleFileName function retrieves the fully-qualified path for the file that contains the specified module that the current process owns.
GetModuleFileName operates only on modules that the current process owns. To specify modules that belong to another process, use the GetModuleFileNameEx function.
@!!ex (2008-07-30 23:27:00) [19]> [1] Loginov Dmitry © (30.07.08 23:24)
Хм. Понятно. А как тогда узнать путь к ехешке чужого процесса?
Loginov Dmitry (2008-07-30 23:24:00) [20]> Path ВСЕГДА содержит путь к программе, где этот код выполняется.
>
> ПОЧЕМУ???
HINSTANCE - это адрес модуля в адресном пространстве текущего процесса. Естественно, GetModuleFileNameA() ищет только там, откуда ее вызывали.