こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

DLL作成時、defファイルを使いたくない

また質問させて下さい。

Visual Studio2005でDLLを使ったプログラムを作ろうとしています。

defファイルを利用すると、そのDLLファイルを作成できるのですが、
__declspec(dllexport)を利用すると、DLLファイルのその関数を読めなくなってしまいます。

なぜでしょうか?


下記は、MFCで、dll_test7というプロジェクトを作り、そのdll_test7.hのコードのすぐ下に
その関数を書きました。(これがダメだと思うのですが…)


//●Visual Studioのプロジェクト作成で、生成される部分

// dll_test7.h : dll_test7.DLL のメイン ヘッダー ファイル
//

#pragma once

__declspec(dllexport) void __cdecl test0(void);

#ifndef __AFXWIN_H__
#error "PCH に対してこのファイルをインクルードする前に 'stdafx.h' をインクルードしてください"
#endif

#include "resource.h"// メイン シンボル



// Cdll_test7App
// このクラスの実装に関しては dll_test7.cpp を参照してください。
//

class Cdll_test7App : public CWinApp
{
public:
Cdll_test7App();

// オーバーライド
public:
virtual BOOL InitInstance();

DECLARE_MESSAGE_MAP()


};

//■作成した関数

__declspec(dllexport) void __cdecl test0(void)
{
CString cs;
cs="aa";
::AfxMessageBox(cs);
}

上記は、defファイルを利用するとこの関数を呼び出せます。


以上、どうぞよろしくお願い致します。

投稿日時 - 2012-04-02 14:03:07

QNo.7397990

困ってます

質問者が選んだベストアンサー

ヘッダファイルの定義も変えました?
同じにししないと、矛盾を生じます。
>MFC
これだけだと何とも言えませんが、
DLLのバイナリダンプを見ると、修飾
なしの名前なので、呼び出す方も
extern "C" 修飾する必要があると
思います。

投稿日時 - 2012-04-02 21:28:36

お礼

出来ました! ヘッダーファイルの存在を忘れていました。 的確なアドバイス
ありがとうございます。


あと、アドバイス頂いたextern "C"でよく調べてみました。

http://www.geocities.jp/ky_webid/cpp/language/038.htm

この修飾により、この関数はC言語しか使えないのかと勘違いしていました。
上記のHPと下記アドバイスにより

>「余計な付加文字を付けるな!」という
>指示語を付けてあげればよいでしょう。

C++では、コンパイル後、関数の名前が変わるということを理解しました。


2,3日後くらいに、この質問をベストアンサーで閉じさせて頂きます。

先週末から本当困っていました。 ありがとうございました。 

投稿日時 - 2012-04-02 22:49:51

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

関数名は戻り値やパラメータの型により
コアの名前に色々な付加文字が付きます。
つまり、元の名前ではない名前で登録
されているということです。
「余計な付加文字を付けるな!」という
指示語を付けてあげればよいでしょう。

__declspec(dllexport) void __cdecl test0(void)
             ↓
extern "C" __declspec(dllexport) void __cdecl test0(void)

投稿日時 - 2012-04-02 14:48:08

補足

ご返信ありがとうございます。

上記にすると

エラー1error C2732: リンケージ指定は、別の 'test0' に対する指定と矛盾しています。
のエラーが出てしまいました。


なぜでしょうか?



.あと、関数内も、MFCを使っています。 extern "C"でも大丈夫でしょうか?


どうぞよろしくお願い致します。

投稿日時 - 2012-04-02 18:19:16

あなたにオススメの質問