14 Kasım 2018, 07:25:36

Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d


Synapse Library Sorunum

Başlatan SercanTEK, 07 Temmuz 2018, 00:09:30

SercanTEK

Merhaba,

Geçmişte yazdığım bir uygulamayı geliştirmek istedim. Zamanında win7 32 bit , Delphi 2009 kullanarak yazdığım uygulama win10 64 bit , Delphi 10.2 Tokyo ile açıp derleyince derleniyor ama maalesef hata alıyorum.

Uygulamada kullandığım API içinde synapse Library kullanılmış. Uygun sürümü buldum ve ekledim. herşey güzel derliyor ama çalışmıyor.

Delphi 2010 kurdum onda da aynı sorun. Sorun neyden bulamadım. eskiden derlediğim uygulama çalışıyor. ama yeni derleyince çalışmıyor.

API Kütüphanesi     : https://wiki.mikrotik.com/wiki/API_Delphi_Client

Synapse Kütüphanesi : http://synapse.ararat.cz/lib/exe/fetch.php/file:synapse40.zip


Aldığım Hata :
---------------------------
Access violation at address 004B7BA9 in module 'Project1.exe'. Read of address 0000000C.
---------------------------

Olmazsa Kütüphaneyi İndy kullanarak düzenleyeceğim. yada win7 32 bit kurup orada derlemeyi deneceğim. Sorun synapse ile delphi yada işletim sistemi uyumsuzluğu mu anlamadım.
Hayat sadece bir araçtır amaca ulaşmak için; Amaç ise Hayata birşeyler Katmaktır Benim için.. www.sercanca.com

tunayk

En temel olarak 32Bit derlenmiş kütüphane 64Bit Win de çalıştırılmak istenince bu hatayı verir.

SercanTEK

Alıntı yapılan: tunayk - 07 Temmuz 2018, 00:37:53En temel olarak 32Bit derlenmiş kütüphane 64Bit Win de çalıştırılmak istenince bu hatayı verir.

Peki Benim işletim sistemim 64 bit. Eskiden 32 bitte derlediğim Exe neden aynı şekilde hata vermiyor ?

Benim derleme işlerini 32 bit işletim sistemi kullanarak mı denemek gerekiyor ?
Hayat sadece bir araçtır amaca ulaşmak için; Amaç ise Hayata birşeyler Katmaktır Benim için.. www.sercanca.com

tunayk

Delphi tarafında nasıldır bilemiyorum ancak benzer olduğunu düşünüyorum.  Visual Studio da özel olarak 32Bit derle demezsiniz,Default olarak Any Cpu olarak derlenir ve derleme içinde  32Bit kütüphane kullanmanıza kızmaz. Ancak uygulama çalıştırılınca sizinki gibi hata verir. Fakat böyle bir uygulamayı 32Bit Cpu için derle dediğinizde derleme komple 32Bit olarak yapılır ve bu uygulama Win64 üzerinde sorunsuz çalışır.  Windows bunun kesin olarak 32Bit olduğunu bilir ve onu 32Bit olarak çalıştırır.  Bkz Wow.

SercanTEK

Alıntı yapılan: tunayk - 07 Temmuz 2018, 01:15:49Delphi tarafında nasıldır bilemiyorum ancak benzer olduğunu düşünüyorum.  Visual Studio da özel olarak 32Bit derle demezsiniz,Default olarak Any Cpu olarak derlenir ve derleme içinde  32Bit kütüphane kullanmanıza kızmaz. Ancak uygulama çalıştırılınca sizinki gibi hata verir. Fakat böyle bir uygulamayı 32Bit Cpu için derle dediğinizde derleme komple 32Bit olarak yapılır ve bu uygulama Win64 üzerinde sorunsuz çalışır.  Windows bunun kesin olarak 32Bit olduğunu bilir ve onu 32Bit olarak çalıştırır.  Bkz Wow.


Derleme Sonucunda ortaya çıkan exe 32 bit olacak şekilde ayarlıyorum. Sorun sanki synapse kütüphanesinde de gibi. win7 kurup sanalda derleyeceğim.
Hayat sadece bir araçtır amaca ulaşmak için; Amaç ise Hayata birşeyler Katmaktır Benim için.. www.sercanca.com

SercanTEK

Alıntı yapılan: SercanTEK - 07 Temmuz 2018, 00:09:30Merhaba,

Geçmişte yazdığım bir uygulamayı geliştirmek istedim. Zamanında win7 32 bit , Delphi 2009 kullanarak yazdığım uygulama win10 64 bit , Delphi 10.2 Tokyo ile açıp derleyince derleniyor ama maalesef hata alıyorum.

Uygulamada kullandığım API içinde synapse Library kullanılmış. Uygun sürümü buldum ve ekledim. herşey güzel derliyor ama çalışmıyor.

Delphi 2010 kurdum onda da aynı sorun. Sorun neyden bulamadım. eskiden derlediğim uygulama çalışıyor. ama yeni derleyince çalışmıyor.

API Kütüphanesi     : https://wiki.mikrotik.com/wiki/API_Delphi_Client

Synapse Kütüphanesi : http://synapse.ararat.cz/lib/exe/fetch.php/file:synapse40.zip


Aldığım Hata :
---------------------------
Access violation at address 004B7BA9 in module 'Project1.exe'. Read of address 0000000C.
---------------------------

Olmazsa Kütüphaneyi İndy kullanarak düzenleyeceğim. yada win7 32 bit kurup orada derlemeyi deneceğim. Sorun synapse ile delphi yada işletim sistemi uyumsuzluğu mu anlamadım.


Çok uğraştım ama Maalesef çözemedim. Synapse Kütüphanesi yerine indy yi kullandım. Kodu ona göre tekrar düzenledim. Ama hep sorun yaşadım. Lazarus ile denedim gene sorun yaşadım.

Pes ettim ve Delphi 2009 indirip kurdum. Synapse ve API orjinal halde derledim ve derlendi. Uygulamam çalıştı.

Öncesinde Delphi2010 ilede denemiştim. Onda da olmamıştı.

Delphi2009 ve Delphi 10.2 Tokyo kurulu duruma göre birini kullanıp yoluma devam edeceğim.
Hayat sadece bir araçtır amaca ulaşmak için; Amaç ise Hayata birşeyler Katmaktır Benim için.. www.sercanca.com

engerex

Merhaba,
Kodları görmeden bir şey demek zor. Aklıma gelen en kritik olay unicode. Delphi unicode desteğini yanlışım yoksa 2009 sürümü civarında aldı. Synapse ve kendi kod tarafında bunu kontrol edmeni öneririm.
Aynıca tokyo ile yeni proje oluşturup dosları kopyala yapıştır ile eski projeden çekerek deneyebilirsin (Kesinlikle dosyaları kopyala yapıştır yapma).

SercanTEK

09 Temmuz 2018, 04:11:43 #7 Son düzenlenme: 09 Temmuz 2018, 04:13:29 SercanTEK
Alıntı yapılan: engerex - 09 Temmuz 2018, 01:03:49Merhaba,
Kodları görmeden bir şey demek zor. Aklıma gelen en kritik olay unicode. Delphi unicode desteğini yanlışım yoksa 2009 sürümü civarında aldı. Synapse ve kendi kod tarafında bunu kontrol edmeni öneririm.
Aynıca tokyo ile yeni proje oluşturup dosları kopyala yapıştır ile eski projeden çekerek deneyebilirsin (Kesinlikle dosyaları kopyala yapıştır yapma).

Kodların bazı yerlerine log ekledim. En son takıldığı yer soket açıp bir yerde cevap beklemesi ve Timeout vermesi. Ama Tokyo sürümünde derleyince böyle bir hata çıkıyor.

Delphi2009 ile derleyip deneyince herşey normal.

Kodları eklerim ama fiziksel bir cihaza bağlandığı icin deneme yapmanız imkansız.

Unicode icin Synapse nin destekli versiyonu buldum. Derlemede sorun yaşamıyorum.

İlginç ki Lazarusta benzer şekilde sorunlu.

Pc yi açınca kodları eklerim.

Aklıma 2009 da api kütüphanesini dll olarak derleyip Tokyo da uygulamayı geliştirmek geldi. Gerçi icinde 2 tane class tanımlanmış. Export edebilirmiyim bilmiyorum.

Api kütüphanesi.

https://github.com/Chupaka/Delphi-RouterOS-API/releases

Hayat sadece bir araçtır amaca ulaşmak için; Amaç ise Hayata birşeyler Katmaktır Benim için.. www.sercanca.com

SercanTEK

Kullandığım API Dosyası aşağıdaki gibi.

Bunu DLL olarak derlemek istiyorum. iki adet class var ve bunları kullanmak istiyorum.

DLL maceram çok yok.

 TRosApiClient , TRosApiResult

Kod Seç
{*******************************************************************************

Author:        Pavel Skuratovich (aka Chupaka), MinskBelarus
Description
:   Implementation of MikroTik RouterOS API Client
Version
:       1.2
E
-Mail:        chupaka@gmail.com
Support
:       http://forum.mikrotik.com/viewtopic.php?t=31555
Dependencies:  Uses Ararat Synapse Library (http://synapse.ararat.cz/)
Legal issues:  Copyright © by Pavel Skuratovich

               This source code is provided 
'as-is'without any express or
               
implied warrantyIn no event will the author be held liable
               
for any damages arising from the use of this software.

               
Permission is granted to anyone to use this software for any
               purpose
including commercial applications, and to alter it
               
and redistribute it freelysubject to the following
               restrictions
:

               
1. The origin of this software must not be misrepresented,
                  
you must not claim that you wrote the original software.
                  If 
you use this software in a productan acknowledgment
                  in the product documentation would be appreciated but is
                  not required
.

               
2. Altered source versions must be plainly marked as such, and
                  
must not be misrepresented as being the original software.

               
3. This notice may not be removed or altered from any source
                  distribution
.

********************************************************************************

  
API over TLS notes:

    
Added in RouterOS v6.1Only TLS without certificate is currently supported.
    
Add 'ssl_openssl' to your project uses
    
(http://synapse.ararat.cz/doku.php/public:howto:sslplugin)
    
and then call TRosApiClient.SSLConnect() instead of TRosApiClient.Connect()

********************************************************************************

Version history:
1.2     June 122013
        Added basic support 
for API over TLS

1.1     November 5
2009
        Delphi 2009 compatibility 
(thanks to Anton Ekermans for testing)
        
Requires Synapse Release 39

1.0     May 1
2009
        First 
public release

0.1     April 18
2009
        Unit was rewritten to implement database
-like interface

0.0     May 102008
        The beginning

*******************************************************************************}

unit RouterOSAPI;

interface

uses
  SysUtils
ClassesStrUtilsblcksocksynautilsynsocksynacode;

type
  TRosApiWord 
record
    Name
,
    
ValueAnsiString;
  
end;

  
TRosApiSentence = array of TROSAPIWord;

  
TRosApiClient = class;

  
TRosApiResult = class
  private
    
ClientTROSAPIClient;
    
TagAnsiString;
    
Sentences: array of TRosApiSentence;
    
FTrapBoolean;
    
FTrapMessageAnsiString;
    
FDoneBoolean;

    
constructor Create;

    function 
GetValueByName(const NameAnsiString): AnsiString;
    function 
GetValuesTRosApiSentence;
    function 
GetEofBoolean;
    function 
GetRowsCountInteger;
  public
    
property ValueByName[const NameAnsiString]: AnsiString read GetValueByName; default;
    
property ValuesTRosApiSentence read GetValues;
    function 
GetOne(const WaitBoolean): Boolean;
    function 
GetAllBoolean;

    
property RowsCountInteger read GetRowsCount;

    
property EofBoolean read GetEof;
    
property TrapBoolean read FTrap;          
    
property DoneBoolean read FDone;
    
procedure Next;

    
procedure Cancel;
  
end;

  
TRosApiClient = class
  private
    
FNextTagCardinal;
    
FSockTTCPBlockSocket;
    
FTimeoutInteger;

    
FLastErrorAnsiString;

    
Sentences: array of TRosApiSentence;

    function 
SockRecvByte(out bByte; const WaitBoolean True): Boolean;
    function 
SockRecvBufferStr(LengthCardinal): AnsiString;

    
procedure SendWord(sAnsiString);

    function 
RecvWord(const WaitBooleanout wAnsiString): Boolean;
    function 
RecvSentence(const WaitBooleanout seTROSAPISentence): Boolean;
    function 
GetSentenceWithTag(const TagAnsiString; const WaitBooleanout SentenceTROSAPISentence): Boolean;
    
procedure ClearSentenceTag(var SentenceTRosApiSentence);
    function 
DoLogin(const UsernamePasswordAnsiString): Boolean;
  public
    function 
Connect(const HostnameUsernamePasswordAnsiString; const PortAnsiString '8728'): Boolean;
    function 
SSLConnect(const HostnameUsernamePasswordAnsiString; const PortAnsiString '8729'): Boolean;
    function 
Query(const Request: array of AnsiString;
      const 
GetAllAfterQueryBoolean): TROSAPIResult;
    function 
Execute(const Request: array of AnsiString): Boolean;

    
property TimeoutInteger read FTimeout write FTimeout;
    
property LastErrorAnsiString read FLastError;

    
constructor Create;
    
destructor Destroyoverride;
    
    
procedure Disconnect;

    function 
GetWordValueByName(SentenceTROSAPISentenceNameAnsiString;
      
RaiseErrorIfNotFoundBoolean False): AnsiString;
  
end;

implementation

{******************************************************************************}

function 
HexToStr(hexAnsiString): AnsiString;
const
  
Convert: array['0'..'f'of SmallInt =
    ( 
0123456789,-1,-1,-1,-1,-1,-1,
     -
1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -
1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -
1,10,11,12,13,14,15);
var
  
iInteger;
begin
  Result 
:= '';

  if 
Length(hexmod 2 <> 0 then
    raise Exception
.Create('Invalid hex value'at @HexToStr;

  
SetLength(ResultLength(hexdiv 2);

  for 
:= 1 to Length(hexdiv 2 do
  
begin
    
if not (hex[1in ['0'..'9''a'..'f']) or not (hex[2in ['0'..'9''a'..'f']) then
      raise Exception
.Create('Invalid hex value'at @HexToStr;
    
Result[i] := AnsiChar((Convert[hex[1]] shl 4) + Convert[hex[2]]);
  
end;
end;

{******************************************************************************}

constructor TRosApiResult.Create;
begin
  inherited Create
;
  
FTrap := False;
  
FTrapMessage := '';
  
FDone := False;
  
SetLength(Sentences0);
end;

{******************************************************************************}

constructor TRosApiClient.Create;
begin
  inherited Create
;
  
FNextTag := 1;
  
FTimeout := 30000;
  
FLastError := '';
  
FSock := TTCPBlockSocket.Create;
end;
          
{******************************************************************************}

destructor TRosApiClient.Destroy;
begin
  FSock
.Free;
  
inherited Destroy;
end;
         
{******************************************************************************}

function 
TRosApiClient.Connect(const HostnameUsernamePasswordAnsiString; const PortAnsiString '8728'): Boolean;
begin
  FLastError 
:= '';
  
FSock.CloseSocket;
  
FSock.LineBuffer := '';
  
FSock.Connect(HostnamePort);
  
Result := FSock.LastError 0;
  
FLastError := FSock.LastErrorDesc;
  if 
not Result then Exit;

  
Result := DoLogin(UsernamePassword);
end;
                       
{******************************************************************************}

function 
TRosApiClient.SSLConnect(const HostnameUsernamePasswordAnsiString; const PortAnsiString '8729'): Boolean;
begin
  
if FSock.SSL.LibName 'ssl_none' then
  begin
    FLastError 
:= 'No SSL/TLS support compiled';
    
Result := False;
    Exit;
  
end;

  
FLastError := '';
  
FSock.CloseSocket;
  
FSock.LineBuffer := '';
  
FSock.Connect(HostnamePort);
  
Result := FSock.LastError 0;
  
FLastError := FSock.LastErrorDesc;
  if 
not Result then Exit;

  
FSock.SSL.Ciphers := 'ADH';
  
FSock.SSL.SSLType := LT_TLSv1;
  
FSock.SSLDoConnect;
  
Result := FSock.LastError 0;
  
FLastError := FSock.LastErrorDesc;
  if 
not Result then Exit;

  
Result := DoLogin(UsernamePassword);
end;

{******************************************************************************}

function 
TRosApiClient.DoLogin(const UsernamePasswordAnsiString): Boolean;
var
  
ResRes2TRosApiResult;
begin
  Result 
:= False;

  
Res := Query(['/login'], True);
  if 
Res.Values[0].Name '!done' then
  begin
    Res2 
:= Query(['/login''=name=' Username'=response=00' +
      
StrToHex(MD5(#0 + Password + HexToStr(Res['=ret'])))], True);
    
if Res2.Trap then
      FSock
.CloseSocket
    
else
      
Result := True;
    
Res2.Free;
  
end
  
else
    
raise Exception.Create('Invalid response: ''' Res.Values[0].Name ''', expected ''!done''');
  
Res.Free;
end;

{******************************************************************************}

procedure TRosApiClient.Disconnect;
begin
  FSock
.CloseSocket;      
  
FSock.LineBuffer := '';
end;
      
{******************************************************************************}

function 
TRosApiClient.SockRecvByte(out bByte; const WaitBoolean True): Boolean;
begin
  Result 
:= True;

  if 
Wait then
    b 
:= FSock.RecvByte(FTimeout)
  else
    
:= FSock.RecvByte(0);

  if (
FSock.LastError WSAETIMEDOUT) and (not Waitthen
    Result 
:= False;
  if (
FSock.LastError WSAETIMEDOUT) and Wait then
    raise Exception
.Create('Socket recv timeout in SockRecvByte');
end;
     
{******************************************************************************}

function 
TRosApiClient.SockRecvBufferStr(LengthCardinal): AnsiString;
begin
  Result 
:= FSock.RecvBufferStr(LengthFTimeout);

  if 
FSock.LastError WSAETIMEDOUT then
  begin
    Result 
:= '';
    
raise Exception.Create('Socket recv timeout in SockRecvBufferStr');
  
end;
end;
       
{******************************************************************************}

procedure TRosApiClient.SendWord(sAnsiString);
var
  
lCardinal;
begin
  l 
:= Length(s);
  if 
< $80 then
    FSock
.SendByte(l) else
  if 
< $4000 then begin
    l 
:= or $8000;
    
FSock.SendByte((l shr 8) and $ff);
    
FSock.SendByte(and $ff); end else
  if 
< $200000 then begin
    l 
:= or $c00000;
    
FSock.SendByte((l shr 16) and $ff);
    
FSock.SendByte((l shr 8) and $ff);
    
FSock.SendByte(and $ff); end else
  if 
< $10000000 then begin          
    l 
:= or $e0000000;
    
FSock.SendByte((l shr 24) and $ff);
    
FSock.SendByte((l shr 16) and $ff);
    
FSock.SendByte((l shr 8) and $ff);
    
FSock.SendByte(and $ff); end
  
else begin
    FSock
.SendByte($f0);
    
FSock.SendByte((l shr 24) and $ff);
    
FSock.SendByte((l shr 16) and $ff);
    
FSock.SendByte((l shr 8) and $ff);
    
FSock.SendByte(and $ff);
  
end;

  
FSock.SendString(s);
end;

{******************************************************************************}

function 
TRosApiClient.Query(const Request: array of AnsiString;
  const 
GetAllAfterQueryBoolean): TROSAPIResult;
var
  
iInteger;
begin
  FLastError 
:= '';

  
//Result := nil;
  // if not FSock.Connected then Exit;

  
Result := TRosApiResult.Create;
  
Result.Client := Self;
  
Result.Tag := IntToHex(FNextTag4);
  
Inc(FNextTag);

  for 
:= 0 to High(Request) do
    
SendWord(Request[i]);
  
SendWord('.tag=' Result.Tag);
  
SendWord('');

  if 
GetAllAfterQuery then
    
if not Result.GetAll then
      raise Exception
.Create('Cannot GetAll: ' LastError);
end;

{******************************************************************************}

function 
TRosApiClient.RecvWord(const WaitBooleanout wAnsiString): Boolean;
var
  
lCardinal;
  
bByte;
begin
  Result 
:= False;
  if 
not SockRecvByte(bWaitthen Exit;
  
Result := True;

  
:= b;

  if 
>= $f8 then
    raise Exception
.Create('Reserved control byte received, cannot proceed') else
  if (
and $80) = 0 then
    
else
  if (
and $c0) = $80 then begin
    l 
:= (and not $c0shl 8;
    
SockRecvByte(b);
    
:= bend else
  if (
and $e0) = $c0 then begin
    l 
:= (and not $e0shl 8;
    
SockRecvByte(b);
    
:= (bshl 8;
    
SockRecvByte(b);
    
:= bend else
  if (
and $f0) = $e0 then begin
    l 
:= (and not $f0shl 8;
    
SockRecvByte(b);
    
:= (bshl 8;
    
SockRecvByte(b);
    
:= (bshl 8;
    
SockRecvByte(b);
    
:= bend else
  if (
and $f8) = $f0 then begin
    SockRecvByte
(b);
    
:= b shl 8;
    
SockRecvByte(b);
    
:= (bshl 8;
    
SockRecvByte(b);
    
:= (bshl 8;
    
SockRecvByte(b);
    
:= b;
  
end;

  
:= SockRecvBufferStr(l);
end;
      
{******************************************************************************}

function 
TRosApiClient.RecvSentence(const WaitBooleanout seTROSAPISentence): Boolean;
var
  
pInteger;
  
wAnsiString;
begin
  repeat
    
if RecvWord(Waitwthen
    begin                        
      SetLength
(se1);
      
se[0].Name := w;
    
end
    
else
    
begin
      Result 
:= False;
      Exit;
    
end;
  
until w <> '';

  
repeat
    
if RecvWord(Truewthen
    begin
      
if '' then
      begin
        Result 
:= True;
        Exit;
      
end
      
else
      
begin
        SetLength
(seHigh(se) + 2);
        
:= PosEx('='w2);
        if 
0 then
          se
[High(se)].Name := w
        
else
        
begin
          se
[High(se)].Name := Copy(w11);
          
se[High(se)].Value := Copy(w1Length(w) - p);
        
end;
      
end;
    
end
    
else
    
begin
      Result 
:= False;
      Exit;
    
end;
  
until False;
end;
      
{******************************************************************************}

function 
TRosApiClient.GetSentenceWithTag(const TagAnsiString; const WaitBooleanout SentenceTROSAPISentence): Boolean;
var
  
ijInteger;
  
seTRosApiSentence;
begin
  Result 
:= False;
  
  for 
:= 0 to High(Sentences) do
  
begin
    
if GetWordValueByName(Sentences[i], '.tag') = Tag then
    begin
      Sentence 
:= Sentences[i];
      
ClearSentenceTag(Sentence);
      for 
:= i to High(Sentences) - do
        
Sentences[j] := Sentences[1];
      
SetLength(SentencesHigh(Sentences));
      
Result := True;
      Exit;
    
end;
  
end;

  
repeat
    
if RecvSentence(Waitsethen
    begin
      
if GetWordValueByName(se'.tag'True) = Tag then
      begin
        Sentence 
:= se;
        
ClearSentenceTag(Sentence);
        
Result := True;
        Exit;
      
end;

      
SetLength(SentencesHigh(Sentences) + 2);
      
Sentences[High(Sentences)] := se;
    
end
    
else
      Exit;
  
until False;
end;

{******************************************************************************}

procedure TRosApiClient.ClearSentenceTag(var SentenceTRosApiSentence);
var
  
ijInteger;
begin
  
for := High(Sentencedownto 0 do
    if 
Sentence[i].Name '.tag' then
    begin
      
for := i to High(Sentence) - do
        
Sentence[j] := Sentence[1];
      
SetLength(SentenceHigh(Sentence));
    
end;
end;

{******************************************************************************}

function 
TRosApiClient.GetWordValueByName(SentenceTROSAPISentenceNameAnsiString;
  
RaiseErrorIfNotFoundBoolean False): AnsiString;
var
  
iInteger;
begin
  Result 
:= '';
  for 
:= 1 to High(Sentence) do         
    if (
Sentence[i].Name '=' Name) or (Sentence[i].Name Namethen
    begin
      Result 
:= Sentence[i].Value;
      Exit;
    
end;

  if 
RaiseErrorIfNotFound then
    raise Exception
.Create('API Word ''' Name ''' not found in sentence');
end;
        
{******************************************************************************}

function 
TRosApiResult.GetValueByName(const NameAnsiString): AnsiString;
begin
  
if High(Sentences) = -1 then
    raise Exception
.Create('No values - use Get* first?')
  else
    
Result := Client.GetWordValueByName(Sentences[0], Name);
end;

{******************************************************************************}

function 
TRosApiResult.GetValuesTRosApiSentence;
begin
  
if High(Sentences) = -1 then
    raise Exception
.Create('No values - use Get* first?')
  else
    
Result := Sentences[0];
end;

{******************************************************************************}

function 
TRosApiResult.GetOne(const WaitBoolean): Boolean;
begin
  Client
.FLastError := '';
  
FTrap := False;

  
SetLength(Sentences1);

  
Result := Client.GetSentenceWithTag(TagWaitSentences[0]);
  if 
not Result then Exit;

  if 
Sentences[0][0].Name '!trap' then
  begin
    FTrap 
:= True;
    
Client.FLastError := Self['=message'];
  
end;

  
FDone := Sentences[0][0].Name '!done';
end;

{******************************************************************************}

function 
TRosApiResult.GetAllBoolean;
var
  
seTRosApiSentence;
begin
  Client
.FLastError := '';
  
FTrap := False;

  
repeat
    Result 
:= Client.GetSentenceWithTag(TagTruese);
    if 
Result then
    begin
      
if se[0].Name '!trap' then
      begin
        FTrap 
:= True;
        if 
Client.FLastError <> '' then
          Client
.FLastError := Client.FLastError '; ';
        
Client.FLastError := Client.FLastError Client.GetWordValueByName(se'=message');
      
end else
      if 
se[0].Name '!done' then
      begin
        FDone 
:= True;
        if 
High(se) > 0 then
        begin
          SetLength
(SentencesHigh(Sentences) + 2);
          
Sentences[High(Sentences)] := se;
        
end;

        Exit;
      
end
      
else
      
begin
        SetLength
(SentencesHigh(Sentences) + 2);
        
Sentences[High(Sentences)] := se;
      
end;
    
end;
  
until False;
end;

{******************************************************************************}

function 
TRosApiResult.GetEofBoolean;
begin
  Result 
:= High(Sentences) = -1;
end;

{******************************************************************************}

function 
TRosApiResult.GetRowsCountInteger;
begin
  Result 
:= Length(Sentences);
end;

{******************************************************************************}

procedure TRosApiResult.Next;
var
  
iInteger;
begin
  Client
.FLastError := '';

  for 
:= 0 to High(Sentences) - do
    
Sentences[i] := Sentences[1];
  
SetLength(SentencesHigh(Sentences));
end;

{******************************************************************************}

procedure TRosApiResult.Cancel;
begin
  
if not Client.Execute(['/cancel''=tag=' Tag]) then
    raise Exception
.Create('Cannot cancel: ' Client.LastError);
end;

{******************************************************************************}

function 
TRosApiClient.Execute(const Request: array of AnsiString): Boolean;
var
  
ResTRosApiResult;
begin
  Res 
:= Query(RequestTrue);
  
Result := not Res.Trap;
  
Res.Free;
end;

{******************************************************************************}

end.

Hayat sadece bir araçtır amaca ulaşmak için; Amaç ise Hayata birşeyler Katmaktır Benim için.. www.sercanca.com

SercanTEK

Neyseki Sorun çözüldü. Artık Delphi 10.2 Tokyo ve Lazarus ile derleyip uygulamayı çalıştırıyorum.

Şansmıdır bilmiyorum ama dün işletim sistemi çöktü. Bende yedeklerimi alıp Format attım. herşeyi kurdum. Bu sorunu çözmek için delphi başına oturunca derledim ve çalıştı. Bağlantı kurduğumda herşey normaldi.

nitekim sanırım işletim sisteminde sorun vardı. çünkü socket bağlantısı timeout hatası alıyordum.

Synapse40 kullandım.
Hayat sadece bir araçtır amaca ulaşmak için; Amaç ise Hayata birşeyler Katmaktır Benim için.. www.sercanca.com