• 締切済み

C# DLL(C++)の呼び出し

自前のDLL(C++,DynamicLinkLibrary)を使っており 今回環境を変えようと試しているのですが、どうもエラーが発生し悩んでます。 (1)元々の環境 VS2008 MFCでLoasLibraryの呼び出し後、各関数も問題なく動作 (2)新しい環境 VS2013 C# DLLImport関数を使ったところ、エラー発生 改修内容 http://qiita.com/ask/items/ee2ff5b8706effc0c3d8 エラー内容 追加情報:hoge.DLL を読み込めません:指定されたモジュールが見つかりません。 (HRESULT からの例外:0x8007007E) お願いです。どなたか、ご教授頂けませんか? DLL側プロジェクト構成の設定変更が必要? DLL側ソースコードがおかしい? DLL側のVSバージョンが低い? 何が悪いか分かりません。

みんなの回答

回答No.1

DLLが内部で別のDLLを使用している場合、そのDLLがないとそのようなエラー表示になります。 DependencyWalkerなどでHoge.dllが内部で使用しているDLLがちゃんと存在しているか確認してみてはどうでしょうか。

関連するQ&A

  • C#からVC++DLLの呼び出しに失敗する

    VS.NET2005のC#からVC++6.0で作成したDLLを呼び出しています。 VCのデバッガでデバッグしてみると呼び出した関数は正常に動作しているようなのですが、最後のreturnを実行しC#に戻るところでエラーが出てしまいます。 C#側では「'System.ExecutionEngineException' のハンドルされていない例外が ConsoleApplication1.exe で発生しました。」となります。 C#での宣言は、 [DllImport("test.dll")] public static extern uint TestFunc(ref byte[] moji, ref uint nagasa); です。 VC++の宣言は、 __declspec(dllexport) unsigned long __stdcall TestFunc(unsigned char* moji, unsigned long* nagasa) です。 C#へ値を返さない関数は問題ないのですが、値を返そうとすると起きるようです。不備などあればご指摘いただけないでしょうか。 ちなみにVB6からは問題なく動作できました。

  • C#からC++のDLLを使いたい時

    C#からC++(unmanaged)のDLLを使いたい時、 DLLをどのように参照すればよいのでしょうか。 [DllImport("名前.dll")] extern static double 関数名(); という指定は分かるのですが、 それだけじゃもちろん、 「DLL (名前.dll) を読み込めません。」 ってなりますよね・・・。

  • C#からDLLを呼びたいのですが・・・

    C#のASP.NET WebアプリケーションのDLLをC#のWindowsFormのexeで呼び出そうとしています。 すると 'System.EntryPointNotFoundException' のハンドルされていない例外が FTPApi.exe で発生しました。 追加情報 : DLL SampleApi.dll の GetURL というエントリ ポイントが見つかりません。 というエラーメッセージが表示されてしまいます。 クラス上部で [System.Runtime.InteropServices.DllImport("SampleApi.dll", EntryPoint="GetURL")] public static extern string GetURL(); と宣言した後、呼び出したい場所で、 strUrlPath = GetURL(); と呼んでいます。 よろしくお願いします。

  • C#でWin32 MFC DLLが呼び出せない

    C#で以下のエラーが発生し、非常に困ってます。 色々とサイトを見たのですが、DLLが本当にないのでは?という意見が多かったです。 しかし、私の方はDLLファイルはbin->debugフォルダ , obj->debugフォルダ、System32に置いてます。 問題が分かる方、是非教えてください! using System.Runtime.InteropServices; namespace WindowsFormsApplication { public partial class Form1 : Form { [DllImport("Win32DLL_TEST.dll")] private extern static int func(int x, int y); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int n = func3(5, 7);//ここでエラー! } } } エラー内容 'System.DllNotFoundException' のハンドルされていない例外が WindowsFormsApplication.exe で発生しました。 追加情報: DLL 'Win32DLL_TEST.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E) 備考 DLLは自作のWin32 DLL です。 extern "C"{ __declspec(dllexport) int __cdecl func(int x, int y) } と宣言し、VC++のMFC dialog上では呼び出しを成功しています。

  • API関数(DLL)の呼び出しにおいて、DLLの格納場所は?

    お世話になります。 VB.NETでAPI関数を呼び出す場合にまず、API関数を格納しているDLLを宣言しなけれならないと下記URLにあります。 (http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html) (a)DllImport属性を利用する方法 <System.Runtime.InteropServices.DllImport("DLL名")> _ Function API関数名(仮引数) End Function (b)Declareステートメントを利用する方法 Declare Function API関数名 Lib "DLL名" (仮引数) そこで、質問なのですが、(a)、(b)どちらの方法で実現する場合においても、DLLの格納場所はC:\Windows\System32でないといけないのでしょうか?(実際にコーディングしてもSystem32フォルダにないとエラーになってしまいます。) 任意のフォルダにDLLを格納し、そこを参照できるようにできるのでしょうか? また、一般常識としてDLLはSystem32フォルダに格納しておかないといけないものなのでしょうか? 以上、よろしくお願いいたします。

  • C#、C++間のDLLの呼び出しについて

    いつも拝見させていただいております。 さっそくですが、質問致します。 現在、ネイティブなC++ DLLを作成しています。 これを今回、C#のアプリケーションから呼び出すことになりました。 DLL内にはクラスを作成しており、内部にXMLのデータを保持するような クラスを作成しております。(XML操作にはMSXMLを使用しております。) 問題なのはC++アプリケーションから呼び出した時は正常に動作するのですが、C#からの呼び出しの時はC++アプリケーションから呼び出した時には発生していないエラーが検出されます。 エラー内容は System.AccessViolationException 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。 になります。 エラー内容からしてC++内でのメモリ操作に問題があると 思われるのですが、C++からの実行時には検出されていないので理由がわからずに困っております。 ネイティブなDLLに対してはデバッグも行えないため、手に負えません。 (現在、1行ごとにログを埋め込み、TCHAR型のnewを4byte行っている箇所で処理がストップしてしまっているようです。C++からの呼び出し時には正常に処理される箇所です。) ネイティブなDLLに対してのデバッグ方法や似たような現象にあわれた方がいらっしゃいましたらご助力お願い致します。 ・対象のDLLのクラスは_declspec(dllexport)にてエクスポートを行っています。 ・C#からの呼び出し時にはネイティブなDLLのためC++/CLIで作成したプロジェクトでラッパークラスを作成してアクセスを行っています。 ・C++アプリケーションからの呼び出し時はプロパティの設定でインクルードディレクトリ、LIBファイルの設定等を行って直接DLLを参照して 実行(呼び出し)しています。

  • C++でdllの呼び出しについて

    使用環境はVisualStudio2008、WindowsXPです。 http://www.voidtools.com/Everything-SDK.zip こちらのSDKに添付されているdllを呼び出したいと思います。 dll、lib、ヘッダーファイルをプロジェクトと同じフォルダに入れて以下のようなコードを書いてみたのですが、リンカエラーになりました。 #pragma comment(lib, "everything.lib") void __stdcall Everything_SetSearch(LPCTSTR lpString); void main(void){ Everything_SetSearch(L"ああ"); } ビルドエラーの内容 error LNK2019: 未解決の外部シンボル "void __stdcall Everything_SetSearch(wchar_t const *)" (?Everything_SetSearch@@YGXPB_W@Z) が関数 _main で参照されました。 fatal error LNK1120: 外部参照 1 が未解決です。 何か初歩的なミスをしている気もしますが、突っ込みなどなど回答の方よろしくお願いします。

  • DLLの呼び出しについて

    C++BuilderXで開発したアプリで、CreateProcess()で子プロセスを呼び出すときに 時々、DLLの初期化エラー(0xc0000142)が発生するので、DependencyWalkerを使って 呼び出されているDLLを調べたところ、124個ものDLLが呼び出されていました。 中には"googledesktopcommon.dll"などまったく関係の無さそうなものまで呼び出されていました。 本来、呼び出されるDLLはプログラム内で使用されるものに限定されるものだと 思うのですが、アプリケーション実行時に呼び出されるDLLというのは どこで決まっているのでしょうか。 また、余計なDLLが呼び出されないように改善することはできますでしょうか。 宜しくお願いします。

  • DLLとインポート、エクスポート

    環境 Microsoft Visual C++ DLLはWin32 Dynamic-Link Library ExeはWin32 Application で作成しています。 DLLにメッセージボックスを表示するのみの処理の関数があり。 Exe側でその関数を使用したいだけです。 DLLのヘッダファイルにエクスポートしたい関数を _declspec(dllexport) void exportmain(); としています。 Exeではインポートを __declspec(dllimport) void exportmain(); としています。 プロジェクト⇒設定⇒リンクにlibファイルの設定もしています。 dll、libファイルの場所も問題ないと思います。 しかし、ビルドすると「外部シンボル~~未解決です」とエラーがでてしまいます。なにか原因がわかるかたおりましたら、ご教授お願い致します。

  • CのEXEからC#のDLLを呼び出す

    C及びC#のPGは初心者ですが、宜しくお願いします。 現在、Cで作成したEXEからC#で作成したDLLを参照するとエラーが発生します。ただ、EXEとDLLを同じフォルダ内に配置すると正常に動作します。DLLを別のフォルダに配置するとエラーが発生します。 CがC#のDLLのPathが分からないからエラーが発生していると思っているのですが、Cのプロジェクトで何を設定したらいいのか、全然分かりません。 宜しくお願いします。

専門家に質問してみよう