fopen()失败了

时间:2012-04-20 16:25:48

标签: c++ windows fopen

我有一个C ++程序,当windows xp启动时,它会与远程服务器同步文件。需要打开公钥文件的函数在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 );
}

修改

我找到了解决问题的hackery解决方案:如果我释放运行时库然后重新加载它,问题就会消失。然而,这不是一个非常优雅的解决方案。是否有可能在没有删除和重新加载DLL的情况下重置运行时?

1 个答案:

答案 0 :(得分: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)的{​​{1}}版本,那么它会显示为

erase

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

rPath.erase( ret, rPath.size() - ret ); 可能会返回不同的字符串,具体取决于您启动程序的方式,这就是为什么您的代码在某些情况下似乎“有效”的原因。