Visual studio 2008 visualc&x2B+;项目在VStudio中运行正常,但在出现在通知栏中后,资源管理器中的项目将终止

Visual studio 2008 visualc&x2B+;项目在VStudio中运行正常,但在出现在通知栏中后,资源管理器中的项目将终止,visual-studio-2008,c++-cli,streamreader,visual-c++-2008-express,Visual Studio 2008,C++ Cli,Streamreader,Visual C++ 2008 Express,我刚刚修改了我的C++/CLI项目,以改变它解析config.ini文本文件的方式。但它仍然像以前一样访问磁盘上的文件: StreamReader^sr=gcnewstreamreader(CONFFILE\u名称); 字符串^rdfl=sr->ReadToEnd(); sr->Close(); 现在它不会在VS2008Express环境之外运行。它是一个假装是服务的WinForm,应该留在通知托盘中,但它只是在那里闪烁默认图标,直到我将鼠标滚动到它上面,这肯定表明它已经异常终止。默认图标应该

我刚刚修改了我的C++/CLI项目,以改变它解析config.ini文本文件的方式。但它仍然像以前一样访问磁盘上的文件:

StreamReader^sr=gcnewstreamreader(CONFFILE\u名称);
字符串^rdfl=sr->ReadToEnd();
sr->Close();
现在它不会在VS2008Express环境之外运行。它是一个假装是服务的WinForm,应该留在通知托盘中,但它只是在那里闪烁默认图标,直到我将鼠标滚动到它上面,这肯定表明它已经异常终止。默认图标应该立即更新,所以我会再次检查到这一点。我刚刚试过一次干净的重建

谢谢

_编辑

如果配置文件不在那里或不兼容,它运行正常-出现一个窗口,我输入正确的配置,然后关闭。但是它从VS2008中的一个文件重新加载配置数据,而以前它从外部重新加载配置数据(尽管编码中有一个严重的逻辑错误)

下面是紧跟在上面发布的代码:

intfore=0;
船尾;
而(statsRead<4){
fore=rdfl->IndexOf(':',aft)+1;
如果(前==-1)断开;
aft=rdfl->IndexOf('\n',fore);
如果(后==-1)断裂;
如果(statsRead==0)str1=rdfl->Substring(fore,aft-fore)->Trim();
否则,如果(statsRead==1)str2=rdfl->Substring(fore,aft-fore)->Trim();
否则{
字符串^tmpIntStr=rdfl->子字符串(前、后前)->修剪();
int tmp_int;
if(Int32::TryParse(tmpIntStr,tmp_int)){
开关(statsRead){
案例2:int1=tmp_int;中断;
案例3:int2=tmp_int;中断;
}
}否则就断了;
}
++statsRead;
}
}
之后,除了触发窗口的第一个属性外,其余的属性都会被赋予默认值,这在我的例子中是有效的

_编辑

我已经按照Hans和StreamReader的MSDN literatur的建议,使用try-and-catch块更新了上述内容,但仍然失败,堆栈跟踪(谢谢,Hans)表明故障是我的
,而
语句(不,谢谢,MS)

if(文件::存在(文件名)){
字符串^rdfl;
试一试{
StreamReader ^sr=gcnew StreamReader(文件名);
试一试{
rdfl=sr->ReadToEnd();
}最后{
if(sr)
删除(IDisposable^)sr;
}
}捕获(异常^ex){
MessageBox::Show(ex->Message);
}
int=0;
船尾;
而(statsRead<4){
fore=rdfl->IndexOf(':',aft)+1;
如果(前==-1)断开;
aft=rdfl->IndexOf('\n',fore);
如果(后==-1)断裂;
如果(statsRead==0)str1=rdfl->Substring(fore,aft-fore)->Trim();
否则,如果(statsRead==1)str2=rdfl->Substring(fore,aft-fore)->Trim();
否则{
字符串^tmpIntStr=rdfl->子字符串(前、后前)->修剪();
int tmp_int;
if(Int32::TryParse(tmpIntStr,tmp_int)){
开关(statsRead){
案例2:int1=tmp_int;中断;
案例3:int2=tmp_int;中断;
}
}否则就断了;
}
++statsRead;
}
}

这通常是一个简单的错误,例如CONFFILE\u NAME不是完整路径名,默认工作目录没有设置在您希望的位置。重点是连接调试器。这在.NET中很容易,例如在Main()方法中使用System::Diagnostics::Debugger::Launch()。并为AppDomain::CurrentDomain->UnhandledException编写一个事件处理程序,以便异常不会在没有通知的情况下落入位存储桶。确保删除不应该存在的try/catch语句。

您是否使用提升的权限运行VS?(即:作为管理员)提升为低年龄的我,lol。我的默认Windows帐户类型为“Computer Administrator”int fore=0;船尾;应为int aft=0;很有魅力,谢谢你了。但仍然不明白为什么错误只在VS启动器外部出现。“索引超出范围。必须为非负且小于集合的大小。参数名称:startIndex”这不是我的变量之一!?当然,您的变量引用的是.NET类。别忘了显示异常的StackTrace属性,这样您就可以看到它是如何坏掉的。在事件处理程序中使用e->UnhandledException->ToString()进行简单处理。并使用调试器。如果我将上面给出的所有代码包装在try{/*..*/}catch(异常^ex){MessageBox::Show(ex->Message);}中,它就可以工作,没有MessageBox或任何东西,如果我不这样做,它就不能工作。为什么会这样?Re:最后一条评论,但调试器没有找到错误,我会再试一次。您要求我从“this Not work”评论中反向工程错误代码。我不知道怎么做。您正在忽略我关于自动附加调试器的建议,请使用AppDomain::UnhandledException和e->UnhandledException->ToString()。不知道为什么,祝你好运!