2

私たちの C++ プロジェクトは、(まだ) Treat wchar_t as Built-in: No (/Zc:wchar_t-)VS6 でコンパイルされた当時のオプションを使用しています。

これは、 ( )wchar_tの単なる typedef になります。unsigned shortWORD

これを変更しwchar_tて、適切な組み込み型として処理されるようにしたいと考えています。これにより、(最新の) ライブラリの統合が大幅に容易になります。

問題は、再コンパイルできないいくつかの DLL にリンクしていて、それらの文字列を として公開しunsigned short*、それらのヘッダーが を使用していることwchar_t*です。wchar_t が組み込み型の場合、エクスポート シンボルが明らかに異なるため、リンカー エラーが発生します。

ヘッダーを変更するには、一種のキャスト レイヤーを追加する必要があります。これらのヘッダーのクラスを呼び出すすべてのコードにキャストを追加したくはありません。

wchar_tDLL を修正して、それらのエクスポート シンボルが の代わりにビルトインをエクスポートするように "ふりをする" ようにすることは可能WORDですか? 結局、2 つの型は VC++ で 100% バイナリ互換です。

他のアイデアはありますか?

4

2 に答える 2

1

大丈夫です。バイナリ互換です。

唯一の壁は、エクスポートされた関数の名前マングリングです。変更できない DLL が装飾された C++ 名を使用してこれらの関数をエクスポートした場合、クライアントがエクスポートされた名前を見つけられない場合、実行時にフェイル クジラが発生します。これは、プログラマーがextern "C"エクスポートの名前を変更するために .def ファイルを使用しなかったか、使用しなかった場合に発生します。それ以外の場合は、Dumpbin.exe /exports で簡単に確認できます。これを修正するのは面倒です。DLL ヘッダーを変更して wchar_t を WORD に変更する必要があります。マクロでそれを行うことができ、wchar_t を受け取り、キャストによって WORD 関数を呼び出す小さなアダプター関数を記述します。

これらがエクスポートされた C++ クラスである場合、より大きな問題が発生します。これらの DLL 用に新しいインポート ライブラリを作成する必要があります。Dumpbin.exe /exports から取得した出力から始めて、元の名前を付けます。foo = bar オプションを使用してシンボルの名前を変更し、そこから .def ファイルを作成します。lib.exe /def オプションを使用してインポート ライブラリを作成します。小さなテスト DLL を作成して、マングルされた名前の名前を変更する方法を正確に把握します。

于 2013-04-01T12:12:03.253 に答える