【问题标题】:How to convert UnicodeString to BSTR?如何将 UnicodeString 转换为 BSTR?
【发布时间】: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


【解决方案1】:

如果其他人需要,我在这里找到了答案: https://forums.embarcadero.com/thread.jspa?messageID=498776

【讨论】:

  • 链接已损坏。
猜你喜欢
  • 2010-10-11
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2016-02-14
  • 2015-09-27
  • 2018-01-11
  • 2012-07-02
  • 2011-04-08
相关资源
最近更新 更多