Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Минимальная DLL [Delphi, Windows]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо