CWinApp OpenDocumentFile"不支持的操作"错误

时间:2015-03-18 20:58:54

标签: c++ visual-studio-2010 mfc ms-office

问题

我正在尝试打开一个读取Microsoft Access数据库(.mdb)的MFC程序,并允许用户查看或修改数据。这是一个现有的程序(和源代码),由另一个实验室的小组提供给我,程序打开并运行正常。

在我们的实验室中,我还没有看到它正确加载。运行时,会弹出一个对话框,显示“尝试不支持的操作”。 Windows然后让我有机会在它崩溃之前进行调试。

环境

在另一个实验室中,他们使用的是Windows 7和Microsoft Office 2010,它可以正常运行。

在我们的实验室中,我尝试过使用Office 2013的Windows 7和使用Office 2010的Windows XP。后者在没有给我对话框的情况下崩溃。我不知道我们是否有Win7 / MSO2010机器。

功能

我有该程序的源代码。解决方案文件暗示它最后是在VS2010中开发的,我测试过的计算机也安装在VS2010中。从Visual Studio 2010中运行它或直接从可执行文件运行它会产生相同的结果。

我在代码中添加了额外的调试对话框,将问题范围缩小到this function call,代码永远不会过去:

CwinApp:OpenDocumentFile(LPCTSTR lpszPathName)

传递给函数的单个字符串是要打开的MS Access数据库的路径和文件名。它存在于另一个程序创建的临时目录中。这是在C以外的驱动器上,虽然我也在那里测试了一些。与此相关的程序问题通常源于具有“只读”状态的文件,但我会不断检查创建的临时文件,并且它们是可写的。

文档

我通过另一个SO问题为VS2010找到了标题为“Visual C ++中的重大变化”的this information

  

CDocTemplate类中添加了一个新的虚函数。这个新的虚函数是CDocTemplate :: OpenDocumentFile。以前版本的OpenDocumentFile有两个参数。新版本有三个参数。要支持重新启动管理器,从CDocTemplate派生的任何类都必须实现具有三个参数的版本。有关该函数的更多信息,请参阅CDocTemplate :: OpenDocumentFile。新参数是bAddToMRU。

代码

我觉得这可能就是答案!但是,我并没有强烈想知道要改变什么才能让它发挥作用。这是我停下来的地方:

Program.cpp

CDocument* ProgramApp::OpenDocumentFile(LPCTSTR lpszFileName, BOOL bAddToLRU, BOOL bMakeVisible)
{
    // Add specialized code here and/or call base class

    // Debug messages added
    CDocument* tempDoc;
    AfxMessageBox(lpszFileName);

    tempDoc = CWinApp::OpenDocumentFile(lpszFileName, bAddToMRU);

    AfxMessageBox("Opened database!");

    return tempDoc;
}

Program.h

class ProgramApp : public CWinApp
{
public:

...

    virtual CDocument* OpenDocumentFile(LPCTSTR lpszFileName, BOOL bAddToMRU, BOOL bMakeVisible);

afxwin.h

class CWinApp : public CWinThread
{

...

virtual CDocument* OpenDocumentFile(LPCTSTR lpszFileName);
virtual CDocument* OpenDocumentFile(LPCTSTR lpszFileName, BOOL bAddToMRU);

将Program.cpp调用更改为“模板”类会导致错误,但如果这是针对答案,我不会感到惊讶。 This solution看起来很相似,但我不确定该做什么。

我希望这个问题有一个简单的解决方案,一个知识渊博的人可以给我。我非常感激,额外的背景会有很多帮助。

编辑:调试

我深入研究了Windows代码,看看究竟出了什么问题。看起来似乎太密集了,但是同事和我可能有基于它的线索。失败消息发生在这里:

dlgdata.cpp

// Could be a windowless OCX
pSite = m_pDlgWnd->GetOldControlSite(nIDC);
if (pSite == NULL)
{
    TRACE(traceAppMsg, 0, "Error: no data exchange control with ID 0x%04x.\n", nIDC);
    ASSERT(FALSE);
    AfxThrowNotSupportedException();
}

...虽然我们在这里看到调试器问题:

occcont.cpp

COleControlSiteOrWnd *pemp = new COleControlSiteOrWnd(hwndCtrl, pOccDlgInfo->m_pItemInfo[i].bAutoRadioButton);
ASSERT(IsWindow(pTemp->m_hWnd));
if (IsWindow(pTemp->m_hWnd))
{
    hwndStart = pTemp->m_hWnd;
    ...

我的同事认为,这可能与我怀疑的这个文件的打开没什么关系,更多的是与我们在实验室计算机上没有试图用于该程序的对象/控件有关。

1 个答案:

答案 0 :(得分:1)

我在opendocumentfile()中遇到了同样的问题,在CFormView类中有一个我没有使用的控件,所以我评论了它但忘了从.rc文件中删除。一旦我从.rc文件中删除控件条目,问题就会消失。

应该没有控制变量uninitialize,请检查