VBA и FPC dll, неверная передача

Общие вопросы программирования, алгоритмы и т.п.

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

VBA и FPC dll, неверная передача

Сообщение xwind » 23.05.2010 00:00:42

Не могу справиться с проблемой. Я написал dll на FPC, вызываемую через макрос Excel. Проблема в том, что Excel'ю из dll возвращается неправильное значение (-2850 вместо 0). Я не могу понять в чем может быть проблема, потому что эта dll работает прекрасно с exe файлом написанным на FPC.
Листинг dll.
Код: Выделить всё
library Echo;

function echo (A:integer):integer; export; stdcall;
begin
  echo:=A;
end;

exports
echo index 1;
end.

Листинг макроса Excel
Код: Выделить всё
Declare Function echo Lib "echo.dll" (a As integer) As integer
Sub calldll()
Dim a, b As Integer
a = 0
b = echo (a)
Range("A4").Select
ActiveCell.FormulaR1C1 = Str(b)
End Sub


Спасибо.
xwind
незнакомец
 
Сообщения: 4
Зарегистрирован: 22.05.2010 23:25:35

Re: VBA и FPC dll, неверная передача

Сообщение Sergei I. Gorelkin » 23.05.2010 03:05:49

Про режим {$mode objfpc} не забыл? Без него тип Integer будет 16-битным, а екселю явно нужен 32-битный.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1397
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: VBA и FPC dll, неверная передача

Сообщение xwind » 23.05.2010 14:08:38

{$mode objfpc} не помогло, все осталось так же. Тип Integer в VBA 16-bit (2-Byte) поэтому я поменял его на Long 32-bit (4-byte). Но от этого связка работать нормально не стала. Возврат значения из dll происходит нормально, проверил возвратом конкретного числа заданного в dll. Проблема возникает при передаче числа из VBA в dll. В текстовом файле оказывается все что угодно но не передаваемое число 0. Причем передаваемое число зависит фиг знает от чего: 3105876 +- пару тысяч. Что интересно, 2010 офис в отличие от 2007 при этом еще и падает (когда dll производит запись в файл). Что делать?

Код: Выделить всё
library Echo;
function echo (A:longint):longint; export; stdcall;
var
  f:Text;
begin
  assign(f, 'd:\1.txt');
  Rewrite(f);
  Writeln(f, A);
  Close(f);
  echo:=A;
end;
exports
  echo index 1;
end.
xwind
незнакомец
 
Сообщения: 4
Зарегистрирован: 22.05.2010 23:25:35

Re: VBA и FPC dll, неверная передача

Сообщение Bupyc » 23.05.2010 15:05:58

Такое ощущение, что excel'ю не stdcall конвенция вызова нужна. Попробуйте что-нибудь типа cdecl.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: VBA и FPC dll, неверная передача

Сообщение xwind » 23.05.2010 16:12:42

По документации VBA понимает только stdcall. Попробовал с cdecl - VBA явно мне написал "bad dll call convention".
Я уже перелопатил кучу примеров и документации связанные с использованием DLL под MS Office, a так же про типы данных в разных языках, но как-то понимания, в чем подвох, не добавилось :(
xwind
незнакомец
 
Сообщения: 4
Зарегистрирован: 22.05.2010 23:25:35

Re: VBA и FPC dll, неверная передача

Сообщение Дож » 23.05.2010 16:14:49

xwind
Приведи пример работающего кода на си, попробуем сравнить в чем разница.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: VBA и FPC dll, неверная передача

Сообщение Bupyc » 23.05.2010 16:24:28

xwind писал(а):Попробовал с cdecl - VBA явно мне написал "bad dll call convention".


Я имел в виду, что нужно в секции экспорта DLL написать конвенцию вызова cdecl. Примерно как то так

Код: Выделить всё
function echo (A:longint):longint; export; cdecl;


В этом случае Excel точно ругаться не начёт, т.к. в DLL конвенция вызова нигде в явном виде не хранится.
Я сам не имел опыта вызова DLL библиотек из Excel, но судя по описанию проблемы (падение 2010 офиса), дело именно в неправильной конвенции вызова.

p.s. Возможно, стоит попробовать не cdecl, а что то другое.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: VBA и FPC dll, неверная передача

Сообщение xwind » 23.05.2010 17:16:58

Нашел решение.
На всякий случай напишу здесь.
1. Используется stdcall
2. При объявлении DLL в VBA явно указывается ByVal
Код: Выделить всё
Declare Function echo Lib "echo.dll" (ByVal a As integer) As integer

все заработало :)

Всем спасибо, кто принимал участие, тему можно закрывать. :mrgreen:
xwind
незнакомец
 
Сообщения: 4
Зарегистрирован: 22.05.2010 23:25:35


Вернуться в Общее

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

Сейчас этот форум просматривают: Google [Bot] и гости: 37

Рейтинг@Mail.ru