DLLのエキスポートができない – プログラミング – Home

DLLのエキスポートができない
 
通知
すべてクリア

DLLのエキスポートができない


朱南
 朱南
(@朱南)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

DLLのデバッグをしたいので、EXEを作成し、そのEXEからDLLの関数を呼ぼうとして
います。
DLL側では、このようにしています。
[CLS_A.h]
#include <XXX.h>

class CLS_A : public CLS_B
{
public:
__declspec(dllexport) void __cdecl TEST( int a, int b );
};

[CLS_A.cpp]
#include CLS_A.h

//呼びたい関数↓
__declspec(dllexport) void __cdecl CLS_A::TEST( int a, int b)
{
//中身省略
}

EXE側です
[testDlg.cpp]
#include <xxx.h>

__declspec(dllexport) void TEST __cdecl( int key, int keyMode );

void CTestDlg::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
int a, b;

a = 1;
b = 0;

TEST( a, b );
}

と、しました。DLL側のビルドは通ります。ビルドして作られた xx.lib と xx.dll を
EXE側の Debug ファイルにコピーしました。
EXE側のプロジェクト>設定>リンク>オブジェクト/ライブラリモジュールで xx.lib を
指定しました。
そしてEXEのビルドを行うと下記のエラーが発生します。
[ERROR]
testDlg.obj : error LNK2001: 外部シンボル "void __cdecl TEST(int,int) (?
TEST@@YAXHH@Z) は未解決です
Debug/test.exe : fatal error LNK1120: 外部参照 1 が未解決です。

みようみまねで作成しましたので、プログラムが合っているのかさえわかりません。
ご指摘よろしくお願いします。


引用解決済
トピックタグ
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

CLS_A::TESTとTESTは全く別の関数なので、対応付けられていません。

そもそもDLLじゃなくても、クラスインスタンスがない状態で、
非staticのメンバ関数を、外から呼ぶことは出来ません。


返信引用
朱南
 朱南
(@朱南)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

REEさんレスありがとうございます。

>CLS_A::TESTとTESTは全く別の関数なので、対応付けられていません。
今のプログラムだと CLS_A の TEST() を呼ぶつくりではないということですね。
このつなぎ方がよくわからないのですが、参考になりそうなHPがあったら教えて
いただけませんか?自分なりにも調べた結果、__declspec(dllexport) を使用して
います。

>そもそもDLLじゃなくても、クラスインスタンスがない状態で、
確かに・・・。
CLS_A a;
a.TEST(x, y);
っていうのが必要という意味でしょうか。

ご教授よろしくお願いいたします。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

DLL以前に、普通にクラスを作ったり使ったりはできますか?

DLLであることを気にしなければ、普通、

#include CLS_A.h

void CTestDlg::OnButton1()
{
CLS_A a;
// a を使う
}

と、しませんか?

また、TEST()関数は、クラスメンバ関数である必要はありますか?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

書かれている内容を見るとC++言語に関する知識がほとんどないのでは?
もし、C++言語の知識がないのであれば、C++言語の入門書を最初から読まれた方が
良いと思います。どうもC言語の知識か何かでプログラミングしようとしているように
みえます。
クラスの概念が良く分かっていないのであれば、入門書でじっくり勉強される事をお勧め
します。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ちなみに入門書等で基礎知識をある程度は勉強しないと
いきなりC++言語でプログラミングするのは無理だと思います。
確かに「プログラミングは習うより慣れろ」という場合もありますが、
これは基礎知識があってプログラミング経験がない人に対しての言葉であって
基礎知識がない人の場合は、やっぱり書籍等で勉強しないと無理です。
きちんとした内容であれば、ホームページでも構わないとは思いますが、
じっくり勉強するなら書籍の方がやりやすいような気もします。(私見ですが)


返信引用
朱南
 朱南
(@朱南)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

みなさまレスありがとうございます。
お返事が遅くなり申し訳ありません。
PATIOさんのご指摘の通り、C++言語に関する知識が全くありません。
近くに教えてくれる先輩もおらず、質問をさせていただいた次第です。
C++もわかってない、DLLのこともよくわかってない、で仕事を渡されたので
にっちもさっちもいきません。
まずは、あせらずに基礎知識を身につけていきたいと思います。

dairygoodsさん
>また、TEST()関数は、クラスメンバ関数である必要はありますか?
TEST()関数はクラスメンバ関数である必要はありません。
本当はある関数(A)にEXEからアクセスしたかったのですが、引数があったため、
困ってTEST関数(引数なし)を関数Aと同じクラスに作成し、TESTからAへアクセス
しようとした結果、あのようなプログラムになりました。

低レベルな質問で申し訳ありませんでした。
またのご教授をよろしくお願いいたします。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> void CTestDlg::OnButton1()
MFCならば、MFCのDLLの作成をしてみればどうでしょうか?

DLLを作ろう!(関数編)
http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/03.html
次へを選んで 3(関数編) ~ 5(クラス編) までを参考にしてみてください。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました