2016-07-28 323 views
-1

在這個問題上有很多問題,我一直在嘗試各種解決方案。似乎有幾十種方法可以做到這一點,但是他們都沒有工作。我對C++和VS非常陌生,工作了大約一個月,我正在嘗試使用VC++編寫一個自動化的Excel程序。我試圖連接一個wchar_t *和一個無符號long long。我假設第一步是將unsigned long long「轉換」爲wchar_t *。我很抱歉拋出整個代碼,但我認爲這可能有助於展示我的目標,以及代碼中是否存在其他弱點。將無符號long long轉換爲wchar_t *並連接

wchar_t * ex(wchar_t * dest, unsigned long long num); 
int main() 
{ 

unsigned long long num = 10; 
wchar_t *dest= L"A2:B"; 
wchar_t * Path=ex(dest, num); 
VARIANT param; 
    param.vt = VT_BSTR; 
//  param.bstrVal = SysAllocString(L"A2:B10"); 
    param.bstrVal = SysAllocString(Path); 
getchar(); 

return 0; 
} 

wchar_t * ex(wchar_t * dest, unsigned long long num) 
{ 
    // Convert num to wchar_t * 
    wchar_t *rangeMax = (wchar_t *)num; 

    // I think this is used to eliminate extra space in other solutions 
    // but not here. It could be useful. 
    const int MAX_CHARS = 50; 
    size_t count = wcsnlen_s(dest, MAX_CHARS); 
    wprintf(L"The length of the string is %ld characters\n", count); 

    // Throw dest into buf 
    wchar_t buf[25] = { 0 }; 
    int r = wcscpy_s(buf, 25, dest); 
    if (r != 0) { 
     wprintf(L"wcscpy_s() failed %ld", r); 
    } 

    r = wcscat_s(buf, 25, rangeMax); 

    if (r != 0) { 
     wprintf(L"wcscat_s() failed %ld", r); 
    } 
    wprintf_s(buf); 
    return buf; 
} 

ex是來自zetcode的編輯示例。我認爲它接近於解決方案,但是當結合buf和rangeMax時,代碼會拋出各種內存異常並失敗。

正如你所看到的,連接wchar_t *的最終目的地是通過SysAllocString作爲VARIANT中的BSTR。

我明白任何有關代碼改進的建議,以及如何使代碼實際運行!

+2

您可以使用[的std :: to_wstring(http://www.cplusplus.com/reference/string/to_wstring/)上'unsingned長long'得到'的std :: wstring'。然後你可以從該字符串中獲得'wchar_t *'或者使用'std :: wstring'(這更簡單)。 – Serikov

+2

這段代碼有幾個bug。返回指向局部變量的指針的函數。一個泄漏內存的函數。類型轉換錯誤。這整個事情需要重寫。 –

+0

感謝您的幫助!我結束了將wstrings和它們結合起來,然後'wchar_t * string2 =(WCHAR *)string.c_str();' –

回答

0

建議使用wstring按預期運行。感謝您指出我正在返回一個指向局部變量的指針!一旦返回主類型改爲wchar_t *,它很好地傳遞給SysAllocString()以供我的主程序使用。

std::wstring ex(wchar_t * dest, unsigned long long num); 
int main() 
{ 
    unsigned long long num = 10; 
    wchar_t *dest= L"A2:B"; 
    std::wstring PathString= ex(dest, num); 
    wchar_t *wPath = (WCHAR *)PathString.c_str(); 
    std::wcout << L"In main\n"; 
    std::wcout << wPath << L'\n'; 
    VARIANT param; 
     param.vt = VT_BSTR; 
     //param.bstrVal = SysAllocString(L"A2:B10"); 
     param.bstrVal = SysAllocString(wPath); 

getchar(); 

return 0; 
} 

std::wstring ex(wchar_t * dest, unsigned long long num) 
{ 
    std::wstring rangeMax = std::to_wstring(num); 
    std::wstring string(dest); 
    string += rangeMax; 
    std::wcout << L"In function\n"; 
    std::wcout<<string<<L'\n'; 

    return string; 
}