2016-07-28 37 views
-1

この問題に関する質問はたくさんあり、さまざまな解決方法を試しています。これを行うには数多くの方法があるようですが、誰も働いていません。私はC++とVSにはとても新しく、約1ヶ月働いており、VC++を使って自動Excelプログラムをコーディングしようとしています。私はwchar_t *とunsigned long longを連結しようとしています。最初のステップは、unsigned long longをwchar_t *に「変換する」ことです。私はコード全体を投げてしまったことをお詫びしますが、私が目指していることを示し、コードに他の弱点があるかどうかを示すのに役立つと思います。unsigned 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 *の最終的な出力先は、VARIANTからSysAllocStringまでのBSTRです。

私はコードの改善と実際にコードを実行する方法についてお勧めします。

+2

あなたがのstd :: wstring' '取得するために' unsingned長いlong'に[STD :: to_wstring](http://www.cplusplus.com/reference/string/to_wstring/)を使用することができます。次に、その文字列から 'wchar_t *'を得るか、 'std :: wstring'(これは簡単です)で動作します。 – Serikov

+2

このコードにはいくつかのバグがあります。ローカル変数へのポインタを返す関数。メモリをリークする関数。型キャストの間違い。この全体を書き直す必要があります。 –

+0

助けてくれてありがとう! 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; 
} 
関連する問題