- ベストアンサー
C++/CLIで、アンマネージC++のDLLを使用する方法
- C++/CLIのプログラムで、アンマネージC++のDLLを使用したいと考えています。具体的な手段がわかりません。
- VC++6.0で作成したアンマネージC++のDLLを、Visual Studio 2008のC++/CLIプロジェクトで使用しようとしています。コンパイル時に複数のエラーが発生します。
- Func.h周りで構文エラーが出ており、Func.hをインポートしないとDllでエラーが発生します。参考になるサイトなどはありませんか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。御礼頂きました。 Func.hの中にインクルードし忘れがある様です。準備が出来たら、必ず「ソリューションのリビルド」をして下さい。 以下は DLL->VC6.0Pro CLR->VC2005Pro で確認しています。 /*-----Func.h-----*/ #ifndef __FUNC_H__ #define __FUNC_H__ #include"afxver_.h"//此れと #include"afxv_dll.h"//此れと #include<windows.h>//此れをインクルード AFX_EXT_CLASS void WINAPI ShowMessage(); #endif //__FUNC_H__ //以下はCLRアプリ側 /*-----stdafx.h-----*/ // stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または // 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル // を記述します。 // #pragma once // TODO: プログラムに必要な追加ヘッダーをここで参照してください。 #include"func.h" #pragma comment(lib, "libの名前.lib") /*-----clrconsole.cpp-----*/ // clrconsole.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" using namespace System; int main(array<System::String ^> ^args) { ::ShowMessage(); return 0; }
その他の回答 (1)
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 例えば、プロジェクト名がMyAppであった場合、 ソリューションエクスプローラーの ソリューション'MyApp'(1 プロジェクト)項目の下にある +MyApp項目を右クリック プロパティを選択 「共通言語ランタイム サポート」項目で「共通言語ランタイム サポート(/clr)」を選択 stdafx.hの中に #include"func.h" #pragma comment(lib, "libの名前.lib") を書いてから全体をリビルド で出来ませんか。
お礼
アドバイスありがとうございました。 プロジェクトのstdafx.hにご指摘のコードを追加しました。 (また、ソースコード上の#include "Func.h"を削除しました。) また、共通言語ランタイムの設定を確認しました。 しかし、やはり同様のエラーが起きてしまいました。 /*-----エラー全文-----*/ エラー 1 error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。 d:\myc++cliapplication\usedllconsole\usedllconsole\Func.h 4 UseDllConsole エラー 2 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\myc++cliapplication\usedllconsole\usedllconsole\Func.h 4 UseDllConsole エラー 3 error C2146: 構文エラー : ';' が、識別子 'ShowMessage' の前に必要です。 d:\myc++cliapplication\usedllconsole\usedllconsole\Func.h 4 UseDllConsole エラー 4 error C2182: 'WINAPI' : 'void' 型が不適切に使用されています。 d:\myc++cliapplication\usedllconsole\usedllconsole\Func.h 4 UseDllConsole エラー 5 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\myc++cliapplication\usedllconsole\usedllconsole\Func.h 4 UseDllConsole /*----------*/ 試しにFunc.hのAFX_EXT_CLASS、WINAPIを削除してみたところ、Func.h周りでのエラーは消えましたが、DLLのエラーが出てしまいます。 /*-----エラー全文-----*/ エラー 1 fatal error C1113: #using が 'd:\myc++cliapplication\usedllconsole\usedllconsole\manageddllapp.dll' で失敗しました。 d:\MyC++CLIApplication\UseDllConsole\UseDllConsole\UseDllConsole.cpp 7 UseDllConsole /*----------*/ 他にも、その状態で、Libをソリューションエクスプローラに追加したりしましたが、同じエラーになりました…。
お礼
どうもありがとうございました! 無事にビルドが通り、DLL関数が実行されました。 修正点は、以下でした。 1.ご指摘のFunc.hのincludeし忘れの追加 2.メインプロジェクトファイルの"#using XXX.dll"の削除 DLLの使用に関しては、基本的にアンマネージC++のDLL使用と同様と考えて良いようですね。 Func.hで、なぜ追加のincludeが必要になるのか、経験不足のためわからないのですが、勉強しようと思います。 参考文献が少ない中、丁寧に説明してもらって、大変ありがたかったです。