0

私はちょっとここで立ち往生しています。Commerce Server 2009 用のカスタム Pipleline コンポーネントを開発していますが、それは私の問題とはほとんど関係ありません。

パイプのセットアップでは、構成用の値を入力するための Windows フォームをユーザーに提供します。これらの値の 1 つは、SharePoint サイトの URL です。Commerce Server は、このすべてのパイプラインの背後で C++ コンポーネントを使用するため、入力された値は IDictionary に入れられ、最終的に Microsoft の C++ コンポーネントを介して DB に永続化されます。

パイプラインの実行中に文字列を読み取ると、C++ の IDictionary オブジェクトで渡されます。私の C# コードでは、URL の末尾に \0\0 が付けられていることがわかります。それらがどこから来ているのかはわかりませんが、有効な URI ではないため、コードが爆発します。文字列を保存する前にトリミングし、読み取り時にトリミングしていますが、それでもそれらを取り除くことはできません。

これを引き起こしている原因と、それを取り除く方法はありますか? サブストリングのようなハックではなく、根本的な原因を突き止めるようなものを好むのです。

ありがとう、コーリー

4

4 に答える 4

4

これは役に立ちますか:

string sFixedUrl = "hello\0\0".Trim('\0');
于 2009-12-06T17:06:24.440 に答える
1

他の投稿で説明されているように、C の文字列は null で終了します。(ただし、C++ は、それに依存しない文字列型を既に提供していることに注意してください。)

二重のヌルで終わる文字列を取得しているため、ケースは少し異なります。私はここでは専門家ではないので、間違っている場合は誰でも遠慮なく訂正してください。しかし、これは、ワイド文字を使用する Windows の Unicode/i18n 対応アプリケーションの典型的な文字列表現のように見えます。これを見てください。

推測の 1 つは、文字列をデータベースに永続化するアプリケーションが「移植可能な」戦略を使用していないことです。たとえば、実際の長さではなく生のバイト単位のサイズを考慮して、文字列バッファーを保持している可能性があります。前者は最後に余分な 2 つのゼロをカウントし (したがって、それらも永続化します)、後者はそれらを破棄します。

于 2009-12-06T17:43:58.797 に答える
0

このサイトから:

C の文字列は、最後の文字が NUL 文字 (ASCII/Unicode ポイント 0) に設定された単純な文字の配列です。この null ターミネータは必須です。そこにない場合、文字列は不正な形式です。C/C++ の文字列リテラル トークン ("string") はこれを保証します。

 const char *str = "foo";

と同じです

 const char *str = {'f', 'o', 'o', 0};

そのため、C++ コンポーネントが IDictionary を取得するとすぐに、最後に null で終わる文字列が追加されます。削除したい場合は、辞書を送り返す前にヌル終了文字を最後から削除する必要があります。null で終了する文字を削除する方法については、この投稿を参照してください。基本的には、正確なサイズを知り、トリミングする必要があります。

于 2009-12-06T17:23:44.660 に答える
0

使用できるもう 1 つの手法は、文字の配列と配列の長さです。文字の配列には、終端のヌル文字は必要ありません。

このデータ構造を渡すときは、長さも渡す必要があります。C スタイルの文字列の規則では、'\0' (または Unicode では '\0\0') を検索して文字列の末尾を決定します。配列には終了文字がないため、常に長さが必要です。

より良い解決策は、を使用することstd::stringです。null 文字は追加されません。互換性または C スタイルの形式が必要な場合は、c_str()メソッドを使用します。GUI フレームワークには独自の文字列データ型があり、std::string.

于 2009-12-06T18:31:06.797 に答える