Требуется написать на Clarione процедуру, чтобы вызвать ее потом в Delphi.
Направление движения вообщем понятно....
В Project говорим, что собираем DLL, в процедурах указываем атрибут Export Procedure. Казалось-бы все хорошо... но когда нужно вызвать процедуру с параметром STRING - в Delphi (да и как позже выяснил в Clarion-е) возникает ошибка. Если можно, приведите пример, как формировать процедуру со String параметром и как потом ее вызывать ...
Написал: Alex_229(72)
Как на Clarion-е написать процедуру для DLL....
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
"Направление движения вообщем понятно...."
Совсем было-бы понятно, если бы перед этим прочитать или перечитать раздел хелпа, посвященный взаимодействию Клариона с другими языками!
Хотя, возможно, там не все или не совсем понятно описано.
Дело в том, что Кларион работает со строковыми параметрами совсем по другим принципам, нежели остальные языки.
Если практически все остальные языки (или, точнее, компиляторы?) передают АДРЕС строки через стек, то Кларион использует для этого свой внутренний строковый стек. Именно через этот стек в RTL и идет работа с параметрами-строками.
Естественно, что другие языки ничего об этом не знают!
Поэтому компилятору Клариона надо дать знать, что следует передавать строки, как впрочем и все остальные параметры, через стандартный стек.
MAP
MyFunc(*CSTRING _Str),PASCAL
END
А в Дельфях эту функцию следует обьявить что-то типа:
MyFunc(LONG _StrLen,*STRING _Str)
Т.е. при вызове данной процедуры будут передавать ДВА параметра:
- в первом параметре компилятор будет передавать ДЛИНУ строки _Str
- во втором параметре будет передаваться АДРЕС строки _Str
Ну а в Дельфях, используя эти данные, уже можно легко обработать передаваемую строку.
В Кларион-программе, естественно, продолжаешь работать с данной процедурой как обычно:
LOC:Str CSTRING(100)
...
LOC:Str = 'Проверка'
MyFunc(LOC:Str)
Message(LOC:Str)
...
=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Привет всем
......
.............
Это клава версия С5.5 для других думаю тоже самое
Удачи...
Сергей Половинкин s.polovinkin@vaz.ru (ДИС)
Написал: ClaList(2)
Совсем было-бы понятно, если бы перед этим прочитать или перечитать раздел хелпа, посвященный взаимодействию Клариона с другими языками!
Хотя, возможно, там не все или не совсем понятно описано.
Дело в том, что Кларион работает со строковыми параметрами совсем по другим принципам, нежели остальные языки.
Если практически все остальные языки (или, точнее, компиляторы?) передают АДРЕС строки через стек, то Кларион использует для этого свой внутренний строковый стек. Именно через этот стек в RTL и идет работа с параметрами-строками.
Естественно, что другие языки ничего об этом не знают!
Поэтому компилятору Клариона надо дать знать, что следует передавать строки, как впрочем и все остальные параметры, через стандартный стек.
MAP
MyFunc(*CSTRING _Str),PASCAL
END
А в Дельфях эту функцию следует обьявить что-то типа:
MyFunc(LONG _StrLen,*STRING _Str)
Т.е. при вызове данной процедуры будут передавать ДВА параметра:
- в первом параметре компилятор будет передавать ДЛИНУ строки _Str
- во втором параметре будет передаваться АДРЕС строки _Str
Ну а в Дельфях, используя эти данные, уже можно легко обработать передаваемую строку.
В Кларион-программе, естественно, продолжаешь работать с данной процедурой как обычно:
LOC:Str CSTRING(100)
...
LOC:Str = 'Проверка'
MyFunc(LOC:Str)
Message(LOC:Str)
...
=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Привет всем
......
Код: Выделить всё
TGetTime = procedure(a,b,c :PINTEGER);STDCALL;
THandle = Integer;
var
HandleMy: THandle;
GetTime: TGetTime;
aa, bb, cc : STRING;
a,b,c :PINTEGER;
...........
procedure TfmGraphPayment.miReestrClick(Sender: TObject);
begin
HandleMy := LoadLibrary('moneydll.dll');
if HandleMy <> 0 then
begin
@GetTime := GetProcAddress(HandleMy, 'SENDEXC');
if @GetTime <> nil then
begin
aa:=Globaldate;
bb:=dmDataModule.sqGraphPaymentNameGRAPH_NAME.value;
cc:=dmDataModule.seOraSession.LogonUserName+'/'+dmDataModule.seOraSession.LogonPassword+'@'+dmDataModule.seOraSession.LogonDatabase;
a := pinteger(aa);
b := pinteger(bb);
c := pinteger(cc);
GetTime(a,b,c);
end;
FreeLibrary(HandleMy);
HandleMy:=0;
end;
end;
Это Delphi a,b,c указатели на строки
---------------------------------------------------------------------------------
NeedExcelByDateContract PROCEDURE(long DATE_BUDJET, long GRAPH_NAME, long CONNECTSTRING), NAME('SENDEXC'), PASCAL
RefGrpA GROUP
pCStrA &CSTRING
END
PtrGrpA GROUP,OVER(RefGrpA)
PtrA LONG
END
RefGrpB GROUP
pCStrB &CSTRING
END
PtrGrpB GROUP,OVER(RefGrpB)
PtrB LONG
END
RefGrpC GROUP
pCStrC &CSTRING
END
PtrGrpC GROUP,OVER(RefGrpC)
PtrC LONG
END
A CSTRING(20)
B CSTRING(20)
C CSTRING(40)
CODE
RefGrpA.pCStrA &= Null
if DATE_BUDJET
PtrGrpA.PtrA = DATE_BUDJET
.
RefGrpB.pCStrB &= Null
if GRAPH_NAME
PtrGrpB.PtrB = GRAPH_NAME
.
RefGrpC.pCStrC &= Null
if CONNECTSTRING
PtrGrpC.PtrC = CONNECTSTRING
.
A=RefGrpA.pCStrA
B=RefGrpB.pCStrB
C=RefGrpC.pCStrC
Это клава версия С5.5 для других думаю тоже самое
Удачи...
Сергей Половинкин s.polovinkin@vaz.ru (ДИС)
Написал: ClaList(2)