Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: CL | DM;

Вниз

Странная работа GetModuleFileName с библиотеками   Найти похожие ветки 

 
Piter ©   (2005-08-18 22:15) [0]

Заметил странную особенность работы GetModuleFileName с библиотекой. Если для EXE"шников возвращаемая строка в имени файла учитывает регистр, например:

Result = "...\Project1.exe

То для библиотек имя файла всегда в нижнем регистре:

Result = "...\library1.dll"

Даже если библиотека называется "LiBrArY.dll".

Почему так и самое главное - как побороть?

Не то, чтобы критически важно, но данное поведение немного снижает красоту плагиновой программы.


 
alpet ©   (2005-08-18 22:39) [1]

1. Почему - видимо из-за того что dll.
2. Побороть, хм. ToolHelp32 Module32First/Module32Next, не дают решения сабжа? или GetFullPatchName?


 
Piter ©   (2005-08-18 22:48) [2]

Что такое GetFullPatchName?

Про Module32First/Module32Next я вообще не понял.


 
alpet ©   (2005-08-19 07:25) [3]

1. The GetFullPathName function retrieves the full path and file name of a specified file.

DWORD GetFullPathName(
 LPCTSTR lpFileName,
 DWORD nBufferLength,
 LPTSTR lpBuffer,
 LPTSTR* lpFilePart
);
Exported from kernel32.dll

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

function GetModuleFileName2 (hMod: THandle): string;
var me: MODULEENTRY32;
   h: THandle;
begin
result := "";
h := CreateToolHelp32Snapshot (TH32CS_SNAPMODULE, GetCurrentProcessId ());
if h = INVALID_HANDLE_VALUE then exit;
me.dwSize := sizeof (me);
if Module32First (h, me) then
 repeat
  if me.hModule = hMod then  
    result := me.szExePath;    
 until Module32Next (h, me) or (result <> "");
CloseHandle (h);
end;
</code


 
alpet ©   (2005-08-19 07:37) [4]

Точнее until not Module32Next (h, me) or (result <> "");


 
alpet ©   (2005-08-19 07:42) [5]


{$APPTYPE CONSOLE}
var hLib: THandle;
   s: Widestring;
   ws: array [0..260] of WideChar;
   fd: WIN32_FIND_DATAW;
begin
hLib := LoadLibraryA ("wwork.dll"); // wWoRk.dll
if hLib <> 0 then
 begin
  GetModuleFileNameW (hLib, @ws, 260);
  WriteLn (hLib, " ", ws);
  FillChar (fd, sizeof (fd), 0);
  FindFirstFileW (@ws, fd);
  Writeln (fd.cFileName); // prints wWoRk.dll
 end;
end.


 
Leonid Troyanovsky ©   (2005-08-19 08:47) [6]


> Piter ©   (18.08.05 22:15)  

> Не то, чтобы критически важно, но данное поведение немного
> снижает красоту плагиновой программы.


Пардон, а как сие поведение снижает красоту?

--
Regards, LVT.


 
Lamer@fools.ua ©   (2005-08-19 10:42) [7]

>>Leonid Troyanovsky ©   (19.08.05 08:47) [6]

Ну если файл называется SuperPuperCoolPlugin.dll, а в программе будет superpupercoolplugin.dll... Я так понял.


 
Piter ©   (2005-08-19 14:22) [8]

Leonid Troyanovsky ©   (19.08.05 8:47) [6]

да, Lamer@fools.ua верно сказал.

И вообще интересно - почему для EXE одно поведение, а для DLL другое :)


 
Leonid Troyanovsky ©   (2005-08-19 14:45) [9]


> Piter ©   (19.08.05 14:22) [8]

> да, Lamer@fools.ua верно сказал.


Ну, дык используй
OriginalFilename or ProductName from Version Info.


> И вообще интересно - почему для EXE одно поведение, а для
> DLL другое :)


На моем 2003 Server одинаково, т.е., не меняет регистр.
На NT4 также  было, кажись.

--
Regards, LVT.


 
Piter ©   (2005-08-19 16:17) [10]

Leonid Troyanovsky ©   (19.08.05 14:45) [9]
OriginalFilename or ProductName from Version Info


хм, идея - спасибо

На моем 2003 Server одинаково, т.е., не меняет регистр

а ты именно на DLL проверял? На EXE и у меня не меняет...

На NT4 также  было, кажись

у меня WinXP SP2 pro


 
Leonid Troyanovsky ©   (2005-08-19 16:23) [11]


> Piter ©   (19.08.05 16:17) [10]

> На моем 2003 Server одинаково, т.е., не меняет регистр
>
> а ты именно на DLL проверял? На EXE и у меня не меняет...


Конечно, например, возвращает:

C:\WINDOWS\system32\compatUI.dll

--
Regards, LVT.

PS На 9х, IMHO, встречалась подобная чехарда.


 
alpet ©   (2005-08-19 16:37) [12]

OriginalFilename or ProductName from Version Info.

Это ведь ресурсы? Могут и отсутствовать, если их не позаботился встроить разработчик плагина.


 
alpet ©   (2005-08-19 16:40) [13]

Копать наверняка надо в сторону GetThreadContext, и ReadProcessMemory.


 
Leonid Troyanovsky ©   (2005-08-19 16:43) [14]


> alpet ©   (19.08.05 16:37) [12]
> OriginalFilename or ProductName from Version Info.
>
> Это ведь ресурсы? Могут и отсутствовать, если их не позаботился
> встроить разработчик плагина.


Какие уж там заботы?
Зашел на соотв. вкладку в Project options.

Ну, и я как понял, Piter не хост делает.

--
Regards, LVT.


 
Игорь Шевченко ©   (2005-08-19 16:43) [15]

alpet ©   (19.08.05 16:40) [13]

Нафига ?


 
alpet ©   (2005-08-19 16:46) [16]

Игорь Шевченко ©   (19.08.05 16:43) [15]
Дык перепутал треды ))


 
alpet ©   (2005-08-19 16:47) [17]

Leonid Troyanovsky ©   (19.08.05 16:43) [14]

Понятно, но в таком случае это особого отношения к оригинальному имени файла не имеет (хотя как правило с ним совпадает).


 
Leonid Troyanovsky ©   (2005-08-19 16:54) [18]


> alpet ©   (19.08.05 16:47) [17]

> Понятно, но в таком случае это особого отношения к оригинальному
> имени файла не имеет (хотя как правило с ним совпадает).


Красота требует жертв, бо могучая сила.

--
Regards, LVT.


 
alpet ©   (2005-08-19 17:03) [19]

Leonid Troyanovsky ©   (19.08.05 16:54) [18]

Угу, а когда способ не рабоатает, можно и [5] использовать.


 
Piter ©   (2005-08-19 17:27) [20]

Leonid Troyanovsky ©   (19.08.05 14:45) [9]
OriginalFilename or ProductName from Version Info


Блин... чего-то мы все тупим... А какой в этом смысл? :)

Фишка как раз в том, чтобы можно было изменять имя DLL - и менялось название.

А тут запихнуть строчк в ресурсы DLL, а потом ее извлечь :) Смысл-то какой...

Я с таким же успехом могу константу внутри программы завести :)))


 
Leonid Troyanovsky ©   (2005-08-19 20:39) [21]


> Piter ©   (19.08.05 17:27) [20]

> Фишка как раз в том, чтобы можно было изменять имя DLL -
> и менялось название.
>
> А тут запихнуть строчк в ресурсы DLL, а потом ее извлечь
> :) Смысл-то какой...
>
> Я с таким же успехом могу константу внутри программы завести
> :)))


 Соглашусь.

--
Regards, LVT.


 
Piter ©   (2005-08-19 21:19) [22]

так какое решение? FindFirst получается...

Разработчики других плагинов, как я посмотрел, просто приводят все к вернхнему регистру, что в общем тоже, конечно, ничего...


 
Leonid Troyanovsky ©   (2005-08-19 21:29) [23]


> Piter ©   (19.08.05 21:19) [22]
> так какое решение? FindFirst получается...
>
> Разработчики других плагинов, как я посмотрел, просто приводят
> все к вернхнему регистру, что в общем тоже, конечно, ничего...


А оно кому надо?

--
Regards, LVT.


 
Piter ©   (2005-08-20 12:02) [24]

Leonid Troyanovsky ©   (19.08.05 21:29) [23]
А оно кому надо?


дык так красивее...



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

Текущий архив: 2005.10.23;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.033 c
14-1128183159
syte_ser78
2005-10-01 20:12
2005.10.23
12 дней не курю!


1-1128062786
webpauk
2005-09-30 10:46
2005.10.23
Список папок


1-1128013964
userrrrr
2005-09-29 21:12
2005.10.23
как получит ин-цию о процессоре?


2-1128122332
Spaller
2005-10-01 03:18
2005.10.23
Web приложение


1-1127991488
r9000
2005-09-29 14:58
2005.10.23
Перевод части текста программы на fox в Delphi.