![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Минимальная DLL [Delphi, Windows]
XProger © (2005-11-08 15:44:00)Как будут выглядеть System.pas и SysInit.pas, с минмальным размером кода, для успешной компиляции DLL библиотеки?
Заранее благодарен!
P.S.
С ехе всё достаточно просто...
SPeller (2005-11-14 17:59:00) [21]Vladimir Kladov (14.11.05 14:35) [10]
я провел эксперимент выше. Ничего не пихается кроме того, что руками импортировать или экспортировать
На какой версии компилировали? На 5? Я на 6.0.2. У меня 2 функции остались. Не помню уже какие.
Vladimir Kladov (2005-11-14 17:42:00) [22]Вот так работает:
procedure _InitLib;
asm
LEAVE
RET 12
end;
Vladimir Kladov (2005-11-14 16:39:00) [23]абсолютно аналогичная картина (взял includes.rar, перекомпилировал в Delphi5 - там были dcu для D7). При попытке сделать LoadLibrary возвращается 0, GetLastError дает Invalid access to memory location. Для DLL эти system и sysinit не подходят.
referrer (2005-11-14 14:41:00) [24]Ой, ну чего вы обсуждаете. Опубликовано же давно.
http://ms-rem.dot-link.net/articles/delphi/delphi.htm
Vladimir Kladov (2005-11-14 14:35:00) [25]я провел эксперимент выше. Ничего не пихается кроме того, что руками импортировать или экспортировать. Секции пустые. Но работать такая dll не может, ее нельзя даже загрузить. Второй вызов (_InitLib... ? не помню) должен перед возвратом (видимо) вытолкнуть из стека на 1 dword больше, иначе дальше код пытается выполнить нули. В итоге сама попытка сделать loadlibrary возвращает 0, а при связывании с dll на этапе компиляции два раза вылетает от системы сообщение про доступ к памяти, после чего прга запускается, но dll все равно вызвать не получается.
XProger (2005-11-14 14:22:00) [26]SPeller, что за функции без которых DLL компилируется, но не работает?
SPeller (2005-11-14 06:00:00) [27]А что подробнее?
XProger (2005-11-13 18:44:00) [28]SPeller, подробнее пожалуйста...
SPeller (2005-11-13 09:14:00) [29]XProger © (13.11.05 3:50) [5]
драйвера на дельфях уже пишут
Дрова, которые работают в режиме ядра, не могут вызывать функции режима пользователя (вроде так). Дельфя же суёт-таки два вызова функций режима пользователя. По крайней мере, моя 6.0.2.
XProger (2005-11-13 03:50:00) [30]SPeller, драйвера на дельфях уже пишут (статейку читал), пущай через одно место, но пишут :)
Что за функции, просто реально хочу посмотреть на минимальную DLL :)
Минимальный EXE -> com у меня 524 байта выходит :)
SPeller (2005-11-08 17:55:00) [31]Было бы очень хорошо, если бы компилтор после вычищения системных модулей не сувал в модули вызовы функций. Всё-равно две, по-моему, суются. Если бы их небыло - можно было бы драйвера на Дельфях писать :)
XProger (2005-11-08 16:36:00) [32]Поправка: В таблице импорта они есть, но вызов их приводит к ошибке :)
XProger (2005-11-08 16:06:00) [33]Всё просто супер! Только вот процедуры не экспортируются... по крайней мере ошибка вылетает страшная :(
Что я забыл?
XProger (2005-11-08 15:52:00) [34]Извините, неверно причину ошибки при компиляции понял, ну и полез в дебри...
Вот решение:
unit System;
interface
procedure _HandleFinally;
type
TGUID = record
D1: LongWord;
D2: Word;
D3: Word;
D4: array [0..7] of Byte;
end;
PInitContext = ^TInitContext;
TInitContext = record
OuterContext : PInitContext;
ExcFrame : pointer;
InitTable : pointer;
InitCount : integer;
Module : pointer;
DLLSaveEBP : pointer;
DLLSaveEBX : pointer;
DLLSaveESI : pointer;
DLLSaveEDI : pointer;
ExitProcessTLS : procedure;
DLLInitState : Byte;
end;
implementation
procedure _HandleFinally;
asm
end;
end.
======================================
unit SysInit;
interface
procedure _InitExe;
procedure _halt0;
procedure _InitLib(Context: PInitContext);
var
ModuleIsLib : Boolean;
TlsIndex : integer = -1;
TlsLast : Byte;
const
PtrToNil: pointer = nil;
implementation
procedure _InitLib(Context: PInitContext);
asm
end;
procedure _InitExe;
asm
end;
procedure _halt0;
asm
end;
end.