2013-04-12 76 views
1

我做了這個試圖檢查文件是否存在的dll文件。但即使我手動創建文件,我的DLL仍然無法找到它。檢查文件是否存在的Visual C++ DLL

我的dll檢索正在運行的程序的進程ID,並查找以pid命名的文件。

誰能告訴我,我錯過了什麼:(

代碼:

#include <Windows.h> 
#include <winbase.h> 
#include <stdio.h> 
#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 

using namespace std; 

int clientpid = GetCurrentProcessId(); 
ifstream clientfile; 
string clientpids, clientfilepath; 

VOID LoadDLL() { 
    AllocConsole(); 
    freopen("CONOUT$", "w", stdout); 
    std::cout << "Debug Start" << std::endl; 

    std::ostringstream ostr; 
    ostr << clientpid; 
    clientpids = ostr.str(); 
    ostr.str(""); 

    TCHAR tempcvar[MAX_PATH]; 
    GetSystemDirectory(tempcvar, MAX_PATH); 
    ostr << tempcvar << "\\" << clientpids << ".nfo" << std::endl; 
    clientfilepath = ostr.str(); 
    //clientfile.c_str() 
    ostr.str(""); 

    std::cout << "Start search for: " << clientfilepath << std::endl; 

    FOREVER { 
     clientfile.open(clientfilepath,ios::in); 
     if(clientfile.good()) { 
      std::cout << "Exists!" << std::endl; 
     } 

     Sleep(10); 
    }; 
} 
+0

你做了什麼來調試該問題? 你能描述一下究竟發生了什麼,以及這與你的期望有什麼不同? 如果您在常規程序而不是DLL中使用它,它會工作嗎? –

+1

僅僅因爲你無法打開文件,並不意味着文件不存在。使用'GetFileAttributes(sFile)!= INVALID_FILE_ATTRIBUTES'來測試是否存在。 – paddy

+0

好吧,我試圖改變永遠循環了一下,並得到了一個ERROR_INVALID_NAME錯誤。我是否將文件路徑從字符串轉換爲LPCTSTR錯誤? –

回答

0

假設您正在使用UNICODE

工作,我覺得問題在去下面一行:
ostr << tempcvar << "\\" << clientpids << ".nfo" << std::endl;
tempcvar是一個tchar,也許你正在使用unicode,所以它意味着tempcvar是一個widechar。

您在ostr中插入tempcvar的結果並非您所期望的(您正在與widechar混合使用多字節)。解決這個問題,在這個例子中根據你的代碼轉換tempcvar成多字節字符串(const char*char* ...)

看(TCHAR之間看皈依爲多字節字符)

VOID LoadDLL() { 

AllocConsole(); 
freopen("CONOUT$", "w", stdout); 
std::cout << "Debug Start" << std::endl; 
std::ostringstream ostr; 
ostr << clientpid; 
clientpids = ostr.str(); 
ostr.str(""); 

TCHAR tempcvar[MAX_PATH]; 
GetSystemDirectory(tempcvar, MAX_PATH); 

// Convertion between tchar in unicode (wide char) and multibyte 
wchar_t * tempcvar_widechar = (wchar_t*)tempcvar; 
char* to_convert; 
int bytes_to_store = WideCharToMultiByte(CP_ACP, 
    0, 
    tempcvar_widechar, 
    -1,NULL,0,NULL,NULL); 
to_convert = new char[bytes_to_store]; 

WideCharToMultiByte(CP_ACP, 
    0, 
    tempcvar_widechar, 
    -1,to_convert,bytes_to_store,NULL,NULL); 

// Using char* to_convert that is the tempcvar converted to multibyte 
ostr << to_convert << "\\" << clientpids << ".nfo" << std::endl; 
clientfilepath = ostr.str(); 
//clientfile.c_str() 
ostr.str(""); 

std::cout << "Start search for: " << clientfilepath << std::endl; 

FOREVER { 
    clientfile.open(clientfilepath,ios::in); 
    if(clientfile.good()) { 
     std::cout << "Exists!" << std::endl; 
    } 

    Sleep(10); 
}; 

} 

如果這個例子不適用於你,你可以搜索關於寬字符串到多字節字符串轉換的更多信息。
檢查你是否使用Unicode,如果你是的,也許這是你的問題。

如果您不使用unicode,則代碼中的問題可能是打開文件。

希望它有幫助!

+0

我設置的屬性,以開始項目時多字節:( –

+0

是的,我雙重檢查它。我真的失去了爲什麼他無法找到它:(無論如何,我要嘗試切換到unicode並嘗試你的建議,因爲它比沒有任何解決方案更好 –

+0

只需在commnet中快速回答......你在'GetSystemDirectory'旁邊的'ostr'中插入了一個斷行,請看:'ostr << tempcvar < <「\\」<< clientpids <<「.nfo」<< std :: endl' std :: endl意思是breakline,我認爲這就是你的問題的原因 – Spamdark