не может. Если в EXE стоит флаг DLL, то ОС не грузит файл! (точно версию не скажу но XP - SP2 точно) Иначе если флага не стоит, то EXE не может быть DLL как можно убидиться на простом примере: HMODULE x = LoadLibrary("c:\\comcat.dll"); GetProcAddress(x,"DllGetClassObject"); HMODULE x1 = LoadLibrary("c:\\comcat1.dll"); GetProcAddress(x1,"DllGetClassObject"); return 0; Один файл имеет флаг DLL, другой нет. Если флаг не имеет флаг DLL то GetProcAddress возвращает NULL. Не может в классическом смысле.
Bill_Prisoner Зачем вообще флаг DLL? В аттаче простой пример на Delphi (6). 1736200574__exedll.ZIP вот как вариант test.dpr с LoadLibrary: Код (Text): program test; {$APPTYPE CONSOLE} uses Windows; type TExproc = function: string; stdcall; var exproc: TExproc; hLib: THandle; begin hLib := LoadLibrary ('exedll.exe'); if hLib = 0 then exit; @exproc := GetProcAddress (hLib, 'Exproc'); if Assigned (@exproc) then Writeln (Exproc); readln; end.
2k екзешник с флагом dll не запускает по CreateProcess, но по LoadLibrary грузит любой exe (если база занята, то только с релоками) и GetProcAddress возвращает адреса экспортируемых ним ф-ций, т.е. можно их спокойно вызывать, НО почему-то для загруженых экзешников не настраивается импорт (т.е. если экспорт. ф-ция содержит вызов например user32.MessageBox, то прога на нем вылетит)
Bill_Prisoner Как это не может? Из прикладных программ, например, Автодесковский acad.exe экспортирует функцию respSdj... Там все просто. Добавь что-то вроде extern "C" BOOL __cdecl acdbMatMult(void) { return TRUE; } #pragma comment(linker, "/EXPORT:acdbMatMult=_acdbMatMult") и будет счастье.
alpet сам компиль свою дельфи! Ж) протестируй мой аттач, может это только у меня глюки _1826136329__exedll.zip
Гм. Что-то я намудрил со своим примером. Ламер я bogrus У тебя же "dll" эмпортирует messageBox. Значит импорт настраивается?
bogrus Ок. Да импортные функции (such as GetProcessId), из экспортируемой лажу возвращают, и в моем примере тоже. Под олей смортю - например вызов MessageBoxA уходит в kernel32->LoadLibraryA. Ерунда в общем-то.
Гм. А как насчет функий DLL которых нет в импорте EXE, но в импорте "DLL" эти DLL есть? Мне кажеться что всётаки флаг отвечает за эту логику. Доказательств нет. Может вы приведете доказательство обратного?
В случае динамического импорта как раз проблемы есть. Доказано! Опишу ситацию побробно: 1. Есть EXE файл exe.exe который вызывает функцию message из dll.exe. Сам exe.exe импортирует только LoadLibrary и GetProcAddress. Т.е. функции которые присутствуют в kernel32.dll. Т.о. в АПП процесса присутствуют ntdll.dll,kernel32.dll и сам модуль exe.exe. 2. Есть DLL dll.exe, но без флага DLL в FileHeader PE заголовка. Т.о. её может загружать загрузик как EXE файл. И выполняться будет функция DllMain но без параметров, какие обычно передаються DllMain. Так вот эта DLL экспортирует функцию message. Функция message не принимает параметров. Она просто вызывает MessageBox так: MessageBox(0,0,0,0). Функция MessageBox экспортируется в свою очередь из user32.dll. Т.о. user32.dll нет изначально в exe.exe. Результат: Если мы вызываем функцию message dll.exe статически, то все нормально. Если мы вызываем функцию message dll.exe динамически через связку LoadLibrary/GetProcAddress, то таблица импорта для dll.exe не заполняется и при вызове message вылетает exception. Т.о. функция LoadLibrary проверяет флаг DLL, а загрузчик нет.
Для exe (без флага DLL) его entry point, т.е. DllMain вызыватся не будет, но вообще S_T_A_S_ тоже прав, без этого флага у меня не обрабатывает ни релоки, ни импорт, только экспорт! Короче использование возможно, но ограничено (c LoadLibrary)
bogrus То что DllMain вызываться не будет это и понятно. Но точка входа EXE это и есть указатель на DllMain.
Недавно писал файл exe, который сам себя загружает как драйвер. Там была загвостка, что файл не должен был импортировать никаких фунций из библиотек, чтобы вышеизложенная фишка сработала (более того этот файл на грузится под 2000, только XP и выше). А что касается Dll и exe, ответ однозначен - невозможно, предусмотрено в PE спецификации, следовательно если это возможно, то это баг операционной системы. Только вот есть загвостка - драйвер порта дисплея (это необычная dll)