2015-02-08 103 views
0

我想如下轉變爲QString到_bstr_t類型:問題轉化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,但可以在程序「噸弄清楚什麼yet.I應該提到的是,當我直接傳遞給這樣的文件的路徑:

pdfObject->cPrintFile(L"c:\\agatebo\\amahoro.doc"); 

一切正常,我只是希望能夠使用來自其他國防部將QString我的Qt應用程序。我正在編譯Qt 4.8 msvc2010,如果這很重要。我將不勝感激任何

回答

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; 
} 
+0

我試着用ProcedureThatTakesBstr(BS)的一個;這是扔我文件無法找到錯誤。 – musimbate 2015-02-08 11:22:19

+0

這是一個非常模糊的問題描述。你的意思是代碼編譯並運行,但是你在運行時遇到錯誤?如果是這樣的話,我需要更多地瞭解你爲了幫助你而想要做什麼。 – user3200739 2015-02-09 21:14:07

0

既然你是在Windows上,當你在一個寬字符串通過方法調用的工作,這意味着你以Unicode模式編譯。這意味着TCHAR,_bstr_t等被typedefed爲wchar_t。您可以在Windows here中瞭解有關Unicode支持的更多信息。

好消息是QString和Microsoft的Unicode實現都使用相同的字符編碼,UTF-16

要獲取原始QString數據,只需調用QString的utf16() method即可。這會返回一個指向一個以null結尾的unsigned shorts數組的指針 - 與Windows上的wchar_t類型相同!

在所有你應該在這裏做

所以是這樣的:

pdfObject->cPrintFile(mFilename.utf16()); 
+0

我試過你的建議。該程序不會崩潰,但它是拋出錯誤,說該文件無法找到。 – musimbate 2015-02-08 11:20:31

+0

這是我的錯誤日誌的情況下,它可能會幫助 錯誤描述: 錯誤-數:\t 76(找不到路徑) MODUL:\t modGeneral 步驟:\t的GetFiles 線:日期/時間:\t 2015 - 02-08/15:19:17 CALLSTACK: ------------------------------------ ---------------------------------- SYSTEMINFO: Windows 7 6.1 Build 7601(Service Pack 1) [ TerminalServer IsWinXPPlus IsWinVistaPlus IsWinVistaSP1 IsWindows7] – musimbate 2015-02-08 11:21:47

+0

@musimbate This soun ds像一個不相關的問題/新問題。 – MrEricSir 2015-02-08 19:01:17