2012-04-18 13 views
1

C++で10年以上プログラムされていないのに、従来のC++ Win32 DLLに適切なエラーレポートを追加しようとしています。レガシーC++ Win32 DLLでヌル終了文字列 - より良い方法がありますか?

これは、バッファオーバーランやセキュリティ問題の可能性はもちろん、C/C++でNULL終了文字列を処理するという非常に辛いことを思い出させるものです。

MFC CStringやSTLライブラリなど、より高度な文字列ライブラリを使用することを検討しています。

編集

DLLは、当社のソフトウェアの両方の古いバージョンで使用されている - C++で書かれました。新しいバージョン - C#で書かれています。

コンパイラはVS2008です。

エラーメッセージをDLLクライアントに戻すのが大きなアーキテクチャ上の変更になるため、最初のパスでは標準Windowsイベントログにログを記録しています(現在のアーキテクチャはひどく、複数の障害モードが単一のコールスタックをバックアップするために渡されるブール型の合格/不合格の戻り値。これは問題診断が悪夢となることは言うまでもない)。しかし、後でこれを改善したいと思うでしょう。これはDLLであるので

文字列ライブラリは

に関する質問、これはさらに良いアイデアですか?

DLLについて特別な考慮事項はありますか?

私は注意する必要がありますか?

この目的のために1つのライブラリが他のライブラリよりも優れていますか?私が使用する必要があり、私は、文字列関数の集合nullで終了、とこだわっている場合

null文字列は

に関する質問しますか? MSのヘルプドキュメントは、古いC関数(strcatなど)の使用を妨げています。しかし、現在利用可能な他の多くのオプションがあるようです(例:_tcscat、_mbscat、wcscatなど)。どちらを使うべきなのですか?なぜですか?

+0

どのバージョンのVC++コンパイラを使用していますか? @Remyが指摘しているように、エラーレポートがどのようにどこで消費されたかは、ここで最も重要な問題です。 log4cppのような既存のインフラストラクチャを検討しましたか? –

+0

@SteveTownsend - 私の編集を参照してください –

+0

私はlog4cppを見ていきます。 Windowsイベントログアペンダーが組み込まれており、後で簡単に変換(または複数のアペンダーを使用)することができます。これは、既存のコードでchar *をどのように扱うかを決定するよりも、コスト的に重要な決定です。クライアントアプリケーションがログデータを直接消費する必要があるときに、C++/C#クライアント間で関連するマーシャリングの問題を扱うことができます。今のところ、問題のデバッグ情報をすばやく追加することが優先事項です。 –

答えて

3

DLLから任意の種類のテンプレートクラスを共有することは危険です。テンプレートはヘッダファイルに入っているので、プログラムがあなたのDLLと同じバージョンのヘッダーを使用しているかどうかを制御することはできません - 不一致が致命的なバグにつながる可能性があります。

_tcscat、_mbscat、およびwcscatの違いについては、API用の文字セットを決定する必要があります。_mb関数は、ほとんど廃止されたマルチバイト文字セットを使用し、wc関数はwchar_t Unicodeを使用します。 _t関数は、プロジェクト定義の設定方法によってどちらか一方に解決されます。

+0

警告ありがとうございます。また、関連する質問 "DLL関数からの文字列の返却" http://stackoverflow.com/q/4446620/102554非常に有益なこの種の問題を発見しました。 –

+0

WRTを_t関数に追加するには、プロジェクト定義がDLLプロジェクトとクライアントプロジェクトの両方で同じであることを確認する必要がありますか? VS IDEのこれらのプロジェクト設定はどこにありますか? –

+0

@TomBushell DLLとクライアントのプロジェクト設定に不一致があると、関数のシグネチャが一致しないため、リンクエラーが発生します。この設定は、[構成のプロパティ]、[一般]、[キャラクタセット]で確認できます。 –

1

あなたがいつもstd::stringコンストラクタを使用して受信したものを変換し、str.c_str()で送信するものを変換することができます。

+0

std :: stringはMFC CStringよりも優れた選択肢だと思いますか?関連する質問をすばやく参照すれば、より多くの人々がstd :: stringを使用していると信じることができます。 –

+0

@TomBushell、 'std :: string'は標準であり、そうしないと良い理由がない限り、すべての場合に使用します。あるいは、この例ではWindowsのUnicodeサポートのための 'std :: wstring'も標準的です。 –

+0

私は、従来のC++ MFCクライアントではCStringを使用していることを発見しました。そのため、DLLでも同様の使い方をしています。しかし、コンセンサスは、char *をDLLの境界で使用するのが最善の方法だと思われます。 –

3

実際にどのような種類のエラーレポートを追加したいのか、そのレポートがDLLの内部にあるのか、それともDLLLの境界線を呼び出しEXEに渡すのかによって異なります。 DLLの内部コードに必要な文字列クラス/ライブラリを使用できますが、エクスポートされたDLL関数とコールバックのパラメータには、複数のコンパイラと言語との互換性のためにヌル終了文字ポインタを使用してください。

関連する問題