![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при вызове 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 ?