Newsgroup: it.comp.programmare.win32
Titolo: trasferimento dati a Modem

Salve a tutti,
sto realizzando un'applicazione che prevede l'uso delle TAPI versione
2.1 in ambiente Windows 9x. La gestione degli eventi è già
completamente gestita: riesco a piazzare chiamate sui vari device e a
riceverle, il problema arriva dopo:
una volta che la chiamata è 'connected', uso la funzione lineGetID per
ottenere un handle che può essere utilizzato come parametro nelle
normali funzioni Win32 per l'I/O (tipo ReadFile, WriteFile, etc.). Il
problema è proprio qui:
const char* to_write = /* indirizzo valido */
std::size_t i = /* dimensione dei dati da scrivere */
DWORD written;
BOOL write_result = ::WriteFile(callhandle, &to_write, i, &written,
NULL);
se al posto dell'ultimo NULL metto un puntatore ad una struttura di
tipo OVERLAPPED inizializzata correttamente (verificato) write_result
dopo la chiamata vale sempre 0 e una successiva GetLastError()
resituisce ERROR_INVALID_HANDLE (e qui è strano, secondo la
documentazione dovrei proprio usare la WriteFile in maniera
asincrona), se lascio NULL la funzione viene chiamata con successo se
i è minore di 668, altrimenti fallisce e GetLastError() mi da
nuovamente ERROR_INVALID_HANDLE.
Dimenticavo di dire che callhandle è senz'altro un HANDLE valido
perchè chiamando GetFileType(callhandle) restituisce un valore
corretto.
Qualcuno ha avuto lo stesso problema? Avete idea di come si faccia a
stabilire perchè è proprio 668 il valore massimo di byte da
trasmettere? Non riesco a trovare quel valore da nessuna parte!
Ringrazio tutti quelli che sono arrivati a leggere sin qui,
conto su un vostro suggerimento.

Forse l'handle che è invalido non è quello che passi come primo 
parametro ma quello che passi (o dovresti passare) all'interno della 
struttura overlapped.
Probabilmente la funzione lavora in modalità sincrona mandando 668 byte 
poichè questo è il numero di byte che la seriale (o il modem) è in grado 
di accettare nei suoi buffer senza richiedere la bufferizzazione da 
parte del S.O. (e quindi attivare il funzionamento in modalità 
asincrona).
Ho utilizzato questo sistema con le TAPI (sia 1.4 che 2.X) passando una 
struttura overlapped con l'evento.
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

 struttura overlapped con l'evento.
sviluppavi su Windows 98?

 
Solo con TAPI 1.4 (ma a questo livello non è cambiato molto da TAPI 1.X 
a 2.X).


 handle).
dunque, scrivendo 
OVERLAPPED overlap = {0};
dovrei impostare a 0 tutti i membri di overlap. Quindi gli offset (e
non solo quelli) dovrebbero essere già impostati a 0, perlomeno se il
compilatore che uso è standard compliant su questo punto (non ho
verificato ma lo farò).
Per quel che riguarda il parametro hEvent, ho provato a inizializzarlo
in tutti i modi:
overlap.hEvent = ::CreateEvent(NULL, TRUE, TRUE, NULL);
overlap.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
overlap.hEvent = ::CreateEvent(NULL, FALSE, TRUE, NULL);
overlap.hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
ma non funziona in nessun caso! sempre ERROR_INVALID_HANDLE!! booooh?

Il problema potrebbe essere collegato allo stato della chiamata. 
Non vorrei sbagliarmi, ma mi pare che l'handle ritornato da lineGetID 
sia valido solo se la chiamata cui si riferisce l'HCALL č "connesso" 
(cioč dopo che alla tua funzione callback č stato passato un messaggio 
LINE_CALLSTATE com parm1 uguale a LINECALLSTATE_CONNECTED.
Altrimenti ti consiglio di verificare se questo comportamento si 
verifica con diversi device oppure se č specifico di un dato TAPI-
provider.


 provider.
Ho provato ad installare un nuovo modem e il risultato era il medesimo
(chiamate asincrone no e sincrone sì), ma non usavo driver diversi da
quelli resi disponibili da Windows, quindi indagherò in questa
direzione. Grazie della dritta!