1

10 年以上 C++ でプログラミングを行っていないため、レガシー C++ Win32 DLL に適切なエラー レポートを追加しようとしています。

これは、潜在的なバッファ オーバーランやセキュリティの問題は言うまでもなく、C/C++ で null で終了する文字列を扱うという信じられないほど退屈なことを思い出させてくれます。

より高度な文字列ライブラリの使用を検討しています - おそらく MFC CString または STL ライブラリです。

編集

DLL は、C++ で記述された当社のソフトウェアの古いバージョンの両方で使用されます。以降のバージョン - C# で記述されています。

コンパイラはVS2008です。

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

文字列ライブラリに関する質問

これは DLL であるため、これでよいのでしょうか。

DLL に関する特別な考慮事項はありますか?

注意すべき点はありますか?

この目的のために、あるライブラリは他のライブラリよりも優れていますか?

空文字列の質問

null で終了している場合、どの文字列関数のセットを使用すればよいですか? MS のヘルプ ドキュメントでは、古い C 関数 (strcat など) の使用を推奨していません。しかし、現在利用可能なオプションは他にもたくさんあるようです (例: _tcscat、_mbscat、wcscat など)。どちらを使用する必要がありますか? なぜですか?

4

3 に答える 3

3

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

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

于 2012-04-18T23:06:49.467 に答える
3

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

于 2012-04-18T23:01:00.517 に答える
1

注意すれば、std::stringコンストラクターを使用して常に着信を変換し、発信を .xml で変換できますstr.c_str()

于 2012-04-18T23:00:07.670 に答える