Форум: "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.027 c
1-22721           Sound                 2002-03-25 22:29  2002.04.08  
Поиск по Memo


1-22620           АААААА                2002-03-27 17:33  2002.04.08  
Как загрузить иконку из файла *.ico?


1-22693           Сатир                 2002-03-26 15:05  2002.04.08  
Директивы компилятора


3-22598           Val                   2002-03-14 14:20  2002.04.08  
Еще одно поле в Query


3-22579           polarbear             2002-03-17 20:46  2002.04.08  
Как остановить сервер FireBird из командной строки под Win9x?