Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Вниз

Ошибка при вызове 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.014 c
10-1108161193
Homa_Programe
2005-02-12 01:33
2005.11.27
Word &amp; OLEConteiner


14-1130871398
VEG
2005-11-01 21:56
2005.11.27
Беспроводные сети


6-1124057240
NikNet
2005-08-15 02:07
2005.11.27
У кого есть UUE кодер и ДЕКОДЕР?


14-1130918257
Dmseller
2005-11-02 10:57
2005.11.27
bool.ru - предложение


2-1131628594
markers
2005-11-10 16:16
2005.11.27
Выполнить консольную команду и вернуть результат?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский