プロが教えるわが家の防犯対策術!

こんにちは。
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でエラーが出ます。

よろしくお願いいたします。

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

どうもありがとうございました!
無事にビルドが通り、DLL関数が実行されました。

修正点は、以下でした。
1.ご指摘のFunc.hのincludeし忘れの追加
2.メインプロジェクトファイルの"#using XXX.dll"の削除

DLLの使用に関しては、基本的にアンマネージC++のDLL使用と同様と考えて良いようですね。
Func.hで、なぜ追加のincludeが必要になるのか、経験不足のためわからないのですが、勉強しようと思います。

参考文献が少ない中、丁寧に説明してもらって、大変ありがたかったです。

お礼日時:2009/07/24 12:36

 こんにちは。



 例えば、プロジェクト名がMyAppであった場合、

 ソリューションエクスプローラーの
 ソリューション'MyApp'(1 プロジェクト)項目の下にある
 +MyApp項目を右クリック
 プロパティを選択
 「共通言語ランタイム サポート」項目で「共通言語ランタイム サポート(/clr)」を選択

 stdafx.hの中に

#include"func.h"
#pragma comment(lib, "libの名前.lib")

 を書いてから全体をリビルド

 で出来ませんか。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。

プロジェクトの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をソリューションエクスプローラに追加したりしましたが、同じエラーになりました…。

お礼日時:2009/07/23 18:36

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