C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 自作DLLを呼ぶとエラー


(過去ログ 87 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■52162 / inTopicNo.1)  自作DLLを呼ぶとエラー
  
□投稿者/ ゆび牛乳 (10回)-(2010/08/02(Mon) 15:27:31)

分類:[C#] 

C++で作ったDLLをC#から呼び出そうとしていますが
「DLL'mydll.dll'の'fnmydll'というエントリポイントが見つかりません」
というエラーが出てしまいます。
ご指導お願いします。

---- mydll.dll(C++) ----

「ファイル」-「新規作成」-「プロジェクト」-「Visual C++」-「Win32」-「Win32プロジェクト」
アプリケーションの種類「DLL」
追加のオプション「シンボルのエクスポート」
コードは何もいじらずビルド

---- 呼び出し側(C#) ----

using System.Runtime.InteropServices;

namespace test
{
    public partial class Form1 : Form
    {
        [DllImport("mydll.dll")]
        private extern static int fnmydll();

        private void button1_Click(object sender, EventArgs e)
        {
            int n = fnmydll();  // ## ここでエラー ##
        }
    }
}

環境:VS2008(C++、C#ともに)

引用返信 編集キー/
■52163 / inTopicNo.2)  Re[1]: 自作DLLを呼ぶとエラー
□投稿者/ ごう (141回)-(2010/08/02(Mon) 15:39:52)
No52162 (ゆび牛乳 さん) に返信
> C++で作ったDLLをC#から呼び出そうとしていますが
> 「DLL'mydll.dll'の'fnmydll'というエントリポイントが見つかりません」
> というエラーが出てしまいます。
> ご指導お願いします。

まず、そもそもmydll.dllの中にfnmydllという関数が本当に存在するかどうかが気になります。
次に、fnmydllの引数や戻り値の型があっているかどうか、
fnmydllがprivate関数ではないかどうかを確かめてみてください。

Dependency Walkerを使えばDLLの中に存在する関数を調べることが出来ますので
DLLしか手元にない場合はツールの使用を検討してみてください。

Dependency Walkerでアプリケーションの使用DLLを調査
http://www.cycleof5th.com/tips/index.php?date=2007-10-18

ご参考までに・・・
http://oshiete.goo.ne.jp/qa/658181.html
引用返信 編集キー/
■52164 / inTopicNo.3)  Re[2]: 自作DLLを呼ぶとエラー
□投稿者/ Hongliang (680回)-(2010/08/02(Mon) 16:00:22)
C++ は関数のオーバーロード(引数が異なる同名の関数)をサポートしているので、それらを識別するために、エクスポートする際に修飾名を付けるようになっています(Dependency Walker や dumpbin /exports で確認できます)。fnmydll は多分 ?fnmydll@@YAHXZ みたいな名前でエクスポートされています。
DllImport の EntryPoint でこの名前を指定しても構いませんが、普通は C++ 側で extern "C" を使うかあるいは def ファイルをプロジェクトに含めることで、修飾しない名前をエクスポートさせるようにします。
引用返信 編集キー/
■52167 / inTopicNo.4)  Re[3]: 自作DLLを呼ぶとエラー
□投稿者/ ゆび牛乳 (11回)-(2010/08/02(Mon) 17:07:09)
ごうさん、Hongliangさん

Dependency Walker で確認したところ
たしかに「?fnmydll@@YAHXZ」の名前がありましたので
C++ 側で extern "C" を指定したところ、解決しました。

お世話になりました。
感謝します。

---- mydll.h ----

extern "C" {	// ## 追加 ##

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

MYDLL_API int fnmydll(void);

}	// ## 追加 ##

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -