2011-01-05 33 views
2

私の会社では、.defファイルを使用して、エクスポートする必要のあるシンボルを指定しています。 (私は、より現代的で自動化されたテクニックを使用することができればと願っています。残念ながら、80年代に生きることを決める人たち)。32ビットの.defファイルを64ビットに変換

.defファイルを手作業で書き込むと、手作業のコピー貼り付けを使用することは退屈でエラーを起こしやすいですが、これまでのところ私はそれを使用して暮らすことができます。

しかし、私はDLLの64ビット版にも同様の.defファイルを書く必要があります。いくつかの関数の名前の装飾が変更され、32ビットバージョンから64ビットバージョンのファイル.defを生成する方法があるのだろうかと思います。

私に役立つツールがありますか?これは現実的ですか?私はもう一度手でそれをやりたがっているような気がしません。私自身のツールのコーディングを含むあらゆるソリューションでも、大歓迎です。

ありがとうございます。

+0

こんにちは、私は80年代にも生きていました! –

答えて

2

おそらく__declspec(dllexport)したいシンボルをコンパイルしてから、結果のDLLにdumpbin/exportsを実行して名前を変更し、__declspecを削除して.defファイルを作成することができます。

+0

+1。アイデアをありがとう。効果的ですね。しかし、私はソースコードの変更を最小限に抑えたいと思っています。私は条件付きで '__declspec'ステートメントを置く/削除するマクロを使用して、ソースコードを変更せずに動作するはずだと思いますか? – ereOn

+0

マクロを追加するか__declspecを追加すると、コードが同じ量だけ変更されます。私はそこにどんなリスクも見ません。 本当にコードを変更したくないのであれば、デバッグとしてコンパイルして、DLLのloadlibraryをwindbgにロードし、 "x Mymodule!*"を実行してすべてのシンボルを表示してからあなたがそこから欲しいものを選ぶことができます。 – jcopenha

1

あなたの上司に80sに戻るように教えてください。真剣に言えば、これはシンボル名をエクスポートする移植可能な方法ではありません。 C++コンパイラが名前マングリングスキームを変更するとどうなりますか?それから、あなたはこれをやらなければならないでしょう(jcopenhaが言ったこと)。それが起こったときにそこで働かないとどうなりますか?もう一人の貧しい人々は、何をどのようにして行うかを見つけるために貴重な時間を費やさなければなりませんか?私は上司に__declspec(dllexport)を使うよう説得しようとします。今は時間を節約し、将来は時間を節約します。

私はあなたがクラスとオーバーロードされた関数をエクスポートしていると仮定しています。もしそうでなければ、代わりにCの名前で関数をエクスポートします。これらの名前は変更されず、変更されません。

+0

私は実際にクラスをエクスポートしています。彼らは '.def'ファイルを使って関数名を"隠し "、代わりに序数を使いたい(ユーザーがどの関数をエクスポートするかを推測できないようにする)。これはひどい理由だと思うし、才能のある "ハッカー"が関数の署名を見つける。 – ereOn

+0

さて、私はビルドプロセスでそれを自動化しようとします。 __declspec()を使用する別のビルドソリューションを作成します(通常のビルドでは何も展開しないマクロでは使用できません)。出力上でdumpbinを実行し、dumpbin結果に基づいて.defファイルを作成し、プロジェクトにマージします。そうすれば、それはかなり自動化されており、別のコンパイラに切り替えると爆発することはありません。あなたはマクロを使うことを覚えておいてください。 –

+0

DEFファイルの問題を引き起こすネーム・マングリング・スキームの変更に関するコメントの裏の理由を理解できません。私はDEFファイルはdllexportを使用するときに名前が変わるので、名前変更の問題を避ける方法になると思っていましたが、DEFファイルを使用するときは名前を指定して、私の経験。 – BlueMonkMN

関連する問題