You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++Builder 12.3中使用CreateOleObject创建Access数据库遇编译错误求助

在C++Builder 12.3中创建空Access数据库的解决方案

问题根源

  1. OleVariant赋值歧义:CreateOleObject返回_di_IDispatch类型,直接赋值给OleVariant时,编译器无法确定匹配的重载运算符,导致报错。
  2. _di_IDispatch无直接方法:_di_IDispatch是通用COM调度接口,不会直接暴露ADOX Catalog的Create方法,必须通过调度机制调用。

解决方案1:使用OleVariant(推荐,写法接近Delphi)

通过显式转换解决赋值歧义,并用OleFunction调用自动化对象方法:

#include <ComObj.hpp>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    OleVariant AdoX;
    // 显式将_di_IDispatch转换为OleVariant,消除赋值歧义
    AdoX = OleVariant(CreateOleObject(L"ADOX.Catalog"));
    // 调用ADOX.Catalog的Create方法
    AdoX.OleFunction("Create", L"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=test.accdb");
}

解决方案2:直接使用_di_IDispatch调用Invoke

如果需要直接操作COM接口,可通过GetIDsOfNames获取方法ID后调用Invoke:

#include <ComObj.hpp>
#include <System.hpp>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    _di_IDispatch AdoX = CreateOleObject(L"ADOX.Catalog");
    DISPID dispID;
    HRESULT hr = AdoX->GetIDsOfNames(IID_NULL, LPOLESTR(L"Create"), 1, LOCALE_USER_DEFAULT, &dispID);
    
    if (SUCCEEDED(hr))
    {
        TVariant params[1] = {L"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=test.accdb"};
        DISPPARAMS dp = {params, NULL, 1, 0};
        Variant result;
        hr = AdoX->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dp, &result, NULL, NULL);
    }
}

内容的提问来源于stack exchange,提问作者Mark Di Val

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:44:51