我用MFC写了一个single document的程序。
     在一般情况下运行良好,并且可以放到启动项startup里面随即机启动。
     但是在很少的情况下,随机启动后没有界面,但taskmgr里面进程却存在,并且相关线程还在运行,日志还在记录。这时只有结束进程再重启动程序
     恳请各位不吝赐教!

解决方案 »

  1.   

    程序是否使用了GetCurrentDirectory?
      

  2.   

    我是CMainFrame::OnCreateClient里面创建的视图
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
    m_pMainView = new CMainView;
    ((CView*)m_pMainView)->Create(NULL, NULL, WS_CHILD|WS_VISIBLE, CRect(0,0,2000,2000), this, 0, pContext);
    SetActiveView(m_pMainView);
    m_pMainView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    m_pMainView->ShowWindow(SW_SHOW);
    return TRUE;
    }
    在CMainView的OnCreate中有GetModuleFileName操作
    int CMainView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CView::OnCreate(lpCreateStruct) == -1)
    return -1;         ... GetModuleFileName(...)        ... return 0;
    }
      

  3.   


    我使用了GetModuleFileName
    这样用对开机自动启动有影响吗?
      

  4.   

    出问题后用SPY++或者写个小程序看能否找到该程序的窗口。
      

  5.   

    很少的情况是不是机器性能不行或机器cpu,内存,GDI等负荷太重·
      

  6.   

    这种跟客户环境相关的,最好能远程连过去debug等,不然,不好重现,你怎么也不知道用户机器上干了啥。:)
      

  7.   

    会不会跟窗口站有关?看看你的程序的账户是System,还是普通用户。Startup?是不是指开始菜单里的启动文件夹?是不是把自己复制到了All users里的Startup文件夹里了?
      

  8.   


    这个跟帐户有什么关系,All users里的Startup和Administrator里的Startup有什么不同?
    望指教?
      

  9.   

    建议在日志中把WinStation,Desktop的名字都打印出来,还有进程当前的用户名,看看是否都正常。
      

  10.   

    在app的InitInstance里面做日志
    看是否走到m_pMainWnd->ShowWindow(SW_SHOW);
    如果走到了,但是窗口没有显示,那么        try
    {
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();
    }
    catch (...)
    {
    loge_printf("some thing!");
    }如果能捕捉到异常,问题有可能就复杂了
    但是也有一些办法能帮助你,看编译时候产生的警告,是不是有不常见的,比如函数无法返回了
    debug下看output窗口是否有异常警告信息
    =============================================================================
    总之这类问题一般都是由不好的编程习惯造成的,如打开文件没有判断返回值是否有效,使用一块内存去存储字符串等信息确没有对这块内存
    进行初始化等,建议楼主看一下<<c++编程规范>>
      

  11.   

    之前的程序上,出现了你描述相同的现象。
    当时的原因如下,请参考:现象:
    仅在电脑第一次启动后出现,第二次运行程序时不会出现。
    在安装了某些杀毒软件后出现,未安装的情况不出现。原因:
    发生了死锁,启动过程中,我们使用了一个Splash画面,该画面在子线程中,Splash画面非正常退出,使用了ExitThread的方法,杀死自己。但主线程并未收到子线程已经over的消息。所以一直在等待。为什么会仅出现在第一次开机后,因为第一次开机后运行等待的时间过长,造成了调用ExitThread。
    你看一下,是否也存在这种现象。
      

  12.   

    一般是App::InitInstance()的
    if (!ProcessShellCommand(cmdInfo))无返回,可以跟踪检测MainFrame::OnCreate/OnCreateClient分析原因
    有可能是执行了耗时或无效操作。
    你可以尝试使用GetModuleFileNameEx
      

  13.   

    up
    我写了个检索USB生机的程序,每次U盘插上,弹出想让Window是做什么的那个界面,关闭后,被覆盖的部分总是刷不出来,也不知道怎么调试
      

  14.   

    我也遇到过同样的问题,原因如下:
        开机时由于启动项过多导致Windows资源管理器忙,如果在这种情况下执行向托盘加载图标的任务,很可能会失败。所以就造成了,“进程存在,但在托盘中找不到图标”这种现象。
        所以对于向托盘中加载图标的代码,要检查它的返回值,直到返回成功。我的界面代码是用VB写的,不过我想原理应该是相通的。