こんにちは。
C++/CLIのプログラムで、アンマネージC++のDLLを使用したいと考えています。
ネット上をいろいろ調べたのですが、具体的な手段がわかりません。
見よう見まねで以下のようにサンプルを作成したのですが、コンパイルすら通る状況になりません。
かなり基本的な問題がありそうで申し訳ないのですが、下記の問題点を教えていただけないでしょうか。
また、参考になりそうなサイトなどありましたら教えていただけると大変助かります。
■アンマネージC++のDLL
VC++6.0で、以下のように、単にデバッグ文字列を書き出すだけのDLL関数を作成しました。
(このDLLが使用できることは他のVC++6.0プロジェクトで確認済みです)
/*-----Func.h-----*/
#ifndef __FUNC_H__
#define __FUNC_H__
AFX_EXT_CLASS void WINAPI ShowMessage();
#endif//__FUNC_H__
/*-----Func.cpp-----*/
#include "StdAfx.h"
#include "Func.h"
#include <stdio.h>
void WINAPI ShowMessage()
{
CString str = "This is The Message from DLL Func!\n";
OutputDebugString(str);
}
■C++/CLI でのDLL使用
Visual Studio2008にて、C++のCLRプロジェクトを作成して、以下のようにDLLを使用する準備を行いました。
1.ソリューションエクスプローラのヘッダフォルダに、Func.hを追加
2.プロジェクトのフォルダに、上記で作成したFuncのDLLとLIBファイルを置く。
3.プロジェクトの「プロパティ > C/C++ > プリプロセッサ > プリプロセッサの定義」に、"_AFXDLL"を追加
4.mainクラスのソースに以下を記述
/*----------*/
using namespace System;
#include "Func.h"
#using "ManagedDllApp.dll"
int main()
{
ShowMessage();
return 0;
}
/*----------*/
この状態でコンパイルすると、
「エラー3error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。d:\xxx\Func.h4Console
」等、Func.h周りで複数のエラーが出ます。
また、Func.hをインポートしないでコンパイルすると、
「エラー3fatal error C1113: #using が 'd:\xxx\manageddllapp.dll' で失敗しました。」と、Dllでエラーが出ます。
よろしくお願いいたします。
No.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;
}
どうもありがとうございました!
無事にビルドが通り、DLL関数が実行されました。
修正点は、以下でした。
1.ご指摘のFunc.hのincludeし忘れの追加
2.メインプロジェクトファイルの"#using XXX.dll"の削除
DLLの使用に関しては、基本的にアンマネージC++のDLL使用と同様と考えて良いようですね。
Func.hで、なぜ追加のincludeが必要になるのか、経験不足のためわからないのですが、勉強しようと思います。
参考文献が少ない中、丁寧に説明してもらって、大変ありがたかったです。
No.1
- 回答日時:
こんにちは。
例えば、プロジェクト名がMyAppであった場合、
ソリューションエクスプローラーの
ソリューション'MyApp'(1 プロジェクト)項目の下にある
+MyApp項目を右クリック
プロパティを選択
「共通言語ランタイム サポート」項目で「共通言語ランタイム サポート(/clr)」を選択
stdafx.hの中に
#include"func.h"
#pragma comment(lib, "libの名前.lib")
を書いてから全体をリビルド
で出来ませんか。
アドバイスありがとうございました。
プロジェクトのstdafx.hにご指摘のコードを追加しました。
(また、ソースコード上の#include "Func.h"を削除しました。)
また、共通言語ランタイムの設定を確認しました。
しかし、やはり同様のエラーが起きてしまいました。
/*-----エラー全文-----*/
エラー1error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。d:\myc++cliapplication\usedllconsole\usedllconsole\Func.h4UseDllConsole
エラー2error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていませんd:\myc++cliapplication\usedllconsole\usedllconsole\Func.h4UseDllConsole
エラー3error C2146: 構文エラー : ';' が、識別子 'ShowMessage' の前に必要です。d:\myc++cliapplication\usedllconsole\usedllconsole\Func.h4UseDllConsole
エラー4error C2182: 'WINAPI' : 'void' 型が不適切に使用されています。d:\myc++cliapplication\usedllconsole\usedllconsole\Func.h4UseDllConsole
エラー5error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていませんd:\myc++cliapplication\usedllconsole\usedllconsole\Func.h4UseDllConsole
/*----------*/
試しにFunc.hのAFX_EXT_CLASS、WINAPIを削除してみたところ、Func.h周りでのエラーは消えましたが、DLLのエラーが出てしまいます。
/*-----エラー全文-----*/
エラー1fatal error C1113: #using が 'd:\myc++cliapplication\usedllconsole\usedllconsole\manageddllapp.dll' で失敗しました。d:\MyC++CLIApplication\UseDllConsole\UseDllConsole\UseDllConsole.cpp7UseDllConsole
/*----------*/
他にも、その状態で、Libをソリューションエクスプローラに追加したりしましたが、同じエラーになりました…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
デコンパイル?について
-
VBAを何回も作り直して、容量が...
-
1 つ以上の複数回定義されてい...
-
コンパイルエラー:ユーザ定義...
-
Makefile作成時の拡張子.oとは?
-
右クリックメニューについて
-
セミコロンについて
-
エクセルVBAではRound...
-
” OS ビルド ” の意味が分か...
-
クリティカルエラー Expressio...
-
[c++] <pthread.h>がinclude で...
-
VMwareのLinuxでコンパイルでき...
-
「fatal error C1189」を回避す...
-
C++コンパイル時に『 C1083: in...
-
C++のhppファイルをCでinclude
-
プログラミング
-
C/C++の文法チェックツール
-
CImageクラスの使用について
-
不要な #include
-
Visual C++のこのエラーはどう...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
エクセルVBAではRound...
-
「fatal error C1189」を回避す...
-
Makefile作成時の拡張子.oとは?
-
ILSpyで、デコンパイルできない。
-
1 つ以上の複数回定義されてい...
-
外部シンボル "_main"は未解決です
-
セミコロンについて
-
C言語でヘッダファイルにグロー...
-
” OS ビルド ” の意味が分か...
-
マクロ コンパイルがグレーバック
-
【VC++6.0(MFC)】警告「LINK : ...
-
クリティカルエラー Expressio...
-
PRO*C コンパイルエラー
-
[c++] <pthread.h>がinclude で...
-
<math.h>があるのにsqrtが・...
-
ビルドとリビルドの違いを教え...
-
CImageクラスの使用について
-
戻り値について
-
コンパイルエラー:ユーザ定義...
おすすめ情報