我有一個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?
可能的重複[是否有與HANDLEs的fdopen相當的Windows?](http://stackoverflow.com/questions/7369445/is-there-a-windows-equivalent-to-fdopen-for-handles) – 2012-04-20 16:28:05
我會嘗試,但即便如此。這是完全不同的情況。爲什麼fopen()不能像它應該那樣工作? – user513647 2012-04-20 16:31:26
您對安全屬性的引用表明它在從註冊表啓動時與啓動它時使用不同的權限運行。您正在打開的文件的權限是什麼? – AShelly 2012-04-20 16:36:29