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

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

Ошибка при вызове dll из VBA [D5]


solenko ©   (2005-11-10 01:29:00) 

Есть dll-ка с функцией

setRecoderStrings(Recoder:integer; sourceCodeString, destCodeString: PChar);
begin
 if (strlen(sourceCodeString)<>strlen(destCodeString)) then
   abort
 else ...
end;

В VBA она поключается как
Public Declare Sub setRecoderStrings Lib "rec.dll" (ByVal recoder As Integer, ByVal sourceCodePage As String, ByVal disrCodePage As String)
s1 = "1234567890"
s2 = "0987654321"
Call setRecoderStrings(int_v, s1, s2)

Проблемма, собственно, в том, что в делфях длинны этих строк уже не равны.
В чем ошибка? В dll, или при описании функции в VBA? Как правильно все это сделать?


Leonid Troyanovsky   (2005-11-10 10:15:00) [1]


> solenko ©   (10.11.05 10:01) [4]
> stdcall или не помогает или я опять неправильно что-то сделал.
> ..


Конечно, неправильно.
Не надо выделять память в dll.
Тем более, что VBA не рассчитан на работу с указателями.

--
Regards, LVT.


Digitman   (2005-11-10 10:13:00) [2]

function GetRecoder:TRecoder; stdcall;
begin
Result := TRecoder.Create;
end;

procedure FreeRecoder(aRecorder: TRecoder); stdcall;
begin
aRecoder.Free;
end;

..

Public Declare Function GetRecoder Lib "rec.dll" () As Long

Public Declare Sub FreeRecoder Lib "rec.dll" (ByVal Recorder As Long) As Long

Dim Recorder As Long

Recorder = GetRecoder
..
FreeRecorder(Recorder)

а вообще весьма неразумно работать с дельфийскими объектами таким вот макаром ... очевидное решение - реализовать в dll ole-automation-объект


solenko   (2005-11-10 10:01:00) [3]

stdcall или не помогает или я опять неправильно что-то сделал...

function getRecoder():integer; stdcall;
var
 rec : PRecoder;
begin
 new(rec);
 rec^ := TRecoder.Create;
 Result := Integer(rec);
end;

При вызове этой функции из dll делфями -- получаем норамальный указатель, и дальше все работает прекрастно. При вызове же из VBA -- функция возвращает 0, и, естественно, ничего дальше не работает.


Digitman   (2005-11-10 09:10:00) [4]


> solenko ©   (10.11.05 09:07) [2]


а по идее должно быть указано stdcall


solenko   (2005-11-10 09:07:00) [5]

Честно говоря, не знаю. Я ничего дополнительно не указывал, так что соглашения о вызое такие, какимим их по умолчанию ставят делфя.


Digitman   (2005-11-10 08:17:00) [6]

соглашение о вызове stdcall ?


Наверх

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