首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VC++ _ConnectionPtr 全局變量定義與跨文件引用錯誤解決

     編輯:程式設計綜合問答

錯誤現象

定義全局 _ConnectionPtr pConn 時編譯報錯:
already defined in amazing.obj

原因

  • 在頭文件中直接定義(非聲明)導致多個 .cpp 包含時重複定義。
  • 或在多個 .cpp 中各自定義同名全局變量。

正確做法:聲明與定義分離

1. 公共頭文件 GlobalDB.h

// 僅聲明,extern 告訴編譯器「定義在別處」
extern _ConnectionPtr g_pConn;

2. 唯一源文件 GlobalDB.cpp


#include "GlobalDB.h"
// 真正分配內存的定義
_ConnectionPtr g_pConn;

3. 其他文件引用


#include "GlobalDB.h"
// 直接使用 g_pConn
if (g_pConn == NULL) { ... }

進階:封裝為單例管理類(推薦)


class CDBManager
{
public:
    static CDBManager& Instance()
    {
        static CDBManager inst;
        return inst;
    }
    _ConnectionPtr GetConnection() { return m_pConn; }
    HRESULT Connect(...)
    {
        return m_pConn.CreateInstance(__uuidof(Connection));
    }
private:
    CDBManager() {}
    _ConnectionPtr m_pConn;
};

// 使用
CDBManager::Instance().GetConnection()->Execute(...);

常見坑點

  • 初始化順序:全局智能指針構造時 COM 庫可能未初始化(CoInitialize),導致 CreateInstance 失敗。單例模式可在首次調用時懶加載初始化。
  • 線程模型:ADO 連接對象通常為 STA,跨線程使用需封送(CoMarshalInterThreadInterfaceInStream)。
  • 智能指針模板參數:_ConnectionPtr 實為 _com_ptr_t<_com_IIID<_Connection, &__uuidof(Connection)>>,確保引用正確類型庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved