0

I'm trying to use the StringCchCat function:

    HRESULT X;
    LPWSTR _strOutput =  new wchar_t[100];
    LPCWSTR Y =L"Sample Text";
    X = StringCchCat(_strOutput, 100, Y);

But for some reason I keep getting the "E_INVALIDARG One or more arguments are invalid." error from X. _strOutput Is also full of some random characters.

This is actually part of a bigger program. So what I'm trying to do is to concatenated the "sample text" to the empty _strOutput variable. This is inside a loop so it is going to happen multiple times. For this particular example it will be as if I'm assigning the Text "Sample Text" to _strrOutput.

Any Ideas?

4

3 に答える 3

2

ループの一部である場合は、簡単*_strOutput = 0;に問題を解決できます。

代わりに、文字列を連結するのではなく、コピーしようとしている場合は、これを行う特別な関数があります: StringCchCopy.

編集: 余談ですTCHARが、API のバージョンを使用している場合 (実際に使用している場合)、文字列をTCHAR配列として宣言する必要があります (つまり、LPTSTRの代わりにLPWSTR、 の_T("")代わりにL"")。これにより、コードは少なくとも適度に移植可能になります。

于 2015-02-14T18:18:36.937 に答える
1

昨日(メッセージボックスに)同じバグがあったため、通知するためにこの回答を書いています(スタックオーバーフローページの上部に赤い1が表示されます)。回答でこれを言い忘れていたことに気づきました。昨日。

orのような組み込み型のnew[]演算子は、データをまったく初期化しないことに注意してください。取得するメモリには、呼び出しの前にそこにあったガベージが含まれます。それが何であれ。ローカル変数として言う場合も同じことが起こります。データを使用する前に、注意してデータを初期化する必要があります。コンパイラは通常、これについて警告するのが得意です。(C++ オブジェクトには各要素に対して呼び出されるコンストラクターがあると思います。そのため、エラーは発生ません...もちろん、クラスで何かを初期化するのを忘れない限り。それはしばらく経ちました。)WCHARintnew[]WCHAR x[100];

多くの場合、すべてをゼロにしたいでしょう。/'\0'文字L'\0'もゼロです。Windows API には、ZeroMemory()メモリをゼロで埋めるためのショートカットである関数があります。

ZeroMemory(array, size of array in bytes)

したがって、 a を初期化するには、次のWCHAR str[100]ように言うことができます

ZeoMemory(str, 100 * sizeof (WCHAR))

ここで、sizeof (WCHAR)は 100WCHAR秒を同等のバイト数に変換します。

他の回答が言うように、文字列の最初の文字をゼロに設定するだけで文字列には十分です。あなたの選択。

また、確認のために、他の質問に対する他の回答を読みましたか? それらは、あなたがやろうとしていたタスクにより適しています (そして、私はプロセス API についてまったく知識がありません。回答についてドキュメントを確認しただけです)。

于 2015-02-14T21:06:01.067 に答える
1

文字列のコピー/連結関数は、どこにコピー/連結するかを知るために null ターミネータを探します。の最初の要素_strOutputをゼロに初期化して、バッファが null で終了するようにする必要があります。その後、必要に応じて値をコピー/連結できます。

LPWSTR _strOutput =  new wchar_t[100];
_strOutput[0] = L'\0`; // <-- add this
X = StringCchCat(_strOutput, 100, Y);
于 2015-02-14T18:19:26.660 に答える