Я понял почему не работает dll'ка у меня - это ошибка компилятора (я юзаю довольно старый 2.0.4).
- Код: Выделить всё
.globl P$TESTEX_GET_PLUGIN_INFO_EX$TIBEINTERFACEEX$POINTER
P$TESTEX_GET_PLUGIN_INFO_EX$TIBEINTERFACEEX$POINTER:
# Temps allocated between ebp-8024 and ebp+0
pushl %ebp
movl %esp,%ebp
subl $8020,%esp
movl %eax,3928(%esp)
pushl %eax
movl %ebx,-8024(%ebp)
movl %esi,-8020(%ebp)
movl %edi,-8016(%ebp)
# Var Intf located at ebp+8
# Var PluginInfo located at ebp+12
# здесь копируется параметр Intf.
movl 8(%ebp),%esi
leal -8008(%ebp),%edi
cld
movl $2002,%ecx
rep
movsl
вместо movl 8(%ebp),%esi должно стоять leal 8(%ebp),%esi. В результате этой ошибки в esi оказывается ноль (первое поле структуры TIBEInterfaceEx), а не указатель на структуру в стеке и происходит исключение при копировании параметра Intf. Так что нужно найти версию компилятора, в которой на этом месте будет стоять leal. Кроме этого, могут возникнуть проблемы с разным выравниванием структур в fpc/delphi. И не следует забывать о директиве {$MODE} - без нее integer двухбайтный.
Если у вас в дизасме стоит leal, то выложите куда-нибудь скомпиленную dll'ку вместе с ассемблерным листингом (семейство опций -a).
PS Это ошибка прошла не замеченной скорее всего потому, что никто 8Kb структуры копированием не передает - но поправлять IBExpert похоже уже поздно.