Newsgroup: it.comp.programmare
Titolo: Errore con FtpGetFileA (WinInet)

Ciao a tutti,
Ho un setup (installazione di un'applicazione) fatto con InstallShield che
si connette a un server FTP e scarica dei file durante l'installazione.
Questa fase e` "esterna" allo script d'installazione di Installshield ed e`
ottenuta con chiamate a funzioni di sistema Windows.
Alle volte (non sempre) ho un errore durante la fase di get file. Cioe` il
processo apre con successo la sessione Ftp (InternetOpenA e InternetConnectA
Windows call) ma fallisce quando cerca di copiare un file:
if(!FtpGetFileA(hFtp, sRemoteFileName, sLocalFileName, bFailIfExists,
FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0)) then
   errNum = Err.LastDllError; // call Windows GetLastError
   errStr = FormatMessage (errNum); //
   SprintfBox (SEVERE, "GetLastError partecipation", "Error code:
%ld\nMessage text: %s", errNum, errStr);
endif
come mostrato dal .gif in attachment:
errNum = 1813
errStr = The specified resource type cannot be found in the image file.
(ERROR_RESOURCE_TYPE_NOT_FOUND)
Qualcuno mi puo` aiutare a capire meglio dov'e` l'errore?
Qual'e` la "resource type" non trovata? La remota o la locale?
Cos'e` il "image file"?
Grazie.
Ciao, Giuseppe
N.B.:
Sto testando il lavoro per cui sono sicuro che non si tratti di errori
banali tipo:
-nome file da copiare sbagliato (o file assente)
-directory sbagliata sul Ftp server (o assente)
-directory locale sbagliata (o assente)
Tutte queste informazioni sono corrette!
Ho gia` consultato i forum di InstallShield ma nessuno ha saputo
rispondermi, spero che qui qualcuno mi sappia almeno dare piu` dettagli
sull'errore che ricevo in relazione alla funzione di Windows che lo produce
(FtpGetFileA)
--
Cancella TOGLI e MI per rispondermi

Non so cosa dirti. Al limite prova ad aggiungere qualche flag tipo:
INTERNET_FLAG_RELOAD
INTERNET_FLAG_NEED_FILE
INTERNET_FLAG_RESYNCHRONIZE
E comunque potresti sempre usare un piccolo ciclo for che forse risolverà,
almeno nella pratica, il problema:
for (...100...)
{
    if (FtpGetFileA(.......)) break;
    Sleep(100);        // magari anche un più di 100...
}
Kiuhnm

 INTERNET_FLAG_RESYNCHRONIZE
Solo un piccolo problema: come faccio a passare piu` di una flag alla
funzione?
Scusa ma non sono un programmatore esperto e l'help di Microsoft SDK dice
solo:
BOOL FtpGetFile(
    HINTERNET hConnect,
    LPCTSTR lpszRemoteFile,
    LPCTSTR lpszNewFile,
    BOOL fFailIfExists,
    DWORD dwFlagsAndAttributes,
    DWORD dwFlags,
    DWORD_PTR dwContext
);
...
dwFlags
[in] Unsigned long integer value that contains the flags ...
...
The following flags determine how the caching of this file will be done. Any
combination of the following flags can be used with the transfer type flag.
The possible values are:
INTERNET_FLAG_NEED_FILE
Causes a temporary file to be created if the file cannot be cached.
INTERNET_FLAG_RELOAD
Forces a download of the requested file, object, or directory listing from
the origin server, not from the cache.
INTERNET_FLAG_RESYNCHRONIZE
Reloads HTTP resources if the resource has been modified since the last time
it was downloaded. All FTP and Gopher resources are reloaded.
E io come minimo devo far "rientrare" nel campo dwFlags
FTP_TRANSFER_TYPE_BINARY e una delle 3 sopracitate.
#define INTERNET_FLAG_RELOAD              // retrieve the original item
#define FTP_TRANSFER_TYPE_BINARY    0x00000002
Che fare? Sommarle, metterle in OR o altro ancora?
Scusa e grazie di nuovo

 INTERNET_FLAG_RESYNCHRONIZE
Solo un piccolo problema: come faccio a passare piu` di una flag alla




#define INTERNET_FLAG_RELOAD            0x80000000  // retrieve the original



Devi farne un or bit a bit
FTP_TRANSFER_TYPE_BINARY  |  INTERNET_FLAG_RELOAD
Ciao, Davide :)

 FTP_TRANSFER_TYPE_BINARY  |  INTERNET_FLAG_RELOAD
Maledizione.
Il tipo di dato numerico che gestisce InstallShield e` un "Signed four-byte
integer".
It can hold any value between -
2147483648
 and +2147483647
E quanto vale INTERNET_FLAG_RELOAD?
#define INTERNET_FLAG_RELOAD            0x80000000  // retrieve the original
item
0x80000000  = 
2147483648
Ma "dentro" InstallShield viene visto come -
2147483648
 
(-2147483646
 quando
e` in OR con FTP_TRANSFER_TYPE_BINARY). Un bel pasticcio non trovi?
Credo che la soluzione vada trovata senza poter usare questi flag.
Ciao e grazie

"Giuseppe R." <giuseppe_r...@MIhotmail.com> wrote in message
news:ahoaiv$q39$1...@newsreader.mailgate.org...

Non vedo il problema. L'importante è che nessun bit venga buttato.
-1 = 0xffffffff, -2 = 0xfffffffe, ecc....
La CPU non fa distinzione tra numeri signed e unsigned se non quando esegue
dei confronti. Funzioni quali OR, AND, ADD, SUB, ecc... funzionano
indistintamente: del resto la complementazione a 2 qualche vantaggio dovrà
pure averlo, no?
Kiuhnm

 -1 = 0xffffffff, -2 = 0xfffffffe, ecc....
Te lo dicevo che non sono esperto di programmazione... ora devo aggiungere
anche di logica!
Ricapitolo per vedere se ho capito:
la funzione di InstallShield chiama la FtpGetFileA passando (tra l'altro) un
campo che in decimale vale -
2147483646
. La libreria di Windows che eseguira`
la FtpGetFileA sa che quel campo in esadecimale vale 0x80000002 e tutto
torna a posto giusto?

"Giuseppe R." <giuseppe_r...@MIhotmail.com> wrote in message
news:ahopfp$8gd$1...@newsreader.mailgate.org...

Sì, 0xffffffff può essere interpretato come (2^32 - 1) oppure -1.
Per semplificare le cose prendiamo un numero a 4 bit.
Se è unsigned i valori sono 2^4 e vanno da 0 a 2^4-1
0 1 2 3 4 5 6 7 8 9 10 11 12 14 15
Se è signed i valori sono 2^4, ma vanno da -8 a 7 (da -8 a -1 sono 8 così
come lo sono da 0 a 7):
-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
Perchè questo strano metodo?
Pensa alla somma:
1 + 5 = 6
1 + (-5) = ?
Non sarebbe bello non doversi ogni volta preoccupare dei numeri negativi?
Come può essere definito il numero -1?
Come il numero che sommato a 1 dà 0, giusto?
E allora quale numero può rappresentare -1 meglio di 0xf?
 0001 +  ; bits
 1111 =
10000
L'ultimo 1 esce dai quattro bit e così viene scartato.
Il risultato è quindi 0.
E -2?
Stessa cosa:
 0010 +
 1110 =
10000
Quindi poco importa se un programma interpreta un numero come -1 o
0xffff......
Per esempio questa riga:
unsigned int i = -1;
pone i = 2^20 - 1
Provare per credere!
Esistono tuttavia operazioni che agiscono in modo differente a seconda che
il numero sia signed o unsigned. Tali operazioni sono la moltiplicazione, la
divisione, uno shift verso destra, un salto condizionale, ecc...
Kiuhnm

 Sģ, 0xffffffff puņ essere interpretato come (2^32 - 1) oppure -1.
Nello specifico di alcuni processori si', ma non in generale.
Il complemento a 2 non e' infatti l'unico modo di rappresentare i
valori interi negativi.

 wrote in message
news:bfaaa329.02072...@posting.google.com...

Vedo che sei sempre tu.....stiamo parlando di processori 80x86....dovrebbe
essersi capito......
Ciao, Kiuhnm

 stiamo parlando di processori 80x86....dovrebbe essersi capito......
Ah si' ? e da cosa, di grazia, si sarebbe capito ?
L'unico riferimento a una piattaforma specifica che leggo e' Windows,
ma questo e' un sistema operativo e potrebbe girare con qualunque
processore al di sotto.
La tua affermazione e' generica e prescinde da un processore specifico
e conseguentemente falsa su quei sistemi in cui i valori interi
negativi non sono rappresentati in complemento a due.


...
mah, sara` che ho visto poco mondo, ma un PowerPC con Windows sopra mi manca...
(in realta`, chi si farebbe del male installando WinZ su un PowerPC, quando puo`
avere quella straordinarieta` di MacOS X? )
Adieu,
-- 
Lestat de Lioncourt                               |          Ciro Mattia Gonano
  JabberID: 
les...@jabber.students.cs.unibo.it
    |    Undergraduate Student in
  ICQ#: 52631406                                  |         Computer Science at
  URL: 
http://www.CS.UniBO.It/~gonano
             |       University of Bologna
            <powered by Linux Slackware 8.1 on Kernel 2.4.18-xfs>

 avere quella straordinarieta` di MacOS X? )
No, non è pazzo.....è che pur di criticarmi finisce per dire oscenità...
In vecchi thread mi sono fatto molti nemici...
Kiuhnm

 mah, sara` che ho visto poco mondo, ma un PowerPC con Windows sopra mi
manca...
Forse non ci siamo ben capiti. Non e' questo il punto.
K. afferma che dal suo messaggio e' naturale desumere che si stia parlando
di processori x86. A me non sembra, visto che l'unico riferimento a una
piattaforma specifica e' Windows.
La questione del complemento a 2 e' strettamente legata al processore, non
al sistema operativo. Windows gira su piattaforme embedded e su processori
Alpha.
Il complemento a 2, invece, potrebbe non essere la tecnica di
rappresentazione dei numeri interi negativi su un processore specifico e
quindi non e' affatto detto che 0xffffffff rappresenti -1 su un particolare
processore.
--------------------------------
Inviato via 
http://usenet.libero.it

 No, non è pazzo.....è che pur di criticarmi finisce per dire oscenità...
Caro K., le oscenita', sinora, le sto leggendo continuamente nei tuoi
messaggi.
Che tu ci creda o no, un sistema operativo e' indipendente dal processore
sottostante.


 sottostante.
Caro A.L. che tu ci creda o no, un sistema operativo è strettamente
dipendente dalla CPU per definizione. Il sistema operativo ha il compito di
gestire e distribuire le risorse hardware offerte da CPU, memoria,
periferiche ecc...
Moltissime funzioni offerte da Windows (vedi VMM, ecc...) non avrebbero
senso al di fuori dei processori 80x86.
A me sembra che tu sia solamente un individuo che ha sempre qualcosa da
criticare in quello che dicono gli altri. Crei solo polemiche e dirotti i
thread verso i meandri oscuri della tua mente....
Come al solito, rispondendoti, sto perdendo tempo prezioso della mia vita.
Kiuhnm

 processore.
Ma è probabilissimo (altrimenti è 0x80000001).
Kiuhnm

 senso al di fuori dei processori 80x86.
??? la gestione della memoria virtuale non c'entra assolutamente *NULLA* con
Windows nello specifico. Non confondere cio' che e' la memoria virtuale e
tutta l'idea di gestione che vi e' dietro, con quanto e' implementato,
invece, sotto Windows. Specifica quali sono questi "ecc... ecc...", non
lasciar cadere le tue parole nell'oblio. E' chiaro che un sistema operativo,
perche' lavori su un'altra macchina, va adattato, ma questo non vuol dire
che la parte di interfaccia con l'utente, non possa rimanere la stessa. In
generale, quando si parla di "sistema operativo", non si fa riferimento ad
un processore specifico.


 complemento a 2.
E da quando in qua e' il sistema operativo ad essere compatibile con i
programmi ?
Sono i programmi che si adattano alla piattaforma, non viceversa.


 un processore specifico.
Se lo dici tu......quindi MacOS su pc si chiama PcOS?
Kiuhnm

 Sono i programmi che si adattano alla piattaforma, non viceversa.
La maggiorparte dei programmi sfrutta l'implementazione del SO e quindi
utlizzeranno cose del tipo: unsigned i = -1. Se sul porting del sis.
operativo non funzioneranno, nessuno sarà incentivato ad usarlo....
Kiuhnm

Mi inserisco in questo discorso con alcune considerazioni ed alcune domande.
Supponiamo che io abbia scritto un programma e lo abbia testato su WnNT su
piattaforma 80x86.
Supponiamo che in questo programma io usi *-1 = 0xffffffff* cioe' considero
che venga usato il complemento a 2 per la rappresentazione dei numeri
negativi (come del resto avviene negli 80x86).
Domanda: Questo mio programma girera' su qualsiasi WinNT (indipendentemente
dalla cpu che c'e' sotto) oppure devo modificarlo per adattarlo
all'architettura??
Io penso (ovviamente corregetemi se sbaglio) che non ci sia bisogno di fare
modifiche; e' windows stesso che *dovrebbe* creare una sorta di sistema
virtuale sopra l'architettura hardware in modo che ai programmi non
interessi se girano su un Intel  su un Alpha.
Se le premesse sono vere allora mi viene da pensare che, al fine del
programmatore, non e' importante come la cpu gestisca i numeri negativi ma
solamente come il SO fa vedere tale gestione.
Se windows sotto 80x86 usa il complemento a due allora usa il complemento a
due anche nelle altre achitetture.
Per cui l'amico che ha iniziato il thread puo' assumere che venga usato il
complemento a due indipendentemente dall'architettura (ovviamente *se e solo
se* la risposta giusta alla mia domanda e' quella che io ho dato).
Ciao, Davide :)

 Come al solito, rispondendoti, sto perdendo tempo prezioso della mia vita.
   Tanto e` Sabato sera... ;)
-- 
Alla prossima,
Marco

 interessi se girano su un Intel  su un Alpha.
   In effetti, e` cosi`: NT ha uno strato software tra la macchina ed il 
resto del sistema operativo chiamato HAL (Hardware Abstraction Layer) 
che serve a mediare le varie differenze architetturali nei confornti dei 
sottosistemi soprastanti. Una specie di "macchina virtuale" a basso 
livello, visto che di questi tempi la locuzione va molto di moda. :)
-- 
Alla prossima,
Marco

negativi (come del resto avviene negli 80x86).
In realtà c'è un altro possibile problema, infatti se passo da un
compilatore a 16 bit ad uno a 32 bit potrei avere dei problemi, perché
nel primo 0xffff è -1, nel secondo invece per ottenere -1 devo
inserire 16 bit di 1 e quindi -1 è 0xffffffff, mentre 0xffff è
0x0000ffff, cioè 65535. Lo stesso problema se passi da un compilatore
e os con intero a 32 bit ad uno con intero a 64 bit (o se cambi
semplicemente il tipo di dato, da int a long ad esempio).
-- 
Marco Barisione (ICQ 84277092)

 Machine Manager ed è il cuore di Windows!!!
Allora specifica che stai parlando di questo, visto che la sigla VMM vuol
dire esattamente anche Virtual Memory Manager.


 complemento a due indipendentemente dall'architettura
No, a mio avviso, non puo' e non deve.


 operativo non funzioneranno, nessuno sarà incentivato ad usarlo....
Stai confondendo gli argomenti: una cosa e' parlare di linguaggio ad alto
livello, una cosa e' parlare di linguaggio macchina e di processore.
Supponendo che il tuo processore non usi il complemento a 2 ma si limiti a
segnare (sto inventando) come primo bit il segno del numero intero e il
resto rimanga invariato. Supponiamo, cioe', che -1 sia rappresentato, in una
word a 8 bit, con: 10000001, anziche' 11111111.
A livello di codice sorgente, userai -1 sia su una piattaforma con
complemento a 2, sia su una che non lo implementa. E' internamente al
processore che su una macchina il valore sara' 10000001 e sull'altra
11111111. Su quel particolare processore in cui non c'e' uso del complemento
a 2, non puoi assumere che 11111111 valga -1, perche' e' il valore
corrispondente a -127.


 Intel che PowerPC che come sottosistema MVS.
Perň il codice compilato per un sistema Linux x86 funziona anche sul Linux
PowerPC?
Se mi rispondi di sě, allora mi dai ragione...
Kiuhnm

 PowerPC?
Che c'entra questo ?


 inserire 16 bit di 1 e quindi -1 è 0xffffffff, mentre 0xffff è
Scusami, ma ogni compilatore compilerà nel modo più opportuno! Non vedo il
problema....
(mai scrivere un numero negativo come 0xff..... nel codice!)
Kiuhnm

 corrispondente a -127.
Secondo me tu sottovaluti i sistemi operativi.....
Kiuhnm

 dire esattamente anche Virtual Memory Manager.
Non in Windows......e si parlava di Windows....
Kiuhnm

 Non in Windows......e si parlava di Windows....
Ma fammi il piacere ! parli di cio' che non conosci !!!
"Virtual Memory in Windows NT
The virtual-memory manager (VMM) in Windows NT is nothing like the memory
managers used in previous versions of the Windows operating system. Relying
on a 32-bit address model, Windows NT is able to drop the segmented
architecture of previous versions of Windows. Instead, the VMM employs
32-bit virtual addresses for directly manipulating the entire 4-GB
process.[...]"
["The Virtual-Memory Manager in Windows NT", Randy Kath, Microsoft Developer
Network Technology Group]


 Secondo me tu sottovaluti i sistemi operativi.....
???
Che dire: ROTFL... non si puo' commentare altrimenti ;)


Se mi rispondi di sģ, allora mi dai ragione...
Intendi il sorgente ricompilato o solo l'eseguibile spostato?
Nel secondo caso no, ad esempio non puoi passare un eseguibile per
WinNT su Alpha ad un normale PC.


 quando puo` avere quella straordinarieta` di MacOS X? )
le stesse persone che si fanno del male installando windows su x86... 
perche` installare un accrocchio quando esistono i sistemi operativi 
veri? :-)))
ciao Anto
-- 
Antonio Cuni, 20 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 wrote in message
news:80Z105Z34Z80Y1...@usenet.libero.it...

Io faccio riferimento alla documentazione ufficiale della Microsoft rivolta
ai programmatori di driver:
"Virtual Machine Manager
The VMM is a 32-bit protected-mode operating system. Its primary
responsibility is to create, run, monitor, and terminate virtual machines.
The VMM provides services that manage memory, tasks, interrupts, and
protection faults. The VMM works with virtual devices, 32-bit protected-mode
dynamic-link libraries, to allow the virtual devices to intercept interrupts
and faults in order to control the access an application has to hardware
devices and installed software."
Persino le macro utilizzano la sigla VMM:
VMMCall Get_VMM_Reenter_Count.
ecc...
Non si parla di memoria virtuale, ma di Pagers....
"A pager is a component or body of code that the VMM calls to move pages in
and out of memory. Every committed page is associated with a pager except
for hooked pages, instanced pages, and pages committed using
_PageCommitPhys. Virtual devices can register pagers by using VMM services.
Additional services enable virtual devices to immediately write pages to the
swap file, or to discard pages that no longer contain valid information."
Come vedi VMM è ben distinto da memoria virtuale.
Kiuhnm

 WinNT su Alpha ad un normale PC.
Allora il sistema operativo non è "esattamente" Windows se non vanno i
programmi scritti per Windows! Non si può parlare di compatibilità completa.
Se il codice va ricompilato allora il problema non si presenta. L'utente non
potrà di certo ricompilare un programma senza codice sorgente e il
programmatore che ha il codice dovrebbe sapere l'architettura della CPU per
la quale sta compilando codice.
BTW la maggiorparte delle CPU utilizza il complemento a due (anche Alpha e
probabilmente anche PowerPC).
Kiuhnm

probabilmente anche PowerPC).
Non so cosa usino, comunque il complemento a 2 è la cosa più logica da
usare.


 memoria, periferiche ecc...
come al solito confondi le cose. *L'implementazione* di un sistema 
operativo e` legata all'architettura su cui gira ma *l'interfaccia* 
(intesa sia come interfaccia utente che come API) ne e` assolutamente 
indipendente.
Esistono molti esempi di sistemi operativi che girano su CPU diverse, 
come ad esempio Linux o piu` in generale i cloni di unix.


 probabilmente anche PowerPC).
Non e' questo il punto. Ci sono architetture in cui vengono utilizzate altre
tecniche, il discorso di Alpha e compagnia cantante e' orientato a farti
capire che un s.o. e' indipendente dalla piattaforma (bada che non sto
parlando della sua implementazione). Il discorso sul complemento a due,
quindi, non e' valido A LIVELLO GENERALE.


 ai programmatori di driver:
Arrampicati pure sullo specchio:
Quella a cui ho fatto riferimento io e' MSDN, quindi E' la documentazione
ufficiale Microsoft.
Ti ripeto per l'ennesima volta che la sigla "VMM" in Windows, significa
ANCHE VIRTUAL MEMORY MANAGER, quindi chi legge soltanto "VMM" non puo'
distinguere le due cose.
Informati, prima di ribattere.


 usare.
Piu' logica *per chi* ?
Sui diversi hardware, la rappresentazione dei numeri negativi puo' essere
fatta, essenzialmente, in tre modi: complemento a 2, complemento a 1 e
segno/mantissa (in inglese: sign-magnitude).


segno/mantissa (in inglese: sign-magnitude).
Sì, questi sono i principali ma non so quanto siano usati il modulo e
segno e il coplemento a 1 (onestamente non ne ho proprio la minima
idea); non penso comunque tanto come il complemento a 2. In realtà
esistono altri infiniti modi per rappresentare i numeri, dipende dalle
esigenze della macchina, per esempio in una bilancia elettronica mi
aspetto che siano rappresentati con un sistema BCD.


 idea); non penso comunque tanto come il complemento a 2.
Ribadisco: non e' questo il punto.
Se affermi che 0xffffffff vale universalmente -1, allora sei in errore.


Se affermi che 0xffffffff vale universalmente -1, allora sei in errore.
Infatti io non stavo proprio dicendo questo e davo ragione a te! Non
sono kiuhnm :-)


 Se affermi che 0xffffffff vale universalmente -1, allora sei in errore.
Quanto vuoi scommettere che sul computer di Giuseppe R 0xfff......f vale -1?
Kiuhnm