Newsgroup: it.comp.lang.delphi
Titolo: Parametri stringa in Funzioni Callback con dll in C

Salve a tutti,
dopo qualche giorno di studio (del newsgroup e altrove) sul tema mi
trovo costretto a chiedere un aiuto.
Usando Delphi 6 devo interfacciarmi con uno scrittore di DVD della
Rimage; nel sdk sono fornite oltre che le interfacce per .NET e Java
anche una dll da usare con C/C++/VB. Speravo fosse COM per usare
l'Import Type Library, unica mia esperienza sul tema precedente, ma
invece ho solo una libreria di funzioni.
Per inesperienza mi sono basato sugli esempi in VB "traducendoli" in
Delphi (e qui credo stia l'errore :-( ).
Innanzi tutto come faccio a conoscere i metodi contenuti nella dll?
Il problema poi è nella gestione delle funzioni di callback.
Intanto, come modo di creare e registrare le callback è corretto dove
in VB c'era:
Public Declare Function RCA_submitDurableImageOrderBstr Lib
"RmClient_6_3_n_1.dll" _
    (ByRef orderDesc As RCA_image_order_description, _
     ByVal xmlOrder As String, _
     ByVal orderStatusCallback As Long) As Integer
Public Function orderStatusCallback(ByVal orderStatus As String) As
Long
    sCallback = orderStatus
    sFlag = "1"
End Function
...
ret = RCA_submitDurableProductionOrderBstr(pod, xmlProductionOrder,
AddressOf orderStatusCallback)
Scrivere in Delphi:
Function RCA_submitDurableImageOrderBstr (var orderDesc :
RCA_image_order_description; xmlOrder : String; orderStatusCallback :
TProcedure): Integer;  stdcall; external 'RmClient_6_3_n_1.dll';
Function orderStatusCallback(  orderStatus : String) : integer;
begin
  sCallback:=orderStatus;
  sFlag := '1';
end;
...
RCA_submitDurableImageOrderBstr(iod, xmlImageOrder,
@orderStatusCallback);
Almeno la callback ritorna... ma cosa mai mi serve l'integer (long in
VB) risultato della funzione?
Però, ed è il caso del metodo sopra, mi torna nella variabile
orderStatus che io ho messo come String un insieme di caratteri + o -
corretti ma intervallati da #0. Come dovrei passare i parametri
correttamente per avere la stringa giusta?
Altro problema è il fatto che se, oltre a registrare la Callback
orderStatusCallback per avere dati sullo stato dell'ordine, allo stesso
tempo ne registro un'altra per lo stato del server in ascolto, mi torna
questa ma non + la prima, dipende da me o dalla dll? Devo fare una
registrazione alla volta?
Grazie mille dell'aiuto
Matteo

 correttamente per avere la stringa giusta?
l'argomento è vasto:
http://groups.google.it/groups?hl=it&q=passing%20string%20delphi%20DLL&sa=N
&tab=wg
io ho usato a volte questo sistema, per passare stringhe (sempre come array 
di caratteri) tra DLL Delphi e codice VB:
**********codice DLL delphi ridotto all'osso************
library ABC_DLL;
function GetResult(Value: Double): string;
{ elabora il risultato come stringa }
begin
  {...}
end;
procedure ABC(Value: Double; Buf: PChar; MaxLen: LongInt); stdcall;
var
  cResult: PChar;
begin
  try                   //nessuna eccezione deve sfuggire da qui!!!
    if {...} then
      cResult:= '|overflow|'
    else
      cResult:= PChar(GetResult(Value));
    StrLCopy(Buf, cResult, MaxLen - 1); //-1 because of terminating #0
  except
    StrLCopy(Buf, #0, MaxLen - 1);
  end
end;
exports
  NumToText;
begin
end.
*********lato Visual Basic*********************
'codice di un modulo
Option Explicit
Declare Sub ABC Lib "ABC_DLL.DLL" (ByVal dValue As Double, ByVal lpBuf As 
String, ByVal MaxLen As Long)
Private Function InternalTrim(s As String) As String
Dim lCounter As Long, bChar As Byte
 
    InternalTrim = ""
    For lCounter = 1 To Len(s)
        bChar = Asc(Mid$(s, lCounter, 1))
        If bChar = 0 Then
            Exit For
        Else
            InternalTrim = InternalTrim & Chr(bChar)
        End If
    Next lCounter
 
End Function
Function ABC(Value As Double) As String
Dim Result As String * 500
    ABC Value, Result, Len(Result)
    ABC = InternalTrim(Result)
End Function
-- 
Mauro Falzari 
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

 end.


Grazie mille Mauro per l'aiuto.
Adesso riesco a gestire la stringa ritornata, la soluzione è stata
utilizzare PWideChar al posto del normale PChar e poi "parsare" i
caratteri ascii inutili (come CR o LF) della formattazione  dell'xml
che mi davano problema.
Grazie
Ciao
Matteo