Форум: "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