Newsgroup: it.comp.lang.delphi
Titolo: Tradurre da VB5 a D7

Ho dei problemi nel tradurre un prog. fatto in VB5 a Delphi 7 per monitorare lo stato di una linea TAPI:
VB> Dim Ret As Long
VB> Dim lpLineDevStatus As LINEDEVSTATUS
VB> 
VB> lpLineDevStatus.dwTotalSize = Len(lpLineDevStatus)
VB> Ret = lineGetLineDevStatus(TapiLine.LineHandle, lpLineDevStatus)
VB> 
VB> If Ret = 0 Then
VB>     Call StructLineDevStatus(VarPtr(lpLineDevStatus), lpLineDevStatus.dwDevSpecificOffset, lpLineDevStatus.dwDevSpecificSize)
VB> End If
VB>
VB>Private Sub StructLineDevStatus(ByVal ptrTapiStruct As Long, ByVal lngOffset As Long, ByVal lngLength As Long)
VB>    Dim Buffer() As Byte
VB>    Dim StringBuffer As String
VB>    Dim i As Integer
VB>    
VB>    ReDim Buffer(0 To lngLength - 1)
VB>    
VB>    'Questa è la riga che mi mette più in crisi per la traduzione
VB>    Call CopyMemory(Buffer(0), ByVal (ptrTapiStruct + lngOffset), lngLength)
VB>    
VB>    i = 0
VB>    StringBuffer = ""
VB>    Do While i <= UBound(Buffer)
VB>        StringBuffer = StringBuffer & CStr(Buffer(i)) & ","
VB>        i = i + 1
VB>    Loop
VB>
VB>End Sub
In StringBugffer ci sono dei valori che indicano lo stato della linea, 
ad esempio il settimo valore indica se la modalità DND è attiva
D7>var
D7>  Ret: DWORD;
D7>  lpLineDevStatus: LINEDEVSTATUS;
D7>begin
D7>
D7>  lpLineDevStatus.dwTotalSize := SizeOf(lpLineDevStatus);
D7>  Ret := lineGetLineDevStatus(TapiLine.LineHandle, @lpLineDevStatus);
D7>
D7>  if Ret = 0 then begin
D7>	  StructLineDevStatus(@lpLineDevStatus, lpLineDevStatus.dwDevSpecificOffset, lpLineDevStatus.dwDevSpecificSize);
D7>  end;
D7>
D7>end;
D7>
D7>procedure StructLineDevStatus(ptrTapiStruct: pointer; StructOffset: integer; StructSize: integer);
D7>var
D7>  Buffer: array of Byte;
D7>  StringBuffer: string;
D7>  i: integer;
D7>  Puntatore: pointer;
D7>begin
D7>
D7>  Puntatore := Pointer(LongInt(ptrTapiStruct) + StructOffset);
D7>
D7>  if StructOffset > 0 then begin
D7>    SetLength(Buffer, StructSize);
D7>    CopyMemory(Buffer, Puntatore, StructSize);
D7>  end;
D7>
D7>  StringBuffer := '';
D7>  for i := 0 to Length(Buffer) - 1 do begin
D7>    StringBuffer := StringBuffer + IntToStr(Buffer[i]) + ',';
D7>  end;
D7>
D7>end;
Il codice in D7 gira ma i valori restituiti sono completamente diversi da quelli in VB, 
io credo che il problema sia nel valore passato come secondo parametro alla CopyMemory().
Tale valore in VB è ricavato sommando al puntatore il valore dell'Offset e passando tutto poi ByRef!?
Mi sapete aiutare?

hai dato un occhio ad asynchpro?
A.

hai dato un occhio ad asynchpro?
No, ma sicuramente è un componente che gestisce le TAPI 
cmq. ho già provato ExceleTel e hbTapi, ma nessuno risolve
il mio problema poichè le informazioni che tento di recuperare
tramite la lineGetLineDevStatus() sono valori proprietari del centralino,
i componenti come quello che mensioni te gestiscono le TAPI in maniera
standard e non arrivano al mio scopo.

 standard e non arrivano al mio scopo.
Spiegati meglio per favore, perchč ritengo che con le async pro si possa
fare di tutto di piu' ;-) 
Io le ho usate per levarmi un grosso problema con un componente di un
produttore americano: per invii massivi di fax in alcune situazioni (ben
documentate) si impallava. Le TAPI lo mandavano alle ortiche, perchč
sebbene siano un framework molto comodo messo a disposizione da microsoft,
non sempre riescono a disimpegnare la linea che ti interessa.
Con adpcomport vai direttamente sulla porta fisica a parlare se tu lo vuoi.
Se non ti interessa dialogare con la COMn, allora agganciagli una
apdtapidevice e fara' lui il lavoro sporco per te.. se ancora non sei
contento aggancia a quest'ultimo un apdtapistatus e hai l'informazione
dello stato del device che ti interessa, il tutto senza aver scritto una
riga di codice...
Un saluto
-- 
Morde

fare di tutto di piu' ;-) 
Il fine ultimo è quello di sapere se un interno di un centralino Avaya 
è in modalità DND (Do Not Disturb) oppure se tale interno è o non è facente
parte di almeno un gruppo di suoneria.
Queste informazioni sono proprietarie del centralino che le rende disponibili
in termini di TAPI tramite la funzione lineGetLineDevStatus() che restituisce
una struttura di tipo LINEDEVSTATUS ma in questa struttura non sono sempre al
solito posto per tutti i centralini ma si trovano ad un certo offset e sono
di lunghezza variabile.
Ho dato un'occhiata alla documentazione di TApdTapiStatus e tale componente
trmite ApdTapiDeviceTapiStatus ritorna i soliti 3 parametri standard che non
contengono tale informazione.

 di lunghezza variabile.
E l'avaya non mette a disposizione questo mapping?
-- 
Morde