dポイントプレゼントキャンペーン実施中!

VisualStudio2010C++で作ったDLLをdelphiで利用したいのですが、「エントリポイントが
見つかりません」といわれてしまいます。チュートリアルのサンプルそのままで試して見ましたが、VS2010 付属のdumpbin .exe でdllの中身を見るとエントリポイントが

@ILT+345?Add@MyMathFuncs@MathFuncs@@QAGNNN@Z)みたいな、元の関数名はどうした?
と思えるような名前です。

defファイルを使って見ましたが、今度は
1 0 0001115E Add = @ILT+345(?Add@MyMathFuncs@MathFuncs@@QAGNNN@Z)

みたいな表示でやはりdelphiから読めません。__stdcall にはしています。
VC++で読み込めばちゃんと読めるのである意味正しく作られているのだと思いますが、他のOpenNI , OpenGL などのdllをdumpbin /exports で覗くと、整然と関数名が並び、
これなら読めるだろうと思えますし、実際にdelphiでも使えます。

他の言語ですっきり関数名で呼び出せる(普通の)DLLを作るにはどうすれば良いのでしょうか。
VisualStudioで作ったDLLは呼ぶ側があの記号のような名前で呼べということなのでしょうか?

A 回答 (1件)

C++では、引数のデータ型の違いによるオーバーロードなどがあるため、


関数名に型情報を付けたものがオブジェクトに出力されるシンボル名となっているのです。
これをマングリングといいます。
http://www.kijineko.co.jp/tech/cppemb/mangling.h …

エクスポートする関数については、C++のクラスは使わないようにした上で、
Cの関数として宣言してみてください。
(extern "C" { … } の中に記述する。)
http://www.kishiro.com/programming/c/import_cpp. …

Cレベルのエクスポートにしておけば、シンボルが関数名そのものになりますので、
DLLをdelphiでも呼び出せるようになります。
    • good
    • 0
この回答へのお礼

PCの不具合で大変お礼が大変遅れてしまい
まして申し訳ありません。

非常に参考になりとても助かりました。
なるほどそういうことだったのですね、
オーバーロードの機能と関係のあることとは
知りませんでした。

Delphiとの連携はC++の機能を使わずに行えば
問題なくできることを確認して、とてもすっきり
しました。ただ、ストリームを使わないとなると
なかなか大変ですね。おかげさまで C の勉強にも
なっています。

本当にありがとうございました。

お礼日時:2012/09/18 10:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!