CWinApp OpenDocumentFile "unsupported operation" 错误

CWinApp OpenDocumentFile "unsupported operation" error

本文关键字:错误 operation unsupported CWinApp OpenDocumentFile      更新时间:2023-10-16

问题

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

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

环境

在另一个实验室,他们使用的是Windows7和MicrosoftOffice2010,而且效果良好。

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

函数

我有这个程序的源代码。解决方案文件表明它上次开发是在VS2010,我测试的计算机也安装了它。从Visual Studio 2010或直接从可执行文件中运行它会产生相同的结果。

我在代码中添加了额外的调试对话框,将问题缩小到这个函数调用,代码永远不会通过:

CwinApp:OpenDocumentFile(LPCTSTR lpszPathName)

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

文件

我通过另一个SO问题找到了VS2010的标题为"打破Visual C++中的变化"的信息:

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

代码

我觉得这可能就是答案!但我不太清楚到底该改变什么才能让它发挥作用。这是我停下来的地方:

程序.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;
}

程序.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调用更改为"Template"类会导致错误,但如果这是正确的答案,我也不会感到惊讶。这个解决方案看起来很相似,但我不确定该怎么办

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

编辑:调试

我深入研究了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;
    ...

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

我在opendocumentfile()中遇到了同样的问题,CFormView类中有一个控件我没有使用,所以我把它注释掉了,但忘记了从.rc文件中删除。一旦我从.rc文件中删除了控制项,问题就消失了。

不应该有取消初始化的控制变量,请检查