Как на Clarion-е написать процедуру для DLL....

Разработка программ на пес его знает на чем
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Требуется написать на Clarione процедуру, чтобы вызвать ее потом в Delphi.
Направление движения вообщем понятно....
В Project говорим, что собираем DLL, в процедурах указываем атрибут Export Procedure. Казалось-бы все хорошо... но когда нужно вызвать процедуру с параметром STRING - в Delphi (да и как позже выяснил в Clarion-е) возникает ошибка. Если можно, приведите пример, как формировать процедуру со String параметром и как потом ее вызывать ...
Написал: Alex_229(72)
Гость

Сообщение Гость »

Всем спасибо. Впорос снимается. Уже разобрался.
C Уважением, Alex.
Написал: Alex_229(72)
Гость

Сообщение Гость »

"Направление движения вообщем понятно...."
Совсем было-бы понятно, если бы перед этим прочитать или перечитать раздел хелпа, посвященный взаимодействию Клариона с другими языками!

Хотя, возможно, там не все или не совсем понятно описано.
Дело в том, что Кларион работает со строковыми параметрами совсем по другим принципам, нежели остальные языки.
Если практически все остальные языки (или, точнее, компиляторы?) передают АДРЕС строки через стек, то Кларион использует для этого свой внутренний строковый стек. Именно через этот стек в 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)
Ответить