Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];




Вниз

Путь к исполняемому файлу 


Turalyon   (2002-02-07 10:54) [0]

Помогите пожалуйста.
Проблемма след. Зная хендел окна, необходимо получить полный путь к файлу, который запустил процесс, из которого в свою очередь и получается окно....

В Хелпе по SDK я нашел (точнее подсказали) функцию ... GetModuleFileName у нее 3 параметра второй и третий мне понятны, а вот первый...

DWORD GetModuleFileName(
HMODULE hModule, // handle to module to find filename for
LPTSTR lpFilename, // pointer to buffer for module path
DWORD nSize // size of buffer, in characters
)

Что есть хендл модуля??? И как его получить, зная хендл окна? Заранее спасибо.



VuDZ   (2002-02-07 12:33) [1]

HINSTANCE hIns = GetWindowLong(hwnd, GWL_HINSTANCE);



VuDZ   (2002-02-07 12:34) [2]

HINSTANCE то же самое что и HMODULE



Turalyon   (2002-02-07 14:17) [3]

Спасибо, все понял, только я вот чего не понял. Может я чего то не понимаю....

Проедура прохода по всем окнам и вывода в Memo названия окон, и пути к файлам, которые создали процесс, который их создал

var text ,ProcPath : String;

function EnumProc (Handle: HWnd; Param: LongInt): Boolean; stdcall;
var MInstance : LongWord;
begin
if (GetParent (Handle) = 0) and (not IsIconic (Handle)) and (IsWindowVisible (Handle))
then
begin
GetWindowText(handle, PChar(text), Length(text));
Form1.Memo1.Lines.Add( text );

MInstance := GetWindowLong(Handle, GWL_HINSTANCE);
GetModuleFileName( MInstance , PChar(ProcPath), 200);

/// GetWindowModuleFileName(Handle, PChar(ProcPath), 200);
/// С этой функцией тоже не хочет...

Form1.Memo1.Lines.Add( ProcPath );
end;
EnumProc := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var text : string;
mh : HWnd;
begin
setlength(mtxt,200);
setlength(ProcPath,200);
Memo1.Lines.Clear;
EnumWindows (@EnumProc, 0);
end;

Я понимаю так что в месте где используется функция GetModuleFileName должен выводится имя и путь к экзешнику, запустишему окно??? Мне же выдает константой путь к моей собственной программе. Объясните пожалуйста в чем проблемма



VuDZ   (2002-02-07 14:53) [4]

извени, я ошибся, а в MSDN это не оговорено. что GetModuleFileName() возвращает имя модуля для _вызвавшего_ процесса - ты можешь узнать имя своего exe, всех dll которые загрузил но ничего более.
Но! есть выход GetModuleFileNameEx() делает то, что и надо:

#include <Windows.h>
#include <stdio.h>
#include <conio.h>
#include "psapi.h"

BOOL CALLBACK EnumWindowsProc(
HWND hwnd, // handle to parent window
LPARAM lParam // application-defined value
)
{
LPSTR lpStr = new char[MAX_PATH];
ZeroMemory(lpStr, MAX_PATH);
DWORD dwPID;
GetWindowThreadProcessId(hwnd, &dwPID);
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
GetModuleFileNameEx(hProc, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), lpStr, MAX_PATH);
if (lpStr[0] != "\0")
{
printf(lpStr);
printf("\n");
}
return TRUE;
}

void main ()
{
EnumWindows(EnumWindowsProc, NULL);
getch();
}



Turalyon   (2002-02-07 15:31) [5]

GetModuleFileNameEx В MSDN написано что функция не поддерживается в W95/98/Me... А мне надо именно для них.



Turalyon   (2002-02-07 15:35) [6]

Из MSDN ....

GetModuleFileName
This function gets a module file name.

WINAPI DWORD GetModuleFileName(
HMODULE hModule,
LPWSTR lpFilename,
DWORD nSize
);
Parameters
hModule
[in] Handle to the module whose executable file name is being requested. If this parameter is NULL, GetModuleFileName returns the path for the file used to create the calling process.
lpFilename
[out] Pointer to a buffer that is filled in with the path and file name of the given module.
nSize
[in] Specifies the length, in characters, of the lpFilename buffer. If the length of the path and file name exceeds this limit, the string is truncated

То есть по идее она должна возвращать как раз то что надо, и только если параметр NULL тогда путь модуля, который вызвал эту процедуру....



VuDZ   (2002-02-07 15:57) [7]

идея - весч хорошая, но ей не прокормишь и собаку....

а зачем тогды написал win2K? я с win9x не работаю и софта под неё специально не пишу...
так что тогда юзай ToolHelp - Module32First() то, что надо...



Turalyon   (2002-02-07 16:16) [8]

Ок. Спасиб за помощь.... Но меня уже просто любопытство берет почему не так... А W2k я написал, т.к. сам на ней пишу.... а работать прога должна в W95/98




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.029 c
6-22786           nick_vstu             2002-01-23 03:26  2002.04.08  
Вопрос о TWebBowser и Socket


14-22817          Berserker             2002-02-27 03:34  2002.04.08  
Помогите с обучением в делфи


1-22719           vlv                   2002-03-26 20:45  2002.04.08  
Как очистить TBitmap?


3-22522           Eduard                2002-03-14 11:07  2002.04.08  
Table unknown


1-22657           Serd_hhc              2002-03-26 14:09  2002.04.08  
Как сменить текст моей консольной проги.