【发布时间】:2013-12-28 21:35:10
【问题描述】:
我在调用 OpenDatabase 函数 (DAO) 时遇到问题。它的原型是:
virtual HRESULT STDMETHODCALLTYPE OpenDatabase(BSTR Name/*[in]*/, VARIANT Options/*[in,opt]*/,
VARIANT ReadOnly/*[in,opt]*/,
VARIANT Connect/*[in,opt]*/,
Dao_tlb::Database** ppDb/*[out,retval]*/) = 0; // [-1]
所以,当我这样做时:
if(OpenDialog1->Execute() != true) return;
选中的文件名保存在OpenDialog1->FileName中。然后我调用上面的函数:
pDatabasePtr = pDBEngine->OpenDatabase(WideString(OpenDialog1->FileName).c_bstr(), myOpts, myRead, myCon);
这行得通!但是,问题是当我尝试将文件名设置为其他内容时:
OpenDialog1->FileName = ParamStr(1); // OpenDatabase don't work in runtime - file not recognised!
甚至在函数中设置文件名:
pDatabasePtr = pDBEngine->OpenDatabase(WideString(L"SomeDB.mdb").c_bstr(), myOpts, myRead, myCon);
在这两种情况下,我都会遇到奇怪的错误,并且永远无法打开数据库。所以,我可能错误地将 UnicodeString/WideString 转换为 BSTR。
那么,为什么这个函数(OpenDatabase)可以使用
if(OpenDialog1->Execute() != true) return;
不适合
OpenDialog1->FileName = ParamStr(1);
如何正确设置转换?
【问题讨论】:
-
OpenDialog1->FileName是如何声明的? -
未声明。通过调用 OpenDialog1->Execute() 对其进行初始化。
-
但您必须有某种声明,例如函数/变量/数据类型什么的。您尝试分配给它,所以 FileName 必须是某种变量?
-
不需要任何声明,因为 Execute() 在用户选择文件后设置 FileName。我只是想绕过 Execute 并将 FileName 设置为其他内容 - 例如 ParamStr(1)。
-
不管你想做什么,@claptrap 的问题仍然存在:
FileName是如何声明的?它必须具有数据类型。那是什么类型的?
标签: c++ string c++builder bstr