Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 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



Страницы: 1 вся ветка

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

Наверх





Память: 0.46 MB
Время: 0.005 c
1-22730
Gayrus
2002-03-27 03:22
2002.04.08
TComboBox


14-22790
PlaZZma
2002-02-26 00:10
2002.04.08
Где найти описание Wise InstallMaster или InstallShield на русском?


1-22765
PEC
2002-03-27 13:37
2002.04.08
С Англиским Худо !


1-22630
Anton+
2002-03-27 17:36
2002.04.08
Чем разделитель #10 отличается от #13?


1-22618
VictorT
2002-03-27 16:29
2002.04.08
Список файлов в конкретной папке (без вложеных)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский