Ternence_xu 2014-08-10 02:14 采纳率: 0%
浏览 755

MFC全局對象問題進行聲明

今天編寫一個MFC的應用程序,其中涉及到連接數據庫,單獨寫了一個類用來連接數據庫,代碼如下:

My.h

#include "stdafx.h"

class myApp : public CWinApp{
public:
_RecordsetPtr m_pRt;
_ConnectionPtr m_pConn;
public:
myApp();
virtual BOOL Instance();
void close();
};

My.cpp

#include "stdafx.h"
#include "My.h"
myApp theApp1;
BOOL myApp::Instance(){
try
{
CoInitialize(NULL);
m_pConn->ConnectionString="Provider=MSDAORA.1;Password=tiger;User ID=scott;Data Source=orcl;Persist Security Info=True";
m_pConn->Open("","","",adConnectUnspecified);

}
catch (...)
{
    ::MessageBox(NULL,L"連接數據庫失敗!",L"提示信息",NULL);
    return FALSE;
}
return TRUE;

}

void myApp::close(){
m_pRt->Close();
m_pConn->Close();
CoUninitialize();
}

myApp::myApp(){

}
編譯的時候發生錯誤,錯誤內容是彈出一個對話框,內容是:

Debug Assertion Failed!
Program:G:\C++\New_Conn\Debug\New_Conn.exe
File:f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appcore.cpp
Line:274

For information on how your program can cause an assertion failure,see
the Visual C++ documentation on asserts.
中止 重試 忽略

以上為對話框內容

但是如果將那個
myApp theApp1; 給註釋掉的話,編譯沒錯 可以運行。請大神指教不勝感激

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-05-26 22:41
    关注

    该回答引用ChatGPT-3.5

    根据你提供的代码和错误信息,问题出现在你声明了全局对象 myApp theApp1; 的地方。在 MFC 中,应用程序对象(CWinApp 的派生类)只能有一个全局实例。通常,这个实例是在自动生成的 MFC 应用程序类中声明和创建的。


    你的代码中,你在自定义的 myApp 类中创建了一个全局对象 theApp1,这与 MFC 的设计冲突。因此,在编译时发生了错误。


    要解决这个问题,你可以删除自定义的 myApp 类,并使用自动生成的 MFC 应用程序类来处理数据库连接。以下是一种可能的解决方案:

    1. 删除 My.hMy.cpp 文件中的自定义 myApp 类的代码。

    2. 打开你的应用程序类头文件(通常是 YourAppName.h),并将其更改为以下内容:

    #include "stdafx.h"
    
    class CYourAppNameApp : public CWinApp
    {
    public:
        CYourAppNameApp();
    
        virtual BOOL InitInstance();
        virtual int ExitInstance();
    };
    
    1. 打开你的应用程序类的源文件(通常是 YourAppName.cpp),并将其更改为以下内容:
    #include "stdafx.h"
    #include "YourAppName.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    BEGIN_MESSAGE_MAP(CYourAppNameApp, CWinApp)
    END_MESSAGE_MAP()
    
    CYourAppNameApp::CYourAppNameApp()
    {
        // TODO: 在此处添加构造代码
    }
    
    CYourAppNameApp theApp;
    
    BOOL CYourAppNameApp::InitInstance()
    {
        // 初始化数据库连接
        try
        {
            CoInitialize(NULL);
            _ConnectionPtr pConn;
            _RecordsetPtr pRt;
    
            pConn.CreateInstance(__uuidof(Connection));
            pConn->ConnectionString = "Provider=MSDAORA.1;Password=tiger;User ID=scott;Data Source=orcl;Persist Security Info=True";
            pConn->Open("", "", "", adConnectUnspecified);
    
            // 将数据库连接对象和记录集对象保存到应用程序类中
            m_pMainWnd = NULL;  // 设置主窗口指针为 NULL
            m_pConn = pConn;
            m_pRt = pRt;
        }
        catch (...)
        {
            ::MessageBox(NULL, L"连接数据库失败!", L"提示信息", NULL);
            return FALSE;
        }
    
        // TODO: 在此处执行应用程序的其他初始化操作
    
        return CWinApp::InitInstance();
    }
    
    int CYourAppNameApp::ExitInstance()
    {
        // 关闭数据库连接
        m_pRt->Close();
        m_pConn->Close();
        CoUninitialize();
    
        return CWinApp::ExitInstance();
    }
    

    请注意,上述代码假设你的应用程序类名称为 CYourAppNameApp。你需要将其替换为你实际使用的应用程序类名称。


    这样修改后,你的应用程序将使用自动生成的应用程序类来处理数据库连接,并且不会再出现全局对象冲突的错误。

    评论

报告相同问题?

悬赏问题

  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能