我有一个 C++ 程序,它在 windows xp 启动时将文件与远程服务器同步。需要打开公钥文件的函数在 fopen() 处失败。当我自己(从资源管理器中)启动程序时,一切正常。但是当我向注册表添加启动密钥时,该功能失败。
我通过调试器跟踪代码,一切都很好,直到调用 CreateFileA()。CreateFileA 返回 FILE_NOT_FOUND。
我删除了对 fopen() 的调用,并直接将其替换为对 CreateFileA() 的调用。然后我将 SECURITY_ATTRIBUTES 更改为 NULL,之后对 CreateFileA() 的调用起作用。
问题是我用于加密的第 3 方库需要一个 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 的情况下重置运行时?