Newsgroup: it.comp.lang.vo-clipper
Titolo: [LUNGO e OT] funzione DOS 5Ah in win2K, XP, ME

Uso la suddetta chiamata dell'Int 21h per creare file temporanei, il
listato e' in C...ehm ASM !  La funzione viene chiamata da un'altra
funzione Clipper (5.2E) che non sto ad elencare dato che non fa altro
che passare dei parametri.
static short CreateTemp(char *path, short attrib) {
  short success = 1, doserr = 0, handle;
  _asm {
    push	ds
    lds		dx, path
    mov		ah, 05Ah
    mov		cx, attrib
    int		21h
    pop		ds
    jnc		DONE
    dec		success
    mov		doserr, ax
    xor		ax, ax
DONE:	mov	handle, ax
  }
  if (success)
    return ! Close(handle);  // Close() torna 0 se tutto OK
  return success;
}
Su win9x tutto ok, su ME/2K/XP ad un certo punto mi si esauriscono gli
handle, come se lasciassi aperti i files.  L'applicazione quindi ad un
certo punto si rifiuta di creare file temporanei, per ripristinare la
situazione e' necessario uscire dal programma, chiudere la finestra
DOS e rilanciarlo.
Controllando su win2k ho notato che i file temporanei vengono creati e
correttamente eliminati.  Pero' all'atto della eliminazione accade una
cosa strana, prima di cancellare il file, windows ne crea una copia
(why?) dandogli nome VMDxx.TMP o MVDxx.TMP non ricordo, dove xx e' un
numero progressivo, questi file evidentemente rimangono aperti e
vengono effettivamente chiusi (e cancellati) automaticamente quando
viene chiusa la finestra DOS !  Tutto questo accade solo su win2k, sul
98 questo non accade; i files generati dalla funzione 05Ah invece,
hanno un nome simile a quello degli swap-file del VM di Clipper, che
probabilmente usa la stessa funzione per generarli.
Aumentando il numero di file apribili non si risolve nulla, prima o
poi gli handle si esauriscono comunque.
ciao, acc.   
a...@libero.it

DOS e rilanciarlo.
ho fatto delle prove (su W2K) con la funzione FT_TEMPFIL() della
libreria Nanforum che utilizza appunto il DOS Interrupt 21, ma il
comportamento che segnali non si verifica.
Ho creato in sequenza 100 files temporanei, aprendoli, scrivendoci e
chiudendoli, li ho poi cancellati, e ne ho ricreati altri 100...
C'è da dire che la FT_TEMPFIL() genera dei files unici SENZA
estensione.
Potresti dare uno sguardo all'esempio allegato alla libreria,
TempFile.prg.
ciao

 handle, come se lasciassi aperti i files.
Perché questa funzione non te la scrivi direttamente in Clipper? Io
faccio proprio così per i miei file temporanei e non ho problemi sotto
XP.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

estensione.
Questa e' una prerogativa della funzione 5Ah, che tra l'altro si
comporta diversamente, mi riferisco alle regole per la creazione del
nome, a seconda della versione del sistema operativo utilizzato.
ciao, acc.   
a...@libero.it

XP.
In effetti, inizialmente avevo fatto cosi', successivamente ho deciso
di utilizzare quel servizio perche' in effetti e' piu' giusto cosi'.
Sara' anche eccessiva pignoleria, ma una funzione del genere ti mette
al riparo da possibili complicazioni, inoltre e' una funzione
piuttosto "standard", oltreche' utilizzata in diverse librerie, e
questo fatto mi ha portato a credere (o illudermi) che fosse
pienamente supportata.
Del resto l'applicativo su win98 gira da parecchio tempo senza
problemi, i files temporanei vengono creati e regolarmente cancellati.
Inoltre mi  premeva segnalare il fatto, anche perche' tutto sommato mi
pare un comportamento piuttosto "bizzarro" del sistema operativo e
onestamente non riesco a capirne l'utilita'  :-?
Oggi ho fatto la prova su winXP e posso confermare che si comporta
esattamente come win2k.
ciao, acc.   
a...@libero.it

 pienamente supportata.
Essendo una funzione DOS dubito molto del suo "pieno supporto" sotto
Windows. Windows (in particolare la famiglia NT/2000/XP) non supporta
bene neanche le sue proprie API. Io, ad esempio, trovai problemi con
l'API SetCurrentDirectory(), qualcosa che avrebbe dovuto funzionare
benissimo su tutte le versioni di Windows e invece cosě non č. Scrivendo
la funzione in Clipper (o comunque creando autonomamente il file
temporaneo) ti metti, invece, veramente al riparo dalle "pazzie" della
MS (almeno si spera...).


MS (almeno si spera...).
Enrico su  questo punto credo siamo d'accordo, la mia "fiducia" verso
m$ non e' una scelta ma un obbligo!  Ad ogni modo la funzione
incriminata fa parte di quella famiglia di funzioni DOS per la
gestione basilare dei file (via handle), e cioe' open, close, create
etc.
Essendo quindi una di quelle funzioni piuttosto utilizzate nei
programmi DOS, ho creduto (mi sono illuso ?!?) che venisse ben
supportata anche dai suoi successori anche se dotati di finestre!
Tra l'altro come ho gia' detto il comportamento e' curioso.
L'esatta sequenza in cui avvengono le operazioni e' questa:
1 creo un file temporaneo (contiene una stampa e non supera i 5KB)
2 ne creo un secondo (contiene la stessa cosa ma con aggiunti i
comandi di formattazione in base alla stampante o video di
destinazione)
3 visualizzo o stampo il file
4 cancello il secondo file
5 cancello il primo file
La creazione del "clone" avviene nell'ultima fase, in pratica windows
crea una copia del primo file, (e perche' non del secondo ?), Boh!
Comunque indaghero', anche se con l'andare del tempo mi convinco
sempre piu' che alcune scelte di m$ siano inspiegabili ;-)
ciao, acc.   
a...@libero.it

 sempre piu' che alcune scelte di m$ siano inspiegabili ;-)
Questo è certo. Basta dare un'occhiata alla GDI di Windows per
rendersene conto. La deve aver progettata un pazzo... :-(


On Thu, 18 Jul 2002 20:38:31 GMT, acc <a...@libero.ita> wrote:
Risolto il mistero!  Come nella maggior parte dei casi il problema era
altrove, (mea culpa) anche se rimane ancora qualche ombra...
La CreateTemp() funziona bene su 2k/xp/me come pure le altre funzioni
di questa famiglia, il problema era banale, la routine che visualizza
il file non lo chiudeva.  Windows 98 non fa una piega, mentre gli si
comportano come ho gia' descritto.
Una volta corretto l'errore (aggiunta la fclose()), i files citati non
vengono piu' creati e tutto funziona bene.
A questo punto l'unica cosa strana e' il fatto che il 98 non crasha
mai nonostante vengano aperti molti file che poi non vengono chiusi,
un'altra stranezza e' che la ferase() cancella anche file che
risultano aperti senza farsi il minimo scrupolo, con la complicita'
del S.O. che fa finta di non vedere !
ciao, acc.   
a...@libero.it

 del S.O. che fa finta di non vedere !
Sembra che in questo caso la famiglia NT si comporti meglio. Io ho visto
però anche casi opposti nei quali sono i membri di quest'ultima a far
finta di niente. Diciamo che nessuno è perfetto...


Ciao acc
probabilmente è una differenza nella gestione della "proprietà"
dell'oggetto.
Win2000 e NT sono molto più evoluti e pignoli sulle azioni possibili sugli
oggetti, a seconda del proprietario, mentre Win98/95 è più lasco, se sei
sempre tu il proprietario del processo e degli oggetti.
... mentre non capisco assolutamente le differenze in esecuzione
automatica...
Ciao
Massimo
"acc" <a...@libero.ita> ha scritto nel messaggio
news:rcgrjugmsg0i633rd...@4ax.com...


automatica...
Mah, sara' uno dei 65000 bug... La mia "personale" teoria a proposito
dice che: in esecuzione automatica i bug verranno generati dal sistema
operativo, viceversa e' necessario crearli manualmente ;-)
ciao, acc.   
a...@libero.it