Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

Ошибка при вызове dll из VBA   Найти похожие ветки 

 
solenko ©   (2005-11-10 01:29) [0]

Есть 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? Как правильно все это сделать?


 
Digitman ©   (2005-11-10 08:17) [1]

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


 
solenko ©   (2005-11-10 09:07) [2]

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


 
Digitman ©   (2005-11-10 09:10) [3]


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


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


 
solenko ©   (2005-11-10 10:01) [4]

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 10:13) [5]

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-объект


 
Leonid Troyanovsky ©   (2005-11-10 10:15) [6]


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


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

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.11.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.032 c
14-1131316468
Mirror
2005-11-07 01:34
2005.11.27
Подскажите компонент


14-1131430731
Ega23
2005-11-08 09:18
2005.11.27
С днем рождения! 8 ноября


9-1121128731
Jfc
2005-07-12 04:38
2005.11.27
Помогите с алгоритмом


1-1130868953
Alexander Dakis
2005-11-01 21:15
2005.11.27
Как создать динамическое выделение текста, как в редакторе Delphi


2-1131805947
Виталий80
2005-11-12 17:32
2005.11.27
Как сделать чтобы цифры часов менялись в реальном времени