Newsgroup: it.comp.programmare.win32
Titolo: finestra "SFOGLIA"

Ho creato un meccanismo di selezione di un file del tipo SFOGLIA( quello in
cui appare la finestra con l'organizzazione delle risorse)
BOOL OpenTheFile(HWND hwnd)
{
 HANDLE fcon;
 DWORD dwFileSize;
     OPENFILENAME ofn;
       TCHAR szFile[MAX_PATH]="\0";
 strcpy(szFile,"");
    ZeroMemory(&ofn, sizeof(OPENFILENAME));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFile = szFile;
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = NULL;
    ofn.nFilterIndex = 0;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    if(GetOpenFileName(&ofn))
 {
  if((fcon= CreateFile((LPCTSTR)ofn.lpstrFile,
GENERIC_READ,FILE_SHARE_READ,NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL)) ==
(HANDLE)-1)
  {
  MessageBox(NULL,"Errore sulla OpenTheFile",NULL,MB_OK);
  return FALSE;
  }
  dwFileSize = GetFileSize(fcon,NULL);
  if(dwFileSize=0xFFFFFFFF)
  {
  MessageBox(NULL,"Errore sulla size",NULL,MB_OK);
  return FALSE;
  }
 }
}
Dopo aver ricavato l'handle del file scelto usando la CreateFile, ho provato
a calcolare la dimensione del file ma la GetFileSize mi da un errore
mi appare sempre la finestra "Errore sulla size". Nella procedura sopra
secondo voi c'e' qualcosa che non va?
Grazie!  Luca.

   if(dwFileSize=0xFFFFFFFF)
[...]
Manca un =
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

 secondo voi c'e' qualcosa che non va?
prova a usare questo metodo:
/////////////////////////////////////////////////////
// dichiaro
 _browseinfoA browse; // struttura di settaggio
 CDialog obj; // oggetto della fdd settaggio
 unsigned char cartella[MAX_PATH]; // cartella da salvare
 char cartella2[MAX_PATH]; // cartella da salvare
 LPCITEMIDLIST pidl; // per le funzioni SH
 BOOL tasto; // verifica tasto premuto
 CFile opz; //stream per il file opzioni.frt
 // settaggio opzioni
 browse.hwndOwner = obj.m_hWnd; // memorizza l'handle
 browse.pidlRoot = NULL; // inizia dal Desktop
 browse.pszDisplayName = cartella2; // memorizza path
 browse.ulFlags = BIF_RETURNONLYFSDIRS |
  BIF_EDITBOX | BIF_DONTGOBELOWDOMAIN; // opzioni
 browse.lpfn = NULL; // Deve essere NULL
 browse.lpszTitle = "Scegli una cartella."; // titolo
 // apre la finestra
 pidl = SHBrowseForFolder(&browse);
 // memorizzo il path
 tasto = SHGetPathFromIDList(pidl,(char*)cartella);
//////////////////////////////////////////////////////
tasto = true quando viene spinto OK
in "cartella" c'è il path completo della directory

Manca un =
Eeeh, un vero classico; si dovrebbe sempre compilare con il massimo 
livello di warning
-- 
Nato nel vizio, morto nel supplizio
Nato nel peccato, ad entrare sia invitato

 
Oppure abituarsi a scrivere
if (0xFFFFFFFF==dwFileSize)
che funziona con tutti i compilatori.


che funziona con tutti i compilatori.
Tutti i compilatori danno un warning per un'assegnazione dentro 
un'espressione condizionale. E il consiglio del tenere sempre il livello 
dei warning alto (e di non ignorare i messaggi!) vale comunque


un'espressione condizionale.
Non e' detto.
Il caso dell'assegnazione confusa con assegnamento il
compilatore non e' tenuto, secondo lo standard, a dare un
warning.  Che poi questo possa essere deprecabile, e' un
altro discorso, ma e' giusto per sottolineare che "Tutti i
compilatori danno un warning" non e' necessariamente vero.

compilatori danno un warning" non e' necessariamente vero.
Mostramene uno che non lo fa. Ce n'era uno che dava un hint, anzichč un 
warning, ma almeno qualcosa lo diceva


Mostramene uno che non lo fa. 
Ribadisco il concetto: un compilatore non e' tenuto a
sollevare un warning per quella condizione, quindi assumere
che tutti i compilatori si lamentino non e' corretto.  
Per essere realmente sicuri, bisognerebbe trasformare
l'assegnazione in modo inverso, come ha suggerito Valter.

l'assegnazione in modo inverso, come ha suggerito Valter.
E quando devi confrontare due variabili?


E quando devi confrontare due variabili?
Il confronto tra due variabili non rientra nel caso che
stiamo discutendo, perche' comunque inverti le variabili hai
sempre due l-value.  Invece, nel caso di inversione dei
valori con un l-value e un r-value, scrivendo cioe' :
if (r-value == l-value) 
hai la garanzia di sollevare un errore fatale, nel caso
scrivessi:
if (r-value = l-value)
perche' le assegnazioni non sono invertibili.

sempre due l-value.
Con due variabili è ancora peggio: se ti dimentichi il secondo "=" hai 
la certezza matematica che l'espressione condizionale andrà a farsi 
benedire senza che il compilatore dica nemmeno "ba", e che di almeno una 
variabile verrà distrutto il contenuto


Con due variabili è ancora peggio:
Non e' cio' di cui stiamo parlando.  Qui si sta parlando di
un'espressione che NON PUO' essere un l-value confrontata
con un'espressione che invece E' un l-value.

con un'espressione che invece E' un l-value.
Si sta parlando di un "=" che nelle intenzioni del programmatore 
dovrebbe essere un "==". Se la tua testa non riesce ad abbracciare più 
in là dell'esempio specifico, è un problema tuo. Attivare il livello 
massimo di warning del compilatore segnala *sempre* la possibile 
distrazione del programmatore. Il tuo suggerimento vale, per carità, ma 
solo in metà dei casi possibili


 segnala *sempre* la possibile distrazione del programmatore.
Vedi sopra.  Non hai capito.  Non e' sempre cosi'.
-- 
Posted from  [80.105.34.80] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG