Алексей Ярославский
trexinc@yandex.ru
Во время написания Position Saver я столкнулся с небольшой проблемой, размер DLL-а который выдавал мой BCC 5.5 был просто страшным, в районе 80KB. Я почитал статьи из энциклопедии и попытался компилировать без startup code (c0d32.obj). Размер файла уменьшился но плагин перестал загружаться в ФАРе. Оказалось что ilink32.exe при компилирование C++ файлов без startup code неправильно выставлял entry point что и приводило к неработоспособности плагина. Я начал искать на инете информацию о ручном выставление entry point с помощью BCC и нашел что такой возможности он не даёт. Я уже готов был сдаться но в последнюю минуту нашел то что искал.
Так как Борландские компиляторы не дают вручную задавать entry point то нужно линковать с программой, объект который будет содержать уже готовую "entry point". Такой объект можно создать из ниже приведенного ASM файла:
.386p
_TEXT SEGMENT DWORD USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
DGROUP GROUP _DATA, _BSS
ASSUME CS:_TEXT, DS:DGROUP
_TEXT SEGMENT PUBLIC DWORD USE32 'CODE'
PUBLIC EntryPoint
PUBLIC __acrtused
__acrtused label byte
EntryPoint proc near
mov eax, 1
ret 12
EntryPoint endp
_TEXT ENDS
END EntryPoint
Объектный модуль полученный после компиляции этого файла (с помощью Turbo Assembler-а) можно линковать вместе с программой для получения работающего DLL-а без startup code с помощью BCC 5.5.
Более подробную информацию можно найти здесь Windows Developer Magazine Online.
02.06.2002