MapInfo, Lazarus и DevPascal

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

Сообщение buls » 07.04.2006 09:17:06

Здравствуйте! Есть такая ГИС MapInfo Professional и есть язык MapBasic, на котором пишутся проги для этой ГИС. Язык этот позволяет вызывать функции и процедуры, хранящиеся в DLL. Функции эти в DLL должны быть объявлены с директивой stdcall. Делал я различные DLL’ки на Delphi, успешно использовал их потом в MapBasic программах, потом наткнулся на Lazarus (0.9.14.1-20060402), решил попробовать слепить простенькую DLL’ку, вот её код:
Код: Выделить всё
 library mydll;
uses
 Windows;

function Test(hParentWindow: HWND): integer stdcall export;
begin
result:=MessageBox(hParentWindow,'Hello world from a Lazarus DLL','',MB_OK);
end;

exports Test;

begin
end.

Lazarus выдал dll’ку, но попытавшись вызвать функцию Test в MapBasic программе, MapInfo ругнулся «Не удалось загрузить Mydll.dll, потому что это не 32-битная библиотека. Не удалось присоединить внешнюю библиотеку mydll.dll».
Вот код MapBasic проги:
Код: Выделить всё
declare sub main
Declare Function Test Lib "mydll.dll" Alias "Test" (ByVal ParentWindow As integer) As integer
dim i as integer

sub main
i=test(systeminfo(9))
‘встроенная функция systeminfo(9) возвращает HWND основного окна MapInfo.
end sub

Потом в настройках компилятора убрал все галочки, кроме одной «совместимость с Delphi», собрал dll’ку, теперь MapInfo ругается по-другому «Не удалось загрузить Mydll.dll. Не удалось присоединить внешнюю библиотеку mydll.dll», перепробовал разные варианты настроек – ничего не помогло.

Далее установил Dev-Pascal 1.9.2, скомпилировал в нём. Из полученной dll’ки функция успешно была выполнена в MapBasic программе, замечательно! но в DevPascal’е версия компилятора FPC 1.0.6, а в Lazarus’е 2.0.2. Кроме того, хотелось бы использовать Lazarus и более новую версию компилятора, нежели DevPascal.

В чём может быть проблема? Почему dll’ка собранная в версии 1.0.6, отличается от аналогичной, но собранной в версии 2.0.2? Может нужно задать какие-то параметры компиляции, непредусмотренные стандартными настройками?
buls
незнакомец
 
Сообщения: 7
Зарегистрирован: 07.04.2006 08:01:44

Сообщение SergKam » 07.04.2006 20:15:28

Не помню точно недавно на форуме было упоминание о такой проблеме, там при обьявлении
exports надо както по другому.(имя принудительно задавать чтоли?)
это вроде работает
Код: Выделить всё
library udflib;

{$ALIGN OFF}
{$mode objfpc}
{$smartlink off}
{$PACKRECORDS C}

uses
SysUtils,
Classes;

{DECLARE EXTERNAL FUNCTION IOR
longint,
longint
RETURNS longint BY VALUE
ENTRY_POINT 'fn_or' MODULE_NAME 'udflib.so'}

function fn_or(var I1,I2: longint) : longint; cdecl; export;
begin
Result := I1 or I2;
end;

exports
fn_or name 'fn_or';
end.
SergKam
постоялец
 
Сообщения: 251
Зарегистрирован: 16.11.2005 21:31:11
Откуда: Украина,Харьков

Сообщение Иван Шихалев » 10.04.2006 07:45:31

exports Test;

Код: Выделить всё
exports Test name 'Test';

Должно работать корректно.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение buls » 10.04.2006 09:48:26

Увы, не помогает. Попробовал вызвать функцию Test из програмки, написанной на Visual Basic 6.0, таже история, не могжет найти dll'ку! а вот если попытаться вызвать функцию в програмке, созданной в delphi то всё работает. Ещё, если взять код этой dll'ки и без изменений перенести в проект delphi и скомпилировать, то из полученной библиотеки функция вызывается корректно и в Visual Basic'е и в Map Basic'е.
А вот ещё, в обоих basic'ах api функция LoadLibrary возвращает 0, при попытке загрузить библиотеку, откомпилированную в lazaurus'е, при попытке загрузить туже самую библиотеку, но откомпилированную в Delphi, функция возвращает хэндл этой библиотеки. Может всё таки проблема в lazarus'е? Может есть какие-то дополнительные утилиты, которые исправляют эту проблему в уже готовых dll'ках?
buls
незнакомец
 
Сообщения: 7
Зарегистрирован: 07.04.2006 08:01:44

Сообщение zub » 10.04.2006 13:41:20

А дизасемблером экспортируемая функция видна в таблице экспорта?
У меня при включении смартлинка проподают почти все экспортируемые/импортируемые, у тебя он не включен случайно?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Сообщение zub » 10.04.2006 13:42:58

>>не могжет найти dll'ку
не может найти дллку или функцию в дллке?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Сообщение buls » 11.04.2006 07:34:32

А дизасемблером экспортируемая функция видна в таблице экспорта? У меня при включении смартлинка пропадают почти все экспортируемые/импортируемые, у тебя он не включен случайно?

Функция Test присутствует в таблице экспорта, смартлинк выключен.
не может найти дллку или функцию в дллке?

Пишет, что не может найти dll'ку, даже если задать абсолютный путь.

Cкачал FPC 2.0.0, скомпилировал им, всё заработало. Проблема кроется в версии 2.0.2 [2006/04/02], которая идёт вместе с Lazarus 0.19.14.1.
buls
незнакомец
 
Сообщения: 7
Зарегистрирован: 07.04.2006 08:01:44


Вернуться в Сторонние средства

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Рейтинг@Mail.ru