Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как узнать полный путь [D7, WinXP]


serguar ©   (2006-06-01 10:42:00) 

Здравствуйте.
Подскажите как из моего приложения определить полный путь к чужему запущеному приложению. Далаю так:

function GetMyFullPath: String;
var
 Wnd: HWnd;
 WinInstance: THandle;
 ModuleName: array[0..MAX_PATH - 1] of Char;
begin
 Result := '';
 Wnd := FindWindow(PChar('AppClassName'), nil);
 if Wnd <> 0 then begin
   WinInstance := GetWindowLong(Wnd, GWL_HINSTANCE);
   if GetModuleFileName(WinInstance, ModuleName, Length(ModuleName)) > 0 then
     Result := StrPAs(ModuleName);
 end;
end;

функция GetModuleFileName() возвращает ноль.
Че делать?


serguar   (2006-06-01 19:35:00) [1]


> DVM

Спасибо большое! Все получилось.


DVM   (2006-06-01 17:01:00) [2]

uses   Tlhelp32, PSAPI;

function _GetProcessFileNameByWindowHandle(Wnd: HWND): string;
var
 hProcess: THandle;
 PID: Cardinal;
 FileName: array [1..MAX_PATH] of char;
 PE: TProcessEntry32;
 Snap: Cardinal;
 OsVerInfo: TOSVersionInfo;
begin
 Result := '';
 GetWindowThreadProcessId(Wnd, @PID);
 hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);
 OsVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
 if GetVersionEx(osVerInfo) then
   begin
     if OsVerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
       begin
         ZeroMemory(@Filename[1], SizeOf(Filename));
         GetModuleFileNameEx(hProcess, 0, @Filename[1], SizeOf(Filename));
         Result := FileName;
       end
     else
       begin
         Snap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
         if Snap <> -1 then
           begin
             PE.dwSize:=SizeOf(PE);
             if Process32First(Snap, PE) then
               repeat
                 if PE.th32ProcessID = PID then Result := PE.szExeFile;
               until not Process32Next(Snap, PE);
           end;
       end;
   end;
 CloseHandle(hProcess);
end;


umbra   (2006-06-01 16:47:00) [3]

2 tesseract ©   (01.06.06 16:45) [8]

да, вспылил я :\
читал невнимательно


tesseract   (2006-06-01 16:45:00) [4]


> ExtractFilePath(Application.ExeName) + basename

Это вроде для своего, а ему для чужого надо.


umbra   (2006-06-01 16:37:00) [5]


> Просто база лежит в том же каталоге что и исполняемый файл,
>  который ее заполняет

ExtractFilePath(Application.ExeName) + basename


serguar   (2006-06-01 16:06:00) [6]

Я вообще все это затеял для того что бы узнать путь к локальной БД на которую нет ни алиасов ни чего другого в реестре. Просто база лежит в том же каталоге что и исполняемый файл, который ее заполняет. Может есть какие нибудь другие предложения. Путь нужен для динамического формирования свойства ADOConnection.ConnectionString.


serguar   (2006-06-01 16:02:00) [7]


> Игорь Шевченко


Вот именно, будем над этим работать...


BiN   (2006-06-01 16:00:00) [8]

а чем  GetModuleFileNameEx или GetProcessImageFileName не устраивают?


Игорь Шевченко   (2006-06-01 15:39:00) [9]

serguar   (01.06.06 14:51) [2]

XP SP2 или Windows 2003 ? Тогда увы.


serguar   (2006-06-01 14:51:00) [10]

Спасибо. Попробовал. Вот результат:

System Error. Code: 299
Запрос ReadProcessMemory или WriteProcessMemory был выполнен только частично.

Вылетает на втором вызове ReadProcessMemory()

У меня только на Winamp не ругается... :)


Игорь Шевченко   (2006-06-01 10:54:00) [11]

http://www.schevchenko.net.ru/SRC/EnumFunctions_60.zip


Наверх

Титульная страница Поиск, карта сайта Написать письмо