2012-04-20 43 views
0

我有一個C++程序,可以在Windows XP啓動時與遠程服務器同步文件。在fopen()中,需要打開公鑰文件的函數失敗。當我自己啓動程序時(從資源管理器中),一切正常。但是,當我將一個啓動密鑰添加到註冊表中時,該功能失敗。fopen()失敗

我通過調試器跟蹤代碼,一切正常,直到調用CreateFileA()。 CreateFileA返回FILE_NOT_FOUND。

我刪除了對fopen()的調用,並用直接調用CreateFileA()來替換它。然後,我將SECURITY_ATTRIBUTES更改爲NULL,之後對CreateFileA()的調用起作用。

問題是我用於加密的第三方庫需要一個FILE *對象,而不僅僅是從文件讀取的數據。我如何解決我的問題?

這裏是我目前使用的代碼:

if(!GetModuleFileNameA(NULL, Path, MAX_PATH)){ 
    delete [] buf; 
    delete [] Path; 
    return strerror(errno); 
} 

rPath = Path; 

delete [] Path; 

ret = rPath.find_last_of('\\'); 

if(ret == string::npos){ 
    delete [] buf; 
    return strerror(errno); 
} 

ret++; 

rPath.erase(rPath.begin() + ret, rPath.begin() + rPath.size() - ret); 

rPath += "rsa_pub.txt"; 

if((f = fopen(rPath.c_str(), "rb")) == NULL){ // fails when started from registry 
    delete [] buf; 
    return strerror(errno); 
} 

編輯:

我找到了兩輪牛車解決問題的辦法:如果我釋放運行時庫,然後重新加載它的問題出遠。然而,這不是一個非常優雅的解決方案。是否有可能重置運行時不刪除和重新加載DLL?

+0

可能的重複[是否有與HANDLEs的fdopen相當的Windows?](http://stackoverflow.com/questions/7369445/is-there-a-windows-equivalent-to-fdopen-for-handles) – 2012-04-20 16:28:05

+0

我會嘗試,但即便如此。這是完全不同的情況。爲什麼fopen()不能像它應該那樣工作? – user513647 2012-04-20 16:31:26

+0

您對安全屬性的引用表明它在從註冊表啓動時與啓動它時使用不同的權限運行。您正在打開的文件的權限是什麼? – AShelly 2012-04-20 16:36:29

回答

1

rPath.erase呼叫似乎沒有多大意義

rPath.erase(rPath.begin() + ret, rPath.begin() + rPath.size() - ret); 

那是什麼呢?

這裏您使用(iterator, iterator)版本erase在這裏。我想你試圖擦除從位置ret開始的字符串的尾部。在這種情況下,我希望把它看成

rPath.erase(rPath.begin() + ret, rPath.end()); 

如果你想使用(position, length)版本的erase,那麼它看上去就像

rPath.erase(ret, rPath.size() - ret); 

但您的具體使用情況看起來像一個奇怪的混合他們倆。那個電話你想做什麼?

GetModuleFileNameA可能會返回不同的字符串,具體取決於您如何啓動程序,這就是爲什麼您的代碼在某些情況下可能顯示「有效」的原因。

+0

這不是rPath問題。我已經在兩種情況下測試了內容,並且它們是平等的。你說得對,但很愚蠢:O – user513647 2012-04-20 16:40:31

+0

好吧,對不起,如果你測試的東西真的看起來像原來的帖子,它根本無法正常工作(除了隨機的碰運氣)。這個問題不容忽視。直到你解決它,沒有太多的嘗試尋找任何其他問題。 – AnT 2012-04-20 16:43:36

相關問題