C++Builder 12.3中使用CreateOleObject创建Access数据库遇编译错误求助
在C++Builder 12.3中创建空Access数据库的解决方案
问题根源
- OleVariant赋值歧义:
CreateOleObject返回_di_IDispatch类型,直接赋值给OleVariant时,编译器无法确定匹配的重载运算符,导致报错。 - _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
相关产品推荐
相关产品推荐

