【问题标题】:fopen() failingfopen() 失败
【发布时间】:2012-04-20 16:25:47
【问题描述】:

我有一个 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 的情况下重置运行时?

【问题讨论】:

  • 我会尝试,但即便如此。这是一个完全不同的情况。为什么 fopen() 不能正常运行?
  • 您对安全属性的引用表明它在从注册表启动时与在启动时以不同的权限运行。您正在打开的文件的权限是什么?
  • 您是否在fopen 之前打印了rPath 的值以检查其内容?
  • 您的问题中唯一的问题是“我该如何解决我的问题?”,就在“问题是第 3 方库...需要一个 FILE* 对象”之后。所以我将其解释为,“我怎样才能将 CreateFileA 中的 HANDLE(有效)转换为库可用的 FILE*?”这是重复的。

标签: c++ windows fopen


【解决方案1】:

您的rPath.erase 电话似乎没有多大意义

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

那应该怎么做?

您在这里使用的是erase(iterator, iterator) 版本。我相信您正试图从位置ret 开始擦除字符串的尾部。在那种情况下,我希望它看起来像

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

如果你想使用erase(position, length) 版本,那么它看起来像

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

但是您的具体用法看起来像是两者的奇怪混合。你想通过那个电话做什么?

GetModuleFileNameA 可能返回不同的字符串,具体取决于您启动程序的方式,这就是为什么您的代码在某些情况下可能看起来“工作”的原因。

【讨论】:

  • 问题不在于 rPath。我在这两种情况下都测试了内容,它们是相等的。不过,您对迭代器的看法是对的,我很傻:O
  • 好吧,抱歉,但如果您测试的内容确实与原始帖子中的内容相同,则它根本无法正常工作(除了随机的运气)。这个问题不容忽视。在你修复它之前,尝试寻找任何其他问题没有多大意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 2020-02-18
  • 1970-01-01
相关资源
最近更新 更多