Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa prevođenjem f-ja iz C .dll fajla

[es] :: Pascal / Delphi / Kylix :: Problem sa prevođenjem f-ja iz C .dll fajla

[ Pregleda: 2845 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

dogriz
Sombor

Član broj: 29744
Poruke: 259
*.dynamic.sbb.rs.

Sajt: dogriz.blogspot.com


+6 Profil

icon Problem sa prevođenjem f-ja iz C .dll fajla07.07.2009. u 21:38 - pre 179 meseci
Navedene f-je treba da prevedem u Delphi i delimično sam u tome uspeo, ali f-ju ReadWriteSComm nikako ne mogu.

Znači imam ovo:
Code:
////////////////////////////////////////////////////////////////////
// void*    CreateSPort( void )
//
// Returns: If create successfully return the pointer of Item object that
//            represents the communication object that is created. otherwise return NULL
// Effect:    Use the method to create a objec for communication to a serial device

//Delphi:
function CreateSPort: THandle; stdcall; external 'SoyalComm.dll' name 'CreateSPort';


////////////////////////////////////////////////////////////////////
// BOOL        OpenSComm( void *pComm, int Port )
// In :        Communication Object address, that create by CreateSPort
//            Serial port number        ( Ex: 0 for port COM1, 1 for port COM2 )
// Returns: Nonzero if the opening was successful
// Effect:    Connect the communication object to serial port in 9600,N,8,1

//Delphi:
function OpenSComm(Handle: THandle; ComPort: Integer): Boolean; stdcall; external 'SoyalComm.dll' name 'OpenSComm';


////////////////////////////////////////////////////////////////////
// BOOL        ReadWriteSComm( void *pComm, BYTE* TxBfx, BYTE* RxBfx, WORD* pLen )
// In :        Communication Object address, that create by CreateSPort
//            TxBfx:    Address of data block to transmit
//            RxBfx:    reserved memory block to receive data
//            SendLength: number of bytes to transmit
// Returns: Nonzero if all bytes transmited and put the received bytes in *pLen
// Effect:    Transmits *pLen bytes of data from TxBfx to the serial port,
//            and receive the return data in RxBfx

//Delphi:
function ReadWriteSComm(Handle: THandle; TxBfx: TBuff; RxBfx: TBuff; SendLength: Word): Boolean; stdcall; external 'SoyalComm.dll' name 'ReadWriteSComm';
// TBuff je array[0..255] of Byte

Greška se javlja kad hoću da upišem nešto na serijski port koristeći gore navedenu problematičnu funkciju:
Code:
procedure TForm1.btnSendClick(Sender: TObject);
var
  TxBfx: TBuff;
  RxBfx: TBuff;
  n: Word;
begin
  TxBfx[0] := $7E;
  TxBfx[1] := $04;
  TxBfx[2] := $01;
  TxBfx[3] := $04;
  TxBfx[4] := $FA;
  TxBfx[5] := $FF;
  n := 6;
  if ReadWriteSComm(Handle, TxBfx, RxBfx, n) then
    ShowMessage('Procitaj sta je u Rx')
  else
    ShowMessage('GRESKA!!!');
end;

CreateSPort i OpenSComm rade ok, kao i neke druge f-je koje nisam naveo, ali ReadWriteSComm ne prolazi. Da li grešim u samom prevođenju funkcije ili je problem sasvim nešto drugo?
U prilogu je .h fajl na osnovu kojeg radim. Inače radi se o Soyal Smart Card Readeru i njegovom SDK-u.

SoyalComm.h:
Code:
////////////////////////////////////////////////////////////////////////////////////////
// Header file : SoyalComm.h
//
//         Copyright (c), Soyal Technology Co., LTD. TAIWAN
//        
//    SoyalComm.DLL :        Version 1.01    2004,JUL,08
//        SOYAL PROTOCOL multi port driver for WIN32
//
// All rights are reserved. Reproduction in whole or in part is prohibited
//      without the written consent of the copyright owner.
// Soyals reserves the right to make changes without notice at any time.
// Soyals makes no warranty, expressed, implied or statutory, including but
//        not limited to any implied warranty of merchantability or fitness for
//        any particular purpose.
// Soyals must not be liable for any loss or damage arising from its use.
//

////////////////////////////////////////////////////////////////////
// BOOL        IsPortAvailable( int CommPort )
// In :        Serial port number (0 ... n) for COM:1 ... COM:n+1
// Returns: If the port is available or not
//

////////////////////////////////////////////////////////////////////
// void*    CreateSPort( void )
//
// Returns: If create successfully return the pointer of Item object that 
//            represents the communication object that is created. otherwise return NULL
// Effect:    Use the method to create a objec for communication to a serial device 
//

////////////////////////////////////////////////////////////////////
// BOOL        DeleteSPort( void *pComm )
// Returns:    Nonzero if successful; otherwise zero
// Effect:    Delete the object created by CreateSPort()
//

////////////////////////////////////////////////////////////////////
// BOOL        OpenSComm( void *pComm, int Port )
// In :        Communication Object address, that create by CreateSPort
//            Serial port number        ( Ex: 0 for port COM1, 1 for port COM2 )
// Returns: Nonzero if the opening was successful
// Effect:    Connect the communication object to serial port in 9600,N,8,1
//

////////////////////////////////////////////////////////////////////
// BOOL        CloseSComm( void *pComm )
// In :        Communication Object address, that create by CreateSPort
// Returns: Nonzero if the opening was successful
// Effect:    DisConnect the communication object with serial port
//

////////////////////////////////////////////////////////////////////
// BOOL        ReadWriteSComm( void *pComm, BYTE* TxBfx, BYTE* RxBfx, WORD* pLen )
// In :        Communication Object address, that create by CreateSPort
//            TxBfx:    Address of data block to transmit
//            RxBfx:    reserved memory block to receive data
//            SendLength: number of bytes to transmit
// Returns: Nonzero if all bytes transmited and put the received bytes in *pLen
// Effect:    Transmits *pLen bytes of data from TxBfx to the serial port, 
//            and receive the return data in RxBfx
//

////////////////////////////////////////////////////////////////////
// DWORD    GetSCommStatus( void *pComm )
// In :        Communication Object address, that create by CreateSPort
// Returns: Return unsigned long data of last ReadWriteSComm status
//

////////////////////////////////////////////////////////////////////
// BOOL        ConfigSComm( void *pComm, int baud )
// In :        Communication Object address, that create by CreateSPort
//            Serial port speed
// Returns: Nonzero if all bytes transmited and put the received bytes in *pLen
// Effect:    After OpenSComm the serial port parameters will be 9600,N,8,1
//            Use this function can change baud.

////////////////////////////////////////////////////////////////////
// BOOL        ConfigSCommParity( void *pComm, int baud, int Parity )
// In :        Communication Object address, that create by CreateSPort
//            Serial port speed
//            Parity: 0: Non Parity  1:Even Parity,  2:Odd Parity
// Returns: Nonzero if all bytes transmited and put the received bytes in *pLen
// Effect:    After OpenSComm the serial port parameters will be 9600,N,8,1
//            Use this function can change baud.

////////////////////////////////////////////////////////////////////////////
//    Usage:
//
//
//    #include    "SoyalComm.h"
//
// void  main()
// {
//    void*    pComm;
//    int        i;
//    WORD    nLen;
//    BYTE    TxBfx[256], RxBfx[256];
//    DWORD    deError;
//
//        //////////////////////////////////////////////////////
//        // Fine the available serial ports from COM1 ... COM6
//        for( i=0; i < 6; i++ ) {
//            if( IsPortAvailable( i ) ) {
//                // Do something like add to selection box
//            }
//        }
//
//        if( (pComm = CreateSPort()) == NULL ) {
//            printf( "Cann't create SoyalComm object !\n" );
//            return;
//        }
//
//        ////////////////////////////////////////////////////////
//        // Connect the SoyalComm object to serial port (COM1)
//        if( OpenSComm( pComm, 0 ) {
//                                    // Command of Soyal AR737H1356:
//            TxBfx[0] = 0xFF;        // Destination Node Address
//            TxBfx[1] = 0x12;        // Node information
//            TxBfx[2] = 0x02;        // Read Command
//            TxBfx[3] = 'R';            // Parameters
//            nLen = 4;
                                    // Get AR721H Node(001) Event -> TxBfx[0] = 0x01, TxBfx[1] = 0x18, nLen = 2
//            if( ReadWriteSComm( pComm, TxBfx, RxBfx, &nLen ) ) {
//                ///////////////////////////////////////////////////
//                // The Header code will be included in return data
//                // RxBfx: 7E 0C 01 ...
//                // Do something
//                //        ...
//            } else {
//                dwError = GetSCommStatus( pComm );
//                if( dwError & COMM_RXTIMEOUT ) {
//                    printf( "Timeout !\n" );
//                }
//                if( dwError & COMM_RXERRSUM ) {
//                    printf( "Check Sum Error !\n" );
//                }
//                if( dwError & COMM_TXERRLENGTH ) {
//                    printf( "Cann't send to serial port !\n" );
//                }
//            }
//            CloseSComm( pComm );
//        } else {
//            printf( "Cann't connect to serial port " );
//        }
//        DeleteSPort( pComm );
//        return;
//
// }
//

/////////////////////////////////////////////////////////////////////////////////////////
// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the SOYALCOMM_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file  
// SOYALCOMM_API functions as being imported from a DLL, wheras this DLL sees symbols
// see defined with this macro as being exported.

#ifdef __cplusplus
extern "C" {
#endif    /* __cplusplus */

#ifdef SOYALCOMM_EXPORTS
#define SOYALCOMM_API __declspec(dllexport)
#else
#define SOYALCOMM_API __declspec(dllimport)
#endif

////////////////////////////////////////////////////////////////////
// Error Conditions and return values.
#define    COMM_TXOK            0x00000001
#define    COMM_RXOK            0x00000002
#define    COMM_TXERR            0x00000004
#define    COMM_RXERR            0x00000008
#define    COMM_RXTIMEOUT        0x00000010
#define    COMM_RXHEADER        0x00000020
#define    COMM_RXLENGTH        0x00000040
#define    COMM_RXERRSUM        0x00000080
#define    COMM_RXERRXOR        0x00000100
#define    COMM_TXERRLENGTH    0x00000200
#define COMM_FRAMEERROR        0x00000400
/////////////////////////////////////////////////////////////////////
// Function Prototypes
SOYALCOMM_API BOOL    IsPortAvailable( int CommPort );
SOYALCOMM_API void*    CreateSPort( void );
SOYALCOMM_API BOOL    DeleteSPort( void *pComm );
SOYALCOMM_API BOOL    ReadWriteSComm( void *pComm, BYTE* TxBfx, BYTE* RxBfx, WORD* pLen );
SOYALCOMM_API BOOL    OpenSComm( void *pComm, int Port );
SOYALCOMM_API BOOL    CloseSComm( void *pComm );
SOYALCOMM_API DWORD    GetSCommStatus( void *pComm );
SOYALCOMM_API BOOL    ConfigSComm( void *pComm, int baud );
SOYALCOMM_API BOOL    SetCommType( void *pComm, BOOL Soyal );

#ifdef    __cplusplus
}
#endif    /*    __cplusplus */
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
93.86.221.*



+62 Profil

icon Re: Problem sa prevođenjem f-ja iz C .dll fajla08.07.2009. u 16:07 - pre 179 meseci
Upravo gresis u prevodjenju.

Evo kako treba da izgledaju tvoje funkcije:

Code:

function CreateSPort: pointer; stdcall; external 'SoyalComm.dll' name 'CreateSPort';

function OpenSComm(Handle: pointer; ComPort: Integer): Boolean; stdcall; external 'SoyalComm.dll' name 'OpenSComm';

function ReadWriteSComm(Handle: pointer; var TxBfx: TBuff; var RxBfx: TBuff; var SendLength: Word): Boolean; stdcall; external 'SoyalComm.dll' name 'ReadWriteSComm';


Pokusaj s ovim, pa javi sta si uradio. Ako slucajno bude zezala ova treca, mozemo pokusati i sa pointerom na array, mada bi trebalo da radi.

E da, ako ne volis deklaraciju "golog" pointera u kodu, mozes da deklarises svoj tip, nesto kao

Code:

type
  PHandle = pointer;


... pa sad umesto pointer stavis PHandle u deklaracije funkcija gore.


Rajko
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
93.86.221.*



+62 Profil

icon Re: Problem sa prevođenjem f-ja iz C .dll fajla09.07.2009. u 11:14 - pre 179 meseci
Naknadno sam pogledao primer upotrebe funkcija, mislim da ide jedna ispravka za trecu funkciju:

Code:

function ReadWriteSComm(Handle: pointer; var TxBfx: TBuff; var RxBfx: TBuff; SendLength: PWord): Boolean; stdcall; external 'SoyalComm.dll' name 'ReadWriteSComm';


Tip PWord je vec deklarisan negde u Delphi-ju, i bukvalno je ovo

Code:

type
  PWord = ^Word;


Javi sta si uradio... i mene kopka; nisam davno radio s nekim API-jem, pa... znas vec ;)

Rajko
 
Odgovor na temu

dogriz
Sombor

Član broj: 29744
Poruke: 259
*.dynamic.sbb.rs.

Sajt: dogriz.blogspot.com


+6 Profil

icon Re: Problem sa prevođenjem f-ja iz C .dll fajla09.07.2009. u 14:35 - pre 179 meseci
Pokušavao sam i sa pointerima, ali ne dobijam koristan rezultat.
Izvorni kod trenutno izgleda ovako:
Code:
unit unitSoyalComm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TBuff = array[0..255] of Byte;
  PWord = ^Word;
  TForm1 = class(TForm)
    lbComPorts: TListBox;
    Label1: TLabel;
    btnConnect: TButton;
    btnDisconnect: TButton;
    btnSend: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnConnectClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btnDisconnectClick(Sender: TObject);
    procedure btnSendClick(Sender: TObject);
  private
    { Private declarations }
    Handle: Pointer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

function IsPortAvailable(CommPort: Integer): Boolean; stdcall; external 'SoyalComm.dll' name 'IsPortAvailable';
function CreateSPort: Pointer; stdcall; external 'SoyalComm.dll' name 'CreateSPort';
function DeleteSPort(Handle: Pointer): Boolean; stdcall; external 'SoyalComm.dll' name 'DeleteSPort';
function OpenSComm(Handle: Pointer; ComPort: Integer): Boolean; stdcall; external 'SoyalComm.dll' name 'OpenSComm';
function CloseSComm(Handle: Pointer): Boolean; stdcall; external 'SoyalComm.dll' name 'CloseSComm';
function ReadWriteSComm(Handle: Pointer; TxBfx: TBuff; RxBfx: TBuff; SendLength: PWord): Boolean; stdcall; external 'SoyalComm.dll' name 'ReadWriteSComm';
function GetSCommStatus(Handle: Pointer): Cardinal; stdcall; external 'SoyalComm.dll' name 'GetSCommStatus';
function ConfigSComm(Handle: Pointer; Baud: Integer): Boolean; stdcall; external 'SoyalComm.dll' name 'ConfigSComm';
function ConfigSCommParity(Handle: Pointer; Baud: Integer; Parity: Integer): Boolean; stdcall; external 'SoyalComm.dll' name 'ConfigSCommParity';

implementation

{$R *.dfm}

procedure TForm1.btnConnectClick(Sender: TObject);
begin
  Handle := CreateSPort;
  if OpenSComm(Handle, StrToInt(lbComPorts.Items[lbComPorts.ItemIndex])) then
    begin
      ConfigSComm(Handle, 9600);
      ConfigSCommParity(Handle, 9600, 0); //parity none
      ShowMessage('Konektovao se!');
      ShowMessage(IntToHex(GetSCommStatus(Handle), 0));
    end
  else
    ShowMessage('Ne mogu da otvorim odabrani port');
end;

procedure TForm1.btnDisconnectClick(Sender: TObject);
begin
  CloseSComm(Handle);
  DeleteSPort(Handle);
end;

procedure TForm1.btnSendClick(Sender: TObject);
var
  TxBfx: TBuff;
  RxBfx: TBuff;
  n: Word;
begin
  TxBfx[0] := $7E;
  TxBfx[1] := $04;
  TxBfx[2] := $01;
  TxBfx[3] := $04;
  TxBfx[4] := $FA;
  TxBfx[5] := $FF;
  n := 6;
  if ReadWriteSComm(Handle, TxBfx, RxBfx, @n) then
    ShowMessage('Procitaj sta je u Rx')
  else
    ShowMessage(IntToHex(GetSCommStatus(Handle), 0));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  CloseSComm(Handle);
  DeleteSPort(Handle);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 10 do
    if IsPortAvailable(i) then
      lbComPorts.Items.Add(IntToStr(i));
end;

end.

Bez obzira na komandu koju pošaljem (TxBfx) rezultat ReadWriteSComm funkcije je uvek false i stanje koje očitam posle toga (GetSCommStatus) je uvek 11??? što nema nikakvog smisla.
Uređaj sa kojim hoću da komuniciram bi trebao da bipne ako mu pošaljem komandu za beep, ili bi trebao da mi pročita i vrati (RxBfx) broj kartice "in range".
 
Odgovor na temu

dogriz
Sombor

Član broj: 29744
Poruke: 259
*.dynamic.sbb.rs.

Sajt: dogriz.blogspot.com


+6 Profil

icon Re: Problem sa prevođenjem f-ja iz C .dll fajla09.07.2009. u 15:07 - pre 179 meseci
Još se tu nešto čudno događa, pokušao sam da se konektujem na bilo koji com port na računaru i svaka konekcija je uspešna, tj. OpenSComm je true za bilo koji serijski port. U slučaju izbora pogrešnog porta mi nije čudno da ne radi ReadWriteSComm, ali i dalje ostaje problem onog pravog porta koji se ponaša kao i ostali...
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Problem sa prevođenjem f-ja iz C .dll fajla09.07.2009. u 15:26 - pre 179 meseci
> BOOL ReadWriteSComm( void *pComm, BYTE* TxBfx, BYTE* RxBfx, WORD* pLen )

> function ReadWriteSComm(Handle: Pointer; TxBfx: TBuff; RxBfx: TBuff; SendLength: PWord): Boolean;

Nije ti dobar prevod:
function ReadWriteSComm(pComm: Pointer; TxBfx: PByte; RxBfx: PByte; pLen: PWord): BOOL;

Posle toga kreni datog primera i uradi kako je tamo. Inače da li je to neka biblioteka za komunikaciju sa serijskim portom ili specijalizovani dll za kontrolu nekog uređaja?

 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
93.86.221.*



+62 Profil

icon Re: Problem sa prevođenjem f-ja iz C .dll fajla09.07.2009. u 15:30 - pre 179 meseci
Ali, nisam video u tvom kodu da proveravas rezultat funkcije CreateSPort; treba da ga poredis sa nil (u C-u NULL).

Pokusaj i ovako da pozoves funkciju ReadWrite...

Code:

if ReadWriteSComm(Handle, @TxBfx[0], @RxBfx[0], @n) then


Ako ni ovo ne pomaze, jedino sto mi pada na pamet je tip deklaracija za funkcije stdcall. Ja ne umem da protumacim da li je proklamovana deklaracija SOYALCOMM_API ekvivalentna Delphi deklaraciji stdcall. Pokusaj ipak i sa cdecl umesto stdcall.
Zar nigde ne dobijas eksterne greske iz tog dll-a tipa EAccessViolation? To je tipicno kad je "omasena" pomenuta deklaracija funkcija.

Rajko
 
Odgovor na temu

dogriz
Sombor

Član broj: 29744
Poruke: 259
*.dynamic.sbb.rs.

Sajt: dogriz.blogspot.com


+6 Profil

icon Re: Problem sa prevođenjem f-ja iz C .dll fajla09.07.2009. u 22:29 - pre 179 meseci
Interesantno je kad te nešto neće... Na test računaru com portovi nisu ispravni (dobro da sam skontao), pa sam se prebacio na razvojnu laptop mašinu i usb com port, koji radi kako treba. Otvaranje porta sada konačno radi kako treba, ali ReadWriteSComm i dalje brlja...
Evo kako sad sve izgleda:
Code:
type
  TBuff = array[0..255] of Byte;
  PBuff = ^TBuff;
  PWord = ^Word;
...
function ReadWriteSComm(Handle: Pointer; TxBfx: PBuff; RxBfx: PBuff; SendLength: PWord): Boolean; stdcall; external 'SoyalComm.dll' name 'ReadWriteSComm';
...
if ReadWriteSComm(Handle, @TxBfx, @RxBfx, @n) then
...

A šta brlja - pa iz RxBfx iščitavam ono što sam prethodno poslao na TxBfx, a to nikako ne bi trebalo da se dogodi.
Citat:
Inače da li je to neka biblioteka za komunikaciju sa serijskim portom ili specijalizovani dll za kontrolu nekog uređaja?
Ovde se radi o kombinaciji oba - i serijska komunikacija i kontrola Soyal Smart Card Reader-a. Može to i pomoću TComPorta, AfComPorta, QCComPorta i dr. ali ne radi kako treba ni jedan, pošto su ovi Soyal uređaji dosta ćudljivi, pa sam hteo da iskoristim "native" biblioteku
Citat:
Pokusaj ipak i sa cdecl umesto stdcall
Sa cdecl dobijam "Debugger Fault Notification: Project .exe faulted with message> 'Access violation at..."
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Problem sa prevođenjem f-ja iz C .dll fajla10.07.2009. u 10:45 - pre 179 meseci
> Otvaranje porta sada konačno radi kako treba, ali ReadWriteSComm i dalje brlja...

I dalje ti nije dobar prevod, poslao sam ti ranije kako treba ta funkcija da izgleda (ti izmeni ostale). Takođe kada pozivaš tu funkciju to radi ovako:
ReadWriteSComm(Handle, @TxBfx[0], @RxBfx[0], @n)
 
Odgovor na temu

dogriz
Sombor

Član broj: 29744
Poruke: 259
*.dynamic.sbb.rs.

Sajt: dogriz.blogspot.com


+6 Profil

icon Re: Problem sa prevođenjem f-ja iz C .dll fajla10.07.2009. u 22:08 - pre 179 meseci
Dobro, promenio sam i nazive parametara u funkcijama i tipove i pozive f-ja i sve naizgled radi, pošaljem komandu i ne dobijem error, već se u RxBfx vrati određena vrednost, samo što to nije vrednost koja treba da se vrati.
Pretpostavljam da je moguć problem u .dll fajlu pošto sam i ranije imao problema u radu sa ovim uređajima, koje god kontrole da sam koristio za serijsku komunikaciju. Pošto uređaji rade po industrijskom 485 standardu, moguće je i da dolazi do izvesne nekompatibilnosti prilikom konverzije na RS232...
Tražim resources na internetu, još samo kad bih znao kineski...
 
Odgovor na temu

segment
Vesna Lazareska Arsik
Skopje, Makedonija

Član broj: 280596
Poruke: 30
77.28.68.*



Profil

icon Re: Problem sa prevođenjem f-ja iz C .dll fajla15.08.2011. u 17:50 - pre 153 meseci
Znam deka e ova stara tema ama segasen moj problem. Dali nekoj najde nekoe konacno resenie.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Problem sa prevođenjem f-ja iz C .dll fajla

[ Pregleda: 2845 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.