Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Вниз

Странная работа 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 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.057 c
14-1127923562
Piter
2005-09-28 20:06
2005.10.23
М.Руссинович, Д.Соломон - Внутреннее устройство Microsoft Windows


14-1128000386
lookin
2005-09-29 17:26
2005.10.23
Термин "таймер" в спорте


2-1127830881
Evereve
2005-09-27 18:21
2005.10.23
целое ли число


2-1127457227
новенький
2005-09-23 10:33
2005.10.23
Сортировка данных


14-1127815455
tuxds
2005-09-27 14:04
2005.10.23
Передача снимка экрана по сети





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский