Domanda

E 'un po' strano. Ok, quindi sto lavorando con motore di gioco OGRE che ha una classe "SceneManager", che mantiene alcuni file torrenti aperto a sfondo. Se io uso i flussi appena prima di usare GetOpenFileName () quei flussi funzionano bene, ma se provo ad usare quei flussi DOPO GetOpenFileName () quei strams si trovano ad essere chiuso. Qualcuno può gettare un po 'di luce perché GetOpenFileName () sta uccidendo i miei flussi di fondo?

String Submerge::showFileDialog(char* filters, bool savedialog, char* title)
// need to tweak flags for open/save
{
OPENFILENAME ofn ;
char szFile[255] ;
HWND hwnd = NULL;
//getOgre()->getAutoCreatedWindow()->getCustomAttribute("WINDOW", &hwnd);

ZeroMemory( &ofn , sizeof(ofn) );
ofn.hwndOwner = hwnd;
ofn.lStructSize = sizeof ( ofn );
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof( szFile );
ofn.lpstrFilter = filters ? filters : "All files\0*.*\0";
ofn.nFilterIndex =1;
ofn.lpstrFileTitle = NULL ;
ofn.nMaxFileTitle = 0 ;
ofn.lpstrInitialDir=NULL ;
if(title!=NULL)
    ofn.lpstrTitle=title;
//ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;

MeshLoadTest(); // this is where i use background file streams
bool success = false;
if(savedialog)
    success = GetSaveFileName( &ofn );
else
    success = GetOpenFileName( &ofn );
MeshLoadTest(); // this is where i use background file streams

if(!success)
    return "";
String str;
str.append(ofn.lpstrFile);
return str;
return "";
}
È stato utile?

Soluzione

Si noti che GetOpenFileName() può e vuole cambiare la directory corrente di tutto il processo. Questo potrebbe interferire con qualsiasi altra cosa che avete in corso.

C'è un'opzione chiamata OFN_NOCHANGEDIR, ma secondo il documentazione , è inefficace:

  

Ripristina la directory corrente al suo valore originale, se l'utente ha cambiato la directory durante la ricerca di file.    Windows NT 4.0 / 2000 / XP : Questa bandiera è inefficace per GetOpenFileName

.

Si dovrebbe controllare la directory corrente, prima e dopo aver effettuato questa chiamata; se cambia allora questo può essere il vostro problema. In tal caso, aggiungere il codice per salvare e ripristinare la directory corrente intorno la chiamata a GetOpenFileName().

Altri suggerimenti

Grazie ragazzi e ho fatto un'altra scoperta, che ho usato OFN_NOCHANGEDIR e il problema è stato effettivamente risolto (WinXP SP3), forse hanno bisogno di aggiornare documentazione MSDN di tanto in tanto: P

(Questo è in realtà una risposta alla altra risposta, in cui la fonte del problema è stato identificato nel cambiamento della directory corrente)

Per salvare la directory corrente:

#define ARRSIZE(arr) (sizeof(arr)/sizeof(*(arr)))

//...

TCHAR curDir[MAX_PATH];
DWORD ret;
ret=GetCurrentDirectory(ARRSIZE(curDir),curDir);
if(ret==0)
{
    // The function falied for some reason (see GetLastError), handle the error
}
else if(ret>ARRSIZE(curDir))
{
    // The function failed because the buffer is too small, implementation of a function that uses dynamic allocation left to the reader
}
else
{
    // Now the current path is in curDir
}

Per ripristinare il percorso, fare semplicemente

if(!SetCurrentDirectory(curDir))
{
    // The function failed, handle the error
}

.

SUGGERIMENTO: utilizzare il TCHARS ei generici mappature di testo funzioni invece di char s dall'inizio dell'applicazione: questo eviterà un sacco di problemi in futuro, quando l'applicazione sarà necessario essere compatibile con percorsi Unicode.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top