Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.036 c
1-1131012655
Friend
2005-11-03 13:10
2005.11.27
Печать содержимого RxRichEdit


14-1131017255
Falcon(TFsoft)
2005-11-03 14:27
2005.11.27
Button1Click at runtime....


14-1131093859
baks_uz
2005-11-04 11:44
2005.11.27
БД без BDE


11-1112516913
Владимир Кладов
2005-04-03 12:28
2005.11.27
FastMM - еще один менеджер кучи


3-1129550690
grusty
2005-10-17 16:04
2005.11.27
ADODataSet.UpdateBatch(arAll) выдает ошибку...




   Наверх