2011-08-02 9 views
2

C++ dllとDelphi dllの間には本当の違いがありますか? アプリケーションはC++ dllのみを読み込みます。 呼び出し規約をcdeclに変更することは役に立ちません dllがC++のDLLであるかどうかを調べる方法はありますか? そのDLLの利点は何ですか? 私は、Delphi dllがパラメータを持つことができ、Delphiのタイプを返すことができることを意味します。の、C++ dllとDelphi dllの相違点

http://dependencywalker.com/

+0

DLLを調べて呼び出し規約を判断する簡単な方法はないと思います。また、C++からC関数をエクスポートすることもできますが、クラスをエクスポートすることはできません(同じコンパイラの異なるビルドや異なるコンパイラ間でも互換性があります) –

+0

duplicate of [ C++ dll?](http://stackoverflow.com/questions/2277986/can-i-programatically-deduce-the-calling-convention-used-by-ac-dll) –

+0

何をしようとしていますか?リンクするDLLを実装するために使用された言語を気にする必要はありません。 –

答えて

2

ため

おかげで、いくつかの排他的なデータ型を有することができますC++固有のアイテム(C++クラス、テンプレート関数など)を使用または公開し、Delphi DLLがDelphi固有のアイテム(セット、文字列など)を公開する可能性があります。しかし、両方が適切に書かれていて、他の言語でも使えるものを使うだけであれば、違いはありません。

事実、すべてのC++ DLLまたはDelphi DLLが正しく書き込まれているわけではありません。また、Delphiのデフォルトの呼び出し規約はregister(C++ Builderでは__fastcall)ですが、CおよびC++ではデフォルトでcdeclが使用されています。しかし、一般的には両方の言語でstdcallを使用する必要があります。

DLLを使用する唯一の方法は、ヘッダーファイル(.h)またはDelphiインポートユニットを取得することです。 .hファイルはインポート単位に変換できます。 DLLのみを持っていてもこれらのDLLはない場合、関数のパラメータを推測しようとするのはあまり意味がありません。

TDUMP.exeまたはDependency Walkerを使用してDLLを見ると、別の答えで述べたようにヒントが得られる可能性があります。例えば依存性。 msvcrtXX.dllはC++ DLLのヒントかもしれません。

また、DLLから.tlbを取得することもできます。 IDEでこれを行うことができます(メモリから: "コンポーネントメニュー" - "コンポーネントのインポート"など)。

呼び出し規約を知りたい場合は、this、特に呼び出し規約を調べる部分を読んでください。

追加

いくつかのC++プログラマは、エクスポート機能がマングルされているので、extern "C"ブロックで自分の宣言をラップすることを忘れ。これにより、どのパラメータが必要かを知ることができますが、醜い名前が付けられます。これのために、Dependency Walkerは、(VC++で生成されたDLLまたは互換性のあるDLLのために)少なくとも翻訳することができるので、大きな助けとなります。しかし、それは別のC++コンパイラやCコンパイラの関数をかなりハードに使っています。

+0

しかし、IIRCはC++のDLLであるかどうかはわかりません。 OK、msvcrtの呼び出しはヒントかもしれませんが、必ずしもそうである必要はありません。私はそれを使用するDelphiコードも書いています。 –

+1

DLLは言語に依存しないはずです。あなたが知る必要があるのは、エクスポートされた関数の名前とパラメーター/戻り値の型だけです。 –

+0

DLLはそうでなければなりませんが、あまりにも頻繁ではありません。特に言語を知っている人がDLLを作っている場合はそうです。私はそうでなかったDLLのかなりの翻訳を手伝ってきました。 –

8

C++のDLLができます。そのC++のdllのよう は/あなたがたDLL内の関数を検討する依存関係ウォーカーを使用することができます任意のヒント

+0

?なぜdownvote? –

関連する問題