我正在尝试将QString转换为_bstr_t类型,如下所示:
QString mFilename =" C:/agatebo/amahoro.doc" ;;
QByteArray srcBa1 = mFilename.toLocal8Bit();
const char *srcString1 = srcBa1.data();
CString myStringSrc(srcString1,srcBa1.size());
BSTR bstrUser = myStringSrc.AllocSysString();
_bstr_t user(bstrUser,TRUE);
但是当我通过_bstr_t时,我得到了这个函数:
pdfObject->cPrintFile(user);
PDFCreator,我正在使用的COM接口只是崩溃的程序。我怀疑这与unicode有关但无法弄清楚是什么。我应该提到当我直接将路径传递给这样的文件时:
pdfObject->cPrintFile(L"c:\\agatebo\\amahoro.doc");
一切正常,我只是希望能够使用来自我的Qt应用程序的其他模块的QStrings。我正在使用Qt 4.8 msvc2010进行编译,如果这很重要的话。我会很感激
答案 0 :(得分:0)
您应该可以使用QString.utf16()
void ProcedureThatTakesWChar(const wchar_t* s) {
std::wcout<<s<<L'\n';
}
void ProcedureThatTakesBstr(const BSTR& s) {
std::wcout<<s<<L'\n';
}
int main(int argc, char *argv[]) {
QString qs("this is a qstring");
//pass directly
ProcedureThatTakesWChar(qs.utf16());
//if you really want to use a _b_str initialise it with .utf16()
//_b_str will handle SysAllocString and SysFreeString. QString
//does not have to stay in scope.
{
_bstr_t bs(qs.utf16());
ProcedureThatTakesBstr(bs);
}
return 0;
}
答案 1 :(得分:0)
由于您使用的是Windows,并且在传入宽字符串时方法调用有效,这意味着您要在Unicode模式下进行编译。这意味着TCHAR,_bstr_t等被类型定义为wchar_t。您可以在Windows here中了解有关Unicode支持的更多信息。
好消息是QString和Microsoft的Unicode实现都使用相同的字符编码UTF-16。
要获取原始QString数据,只需调用QString&#39; s utf16() method即可。这将返回一个指向空终止无符号短裤数组的指针 - 与Windows上的wchar_t类型相同!
所以你应该做的就是:
pdfObject->cPrintFile(mFilename.utf16());