diff --git a/src/drivers/Qt/CheatsConf.cpp b/src/drivers/Qt/CheatsConf.cpp
index 79cc3c60..559046bb 100644
--- a/src/drivers/Qt/CheatsConf.cpp
+++ b/src/drivers/Qt/CheatsConf.cpp
@@ -768,7 +768,7 @@ void GuiCheatsDialog_t::openCheatFile(void)
 
 	g_config->getOption("SDL.LastOpenFile", &last);
 
-	getDirFromFile(last.c_str(), dir);
+	getDirFromFile(last.c_str(), dir, sizeof(dir));
 
 	dialog.setDirectory(tr(dir));
 
diff --git a/src/drivers/Qt/CodeDataLogger.cpp b/src/drivers/Qt/CodeDataLogger.cpp
index 55845910..8914568d 100644
--- a/src/drivers/Qt/CodeDataLogger.cpp
+++ b/src/drivers/Qt/CodeDataLogger.cpp
@@ -505,7 +505,7 @@ void CodeDataLoggerDialog_t::loadCdlFile(void)
 
 	if (romFile)
 	{
-		getDirFromFile(romFile, dir);
+		getDirFromFile(romFile, dir, sizeof(dir));
 
 		dialog.setDirectory(tr(dir));
 	}
diff --git a/src/drivers/Qt/ConsoleUtilities.cpp b/src/drivers/Qt/ConsoleUtilities.cpp
index 1d55615c..abdc5981 100644
--- a/src/drivers/Qt/ConsoleUtilities.cpp
+++ b/src/drivers/Qt/ConsoleUtilities.cpp
@@ -25,6 +25,7 @@
 #include <QWindow>
 #include <QScreen>
 #include <QToolTip>
+#include <QFileInfo>
 #include <QApplication>
 
 #if WIN32
@@ -47,31 +48,28 @@
 #include "Qt/ConsoleUtilities.h"
 
 //---------------------------------------------------------------------------
-int  getDirFromFile( const char *path, char *dir )
+int  getDirFromFile( const char *path, char *dir, size_t bufSize )
 {
-	int i, lastSlash = -1, lastPeriod = -1;
+	dir[0] = 0;
 
-	i=0; 
-	while ( path[i] != 0 )
+	if (path[0] != 0)
 	{
-		if ( path[i] == '/' )
-		{
-			lastSlash = i;
-		}
-		else if ( path[i] == '.' )
-		{
-			lastPeriod = i;
-		}
-		dir[i] = path[i]; i++;
-	}
-	dir[i] = 0;
+		QFileInfo fi;
 
-	if ( lastPeriod >= 0 )
-	{
-		if ( lastPeriod > lastSlash )
+		fi.setFile( QString(path) );
+
+		if (fi.exists())
 		{
-			dir[lastSlash] = 0;
+			strncpy( dir, fi.canonicalPath().toStdString().c_str(), bufSize );
 		}
+		else
+		{
+			strncpy( dir, fi.absolutePath().toStdString().c_str(), bufSize );
+		}
+
+		dir[bufSize-1] = 0;
+
+		//printf("Dir: '%s'\n", dir);
 	}
 
 	return 0;
@@ -231,7 +229,7 @@ int parseFilepath( const char *filepath, char *dir, char *base, char *suffix )
 }
 //---------------------------------------------------------------------------
 //  Returns the path of fceux.exe as a string.
-int fceuExecutablePath( char *outputPath, int outputSize )
+int fceuExecutablePath( char *outputPath, size_t outputSize )
 {
 	if ( (outputPath == NULL) || (outputSize <= 0) )
 	{
diff --git a/src/drivers/Qt/ConsoleUtilities.h b/src/drivers/Qt/ConsoleUtilities.h
index 032030d1..c995f13e 100644
--- a/src/drivers/Qt/ConsoleUtilities.h
+++ b/src/drivers/Qt/ConsoleUtilities.h
@@ -9,7 +9,7 @@
 #include <QHelpEvent>
 #include <QCheckBox>
 
-int  getDirFromFile( const char *path, char *dir );
+int  getDirFromFile( const char *path, char *dir, size_t bufSize );
 
 const char *getRomFile( void );
 
@@ -17,7 +17,7 @@ int getFileBaseName( const char *filepath, char *base, char *suffix = NULL );
 
 int parseFilepath( const char *filepath, char *dir, char *base, char *suffix = NULL );
 
-int fceuExecutablePath( char *outputPath, int outputSize );
+int fceuExecutablePath( char *outputPath, size_t outputSize );
 
 int fceuLoadConfigColor( const char *confName, QColor *color );
 
diff --git a/src/drivers/Qt/ConsoleWindow.cpp b/src/drivers/Qt/ConsoleWindow.cpp
index 58cd2eb4..684fa1aa 100644
--- a/src/drivers/Qt/ConsoleWindow.cpp
+++ b/src/drivers/Qt/ConsoleWindow.cpp
@@ -2358,7 +2358,7 @@ void consoleWin_t::openROMFile(void)
 
 	g_config->getOption ("SDL.LastOpenFile", &last );
 
-	getDirFromFile( last.c_str(), dir );
+	getDirFromFile( last.c_str(), dir, sizeof(dir) );
 
 	dialog.setDirectory( tr(dir) );
 
@@ -2451,7 +2451,7 @@ void consoleWin_t::loadNSF(void)
 
 	g_config->getOption ("SDL.LastOpenNSF", &last );
 
-	getDirFromFile( last.c_str(), dir );
+	getDirFromFile( last.c_str(), dir, sizeof(dir) );
 
 	dialog.setDirectory( tr(dir) );
 
@@ -2535,7 +2535,7 @@ void consoleWin_t::loadStateFrom(void)
 
 	g_config->getOption ("SDL.LastLoadStateFrom", &last );
 
-	getDirFromFile( last.c_str(), dir );
+	getDirFromFile( last.c_str(), dir, sizeof(dir) );
 
 	dialog.setDirectory( tr(dir) );
 
@@ -2626,7 +2626,7 @@ void consoleWin_t::saveStateAs(void)
 			last = std::string(base) + "/sav";
 		}
 	}
-	getDirFromFile( last.c_str(), dir );
+	getDirFromFile( last.c_str(), dir, sizeof(dir) );
 
 	dialog.setDirectory( tr(dir) );
 
@@ -3395,7 +3395,7 @@ void consoleWin_t::loadGameGenieROM(void)
 
 	g_config->getOption ("SDL.LastOpenFile", &last );
 
-	getDirFromFile( last.c_str(), dir );
+	getDirFromFile( last.c_str(), dir, sizeof(dir) );
 
 	dialog.setDirectory( tr(dir) );
 
@@ -3490,7 +3490,7 @@ void consoleWin_t::fdsLoadBiosFile(void)
 
 	g_config->getOption ("SDL.LastOpenFile", &last );
 
-	getDirFromFile( last.c_str(), dir );
+	getDirFromFile( last.c_str(), dir, sizeof(dir) );
 
 	dialog.setDirectory( tr(dir) );
 
diff --git a/src/drivers/Qt/GuiConf.cpp b/src/drivers/Qt/GuiConf.cpp
index 24dea68e..491f59e9 100644
--- a/src/drivers/Qt/GuiConf.cpp
+++ b/src/drivers/Qt/GuiConf.cpp
@@ -419,7 +419,7 @@ void GuiConfDialog_t::openQss(void)
 		last.assign(iniPath);
 	}
 
-	getDirFromFile(last.c_str(), dir);
+	getDirFromFile(last.c_str(), dir, sizeof(dir));
 
 	dialog.setDirectory(tr(dir));
 
@@ -523,7 +523,7 @@ void GuiConfDialog_t::openQPal(void)
 		last.assign(iniPath);
 	}
 
-	getDirFromFile(last.c_str(), dir);
+	getDirFromFile(last.c_str(), dir, sizeof(dir));
 
 	dialog.setDirectory(tr(dir));
 
@@ -1228,7 +1228,7 @@ void GuiPaletteEditDialog_t::paletteSaveAs(void)
 		last.assign(iniPath);
 	}
 
-	getDirFromFile(last.c_str(), dir);
+	getDirFromFile(last.c_str(), dir, sizeof(dir));
 
 	dialog.setDirectory(tr(dir));
 
diff --git a/src/drivers/Qt/HelpPages.cpp b/src/drivers/Qt/HelpPages.cpp
index ec902ed3..fd617a78 100644
--- a/src/drivers/Qt/HelpPages.cpp
+++ b/src/drivers/Qt/HelpPages.cpp
@@ -175,7 +175,7 @@ std::string consoleWin_t::findHelpFile(void)
 
 	if ( last.size() > 0 )
 	{
-		getDirFromFile( last.c_str(), dir );
+		getDirFromFile( last.c_str(), dir, sizeof(dir) );
 
 		dialog.setDirectory( tr(dir) );
 	}
diff --git a/src/drivers/Qt/LuaControl.cpp b/src/drivers/Qt/LuaControl.cpp
index 0af3d839..56f68600 100644
--- a/src/drivers/Qt/LuaControl.cpp
+++ b/src/drivers/Qt/LuaControl.cpp
@@ -379,7 +379,7 @@ void LuaControlDialog_t::openLuaScriptFile(void)
 #endif
 	}
 
-	getDirFromFile(last.c_str(), dir);
+	getDirFromFile(last.c_str(), dir, sizeof(dir));
 
 	dialog.setDirectory(tr(dir));
 
diff --git a/src/drivers/Qt/MoviePlay.cpp b/src/drivers/Qt/MoviePlay.cpp
index 3bf595d4..56fe5693 100644
--- a/src/drivers/Qt/MoviePlay.cpp
+++ b/src/drivers/Qt/MoviePlay.cpp
@@ -443,7 +443,7 @@ void MoviePlayDialog_t::doScan(void)
 
 	g_config->getOption("SDL.LastOpenMovie", &last);
 
-	getDirFromFile(last.c_str(), dir);
+	getDirFromFile(last.c_str(), dir, sizeof(dir));
 
 	scanDirectory(dir, md5);
 }
@@ -509,7 +509,7 @@ void MoviePlayDialog_t::openMovie(void)
 
 	g_config->getOption("SDL.LastOpenMovie", &last);
 
-	getDirFromFile(last.c_str(), dir);
+	getDirFromFile(last.c_str(), dir, sizeof(dir));
 
 	dialog.setDirectory(tr(dir));
 
diff --git a/src/drivers/Qt/MovieRecord.cpp b/src/drivers/Qt/MovieRecord.cpp
index 9c5a0a1b..f12b4d5a 100644
--- a/src/drivers/Qt/MovieRecord.cpp
+++ b/src/drivers/Qt/MovieRecord.cpp
@@ -222,7 +222,7 @@ void MovieRecordDialog_t::setLoadState(void)
 
 	g_config->getOption ("SDL.LastLoadStateFrom", &last );
 
-	getDirFromFile( last.c_str(), dir );
+	getDirFromFile( last.c_str(), dir, sizeof(dir) );
 
 	dialog.setDirectory( tr(dir) );
 
@@ -330,7 +330,7 @@ void MovieRecordDialog_t::browseFiles(void)
 
 	g_config->getOption ("SDL.LastOpenMovie", &last );
 
-	getDirFromFile( last.c_str(), dir );
+	getDirFromFile( last.c_str(), dir, sizeof(dir) );
 
 	dialog.setDirectory( tr(dir) );
 
diff --git a/src/drivers/Qt/PaletteConf.cpp b/src/drivers/Qt/PaletteConf.cpp
index 58557ec3..df783ccc 100644
--- a/src/drivers/Qt/PaletteConf.cpp
+++ b/src/drivers/Qt/PaletteConf.cpp
@@ -575,7 +575,7 @@ void PaletteConfDialog_t::openPaletteFile(void)
 		last.assign(iniPath);
 	}
 
-	getDirFromFile(last.c_str(), dir);
+	getDirFromFile(last.c_str(), dir, sizeof(dir));
 
 	dialog.setDirectory(tr(dir));
 
diff --git a/src/drivers/Qt/PaletteEditor.cpp b/src/drivers/Qt/PaletteEditor.cpp
index 48e40faf..442952a8 100644
--- a/src/drivers/Qt/PaletteEditor.cpp
+++ b/src/drivers/Qt/PaletteEditor.cpp
@@ -401,7 +401,7 @@ void PaletteEditorDialog_t::openPaletteFileDialog(void)
 	{
 	   last.assign( iniPath );
 	}
-	getDirFromFile( last.c_str(), dir );
+	getDirFromFile( last.c_str(), dir, sizeof(dir) );
 
 	dialog.setDirectory( tr(dir) );
 
diff --git a/src/drivers/Qt/TraceLogger.cpp b/src/drivers/Qt/TraceLogger.cpp
index 8107eee7..d5d44e3c 100644
--- a/src/drivers/Qt/TraceLogger.cpp
+++ b/src/drivers/Qt/TraceLogger.cpp
@@ -578,14 +578,14 @@ void TraceLoggerDialog_t::openLogFile(void)
 	if (romFile != NULL)
 	{
 		char dir[1024];
-		getDirFromFile(romFile, dir);
+		getDirFromFile(romFile, dir, sizeof(dir));
 		dialog.setDirectory(tr(dir));
 	}
 
 	if ( logFilePath.size() != 0 )
 	{
 		char dir[1024];
-		getDirFromFile(logFilePath.c_str(), dir);
+		getDirFromFile(logFilePath.c_str(), dir, sizeof(dir));
 		dialog.setDirectory(tr(dir));
 	}
 
diff --git a/src/drivers/Qt/fceuWrapper.cpp b/src/drivers/Qt/fceuWrapper.cpp
index 888d5b2e..d8c2d4e9 100644
--- a/src/drivers/Qt/fceuWrapper.cpp
+++ b/src/drivers/Qt/fceuWrapper.cpp
@@ -974,16 +974,29 @@ int  fceuWrapperInit( int argc, char *argv[] )
 
 	if (romIndex >= 0)
 	{
-		// load the specified game
-		error = LoadGame(argv[romIndex]);
-		if (error != 1) 
+		QFileInfo fi( argv[romIndex] );
+
+		// Resolve absolute path to file
+		if ( fi.exists() )
 		{
-			DriverKill();
-			SDL_Quit();
+			std::string fullpath = fi.canonicalFilePath().toStdString().c_str();
+
+			error = LoadGame( fullpath.c_str() );
+
+			if (error != 1)
+			{
+				DriverKill();
+				SDL_Quit();
+				return -1;
+			}
+			g_config->setOption("SDL.LastOpenFile", fullpath.c_str() );
+			g_config->save();
+		}
+		else
+		{
+			// File was not found
 			return -1;
 		}
-		g_config->setOption("SDL.LastOpenFile", argv[romIndex]);
-		g_config->save();
 	}
 
 	aviRecordInit();
diff --git a/src/drivers/Qt/iNesHeaderEditor.cpp b/src/drivers/Qt/iNesHeaderEditor.cpp
index 0dcb93e1..ee537ed2 100644
--- a/src/drivers/Qt/iNesHeaderEditor.cpp
+++ b/src/drivers/Qt/iNesHeaderEditor.cpp
@@ -795,7 +795,7 @@ bool iNesHeaderEditor_t::openFile(void)
 
 	g_config->getOption ("SDL.LastOpenFile", &last );
 
-	getDirFromFile( last.c_str(), dir );
+	getDirFromFile( last.c_str(), dir, sizeof(dir) );
 
 	dialog.setDirectory( tr(dir) );
 
@@ -848,7 +848,7 @@ void iNesHeaderEditor_t::saveFileAs(void)
 	dialog.setLabelText( QFileDialog::Accept, tr("Save") );
 	dialog.setDefaultSuffix( tr(".nes") );
 
-	getDirFromFile( LoadedRomFName, dir );
+	getDirFromFile( LoadedRomFName, dir, sizeof(dir) );
 
 	dialog.setDirectory( tr(dir) );