通話機能にはc++のdllなヘッダ
-
23-08-2019 - |
質問
いのメソッドの呼び出しからdllがないからソースは、ヘッダファイルです。私は利用しようとしたのdumpbin/輸出の名の方法を出すことはできなかったが見つかりに署名?
がこのメソッドを呼び出?
おかげさ
解決
その分解のbeginnigを分析することによってCの関数シグネチャを把握することが可能です。関数の引数はスタックになり、機能が逆の順序でそれらを読むためにいくつかの「ポップ」を行います。あなたは、引数名を見つけることができませんが、あなたはその数と種類を見つけることができるはずです。物事は、戻り値をより困難得ることができます - それはレジスタ「EAX」を介して、または(スタックの一番上の)最後の疑似引数として関数に渡される特別なポインタを介してもよい。
。他のヒント
場合は、マングルされた名前から関数のシグネチャを導出することができるかもしれません。 Dependency Walkerのにはあなたのためにこれを行います1つのツールです。 DLLは、Cリンケージを使用して作成された場合は、(依存関係ウォーカーはあなたにこのことを教えてくれます)、あなたは運が悪いです。
のjava-C#-C++のコード生成しないことは何も知らなかっdll.
このWindows?片とする。
- のdllに
depends.exe
出荷(Visual Studio) - の署名を検証するのに機能したい電話
- 使用
LoadLibrary()
を負荷すdll(いパス) - 使用
GetProcAddress()
取得ポインタの機能をしたい電話 - このポインタを機能話をかけ有効な引数
- 使用
FreeLibrary()
リリースの取扱い
ちなみ:この方法にもなっていて、一般的に実行時の動的リンクに対してコンパイル時の動的リンクがコンパイルお源との関連
lib
ファイルです。
が存在する類似の機構*nixesと dlopen
, が私の記憶が失敗することである。というおもしろい objdump
または nm
るべきだ始まったの検査に機能します。
、DLLでエクスポートリストには名前だけではなく、署名を格納します。あなたのDLLエクスポートC関数ならば、あなたはおそらく分解し、メソッドのシグネチャを決定するための機能をリバースエンジニアリングする必要があります。しかし、C ++は、エクスポート名にメソッドシグネチャを符号化します。メソッド名と署名を組み合わせるこのプロセスはの「マングル名」と呼ばれます。 のが持っているこのStackOverflowの質問をhref="https://stackoverflow.com/questions/491115/where-is-documentation-on-the-microsoft-visual-studio-c-name-mangling-scheme">マングルエクスポート名からメソッドのシグネチャを決定するための参照
のユーティリティ(別称、 "依存")自由 "依存関係ウォーカー" を試してみてください。 「Undecorate C ++関数」オプションは、C ++メソッドのシグネチャを決定する必要があります。
あなたは本当に知っているか、強く機能があると思われる場合があり、あなたは動的にLoadLibrary関数でDLLをロードしてGetProcAddressが持つ関数へのポインタを取得することができます。 MSDN の
を参照してください。これは、ライブラリをロードするための説明書、動的な方法であることに注意してください。あなたはまだそれを使用するために、関数ポインタにマップするために正しい関数シグネチャを知る必要があります。私の知る限り負荷時能力のDLLを使用してヘッダーファイルなしで機能を使用する方法はありません。
非外部関数を呼び出すと、サードパーティのDLLが更新されるたびに、あなたのプログラムブレークを持っている素晴らしい方法です。
とはいえ、 undname のユーティリティまた、役に立つかもしれません。