Newsgroup: it.comp.lang.delphi
Titolo: Chiamata con EAccessViolation di DLL sviluppata in C++

ciao a tutti...
vorrei sottoporvi questo problema a voi che siete più esperti di
quanto lo sia io.
In pratica ho una DLL in C++ che comunica via rete Ethernet con un
dispositivo, scrivendo un messaggio sul display, tramite queste
operazioni:
CONNECT ip
MSG messaggio
DISCONNECT
La funzione nella DLL è di questo tipo: int sendmsg(char *a, char *b)
dove il primo parametro è il comando, il secondo è riservato per un
ritorno con comandi particolari (tipo per ritornare il messaggio
correntemente memorizzato nel dispositivo) e ritorna un intero che è 0
se tutto ok.
Il breve programma qui di seguito, alla pressione di un pulsante, non
fa altro che aprire la connessione, mandare un messaggio e chiuderla.
Il problema è che se eseguita da Delphi va tutto bene per 8 volte,
alla nona da un errore EAccessViolation. Lo stesso accade se eseguito
come programma compilato, ma in questo caso funziona solamente una
volta e la seconda ritorna ancora EAccessViolation.
Ho provato ad usare PChar come parametri, ma non cambia nulla.
Ho provato ad effettuare una chiamata dinamica alla DLL, ma senza
risultato.
Vi ringrazio fin d'ora per ogni consiglio possiate darmi.
Marco.
------------------------------------------------------------------------------------
type
  mya= array[0..550]of char;
var
  Form1: TForm1;
function sendmsg(A: mya; Var B: mya): Integer; stdcall; external
'tc9000.dll';
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
          I: Integer;
          s: string;
          A, B: mya;
begin
          s:='CONNECT 192.168.000.055'+#0;
          fillchar(a,sizeof(a),0);
          for i:=1 to length(s) do
            a[i-1]:=s[i];
          I:=sendmsg(a, b);
          s:='MSG Messaggio di prova..'+#0;
          fillchar(a,sizeof(a),0);
          for i:=1 to length(s) do
            a[i-1]:=s[i];
          I:=sendmsg(a, b);
          s:='DISCONNECT'+#0;
          fillchar(a,sizeof(a),0);
          for i:=1 to length(s) do
            a[i-1]:=s[i];
          I:=sendmsg(a, b);
end;

: ciao a tutti...
Ciao
: In pratica ho una DLL in C++ che comunica via rete Ethernet con un
: dispositivo, scrivendo un messaggio sul display, tramite queste
: operazioni:
:
: CONNECT ip
: MSG messaggio
: DISCONNECT
:
: La funzione nella DLL è di questo tipo: int sendmsg(char *a, char *b)
: dove il primo parametro è il comando, il secondo è riservato per un
: ritorno con comandi particolari (tipo per ritornare il messaggio
: correntemente memorizzato nel dispositivo) e ritorna un intero che è 0
: se tutto ok.
: type
:   mya= array[0..550]of char;
: var
:   Form1: TForm1;
:
: function sendmsg(A: mya; Var B: mya): Integer; stdcall; external
: 'tc9000.dll';
Io proveri:
function sendmsg(A: PChar; B: PChar): Integer; stdcall; external
'tc9000.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
   I: Integer;
   a, b: array[0.255] of char;
begin
  StrPCopy(a, 'CONNECT 192.168.000.055');
  I:=sendmsg(@a[0], @b[0]);
  StrPCopy(a, 'MSG Messaggio di prova..');
  I:=sendmsg(@a[0], @b[0]);
  StrPCopy(a, 'DISCONNECT');
  I:=sendmsg(@a[0], @b[0]);
end;

 ha scritto nel messaggio 
news:nfnoa1hu0bafq31l1...@4ax.com...


Ciao di nuovo,
grazie ad entrambi per i preziosi consigli, purtroppo ho provato ad
applicarli e l'errore rimane uguale...
Diciamo che ne ho provate una serie di varianti, ma senza risultato,
eppure la DLL con un programma sviluppato in C++ dallo stesso autore
funziona alla perfezione.
La cosa strana è che se apro una connessione con CONNECT in
FormCreate, la lascio sempre aperta e provo ad inviare anche 1000
messaggi, tutto funziona. Appena la chiudo e la riapro, mi si
ripresenta l'errore. Non vorrei fosse un problema di allocazione di
memoria...
Che dite ?
Grazie ancora.
Marco

Mah.
Uso spesso DLL scritte da terze parti integrandole nelle  mie applicazioni
Delphi ed in genere, facendo come ti ho suggerito, non ho errori ...
Vuoi provare a mandarmi la dll che provo (stamattina l'itaGliano non è il
mio forte....) ?
phora at tiscali punto it
Ciao