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 が未解決です。
みようみまねで作成しましたので、プログラムが合っているのかさえわかりません。
ご指摘よろしくお願いします。
CLS_A::TESTとTESTは全く別の関数なので、対応付けられていません。
そもそもDLLじゃなくても、クラスインスタンスがない状態で、
非staticのメンバ関数を、外から呼ぶことは出来ません。
REEさんレスありがとうございます。
>CLS_A::TESTとTESTは全く別の関数なので、対応付けられていません。
今のプログラムだと CLS_A の TEST() を呼ぶつくりではないということですね。
このつなぎ方がよくわからないのですが、参考になりそうなHPがあったら教えて
いただけませんか?自分なりにも調べた結果、__declspec(dllexport) を使用して
います。
>そもそもDLLじゃなくても、クラスインスタンスがない状態で、
確かに・・・。
CLS_A a;
a.TEST(x, y);
っていうのが必要という意味でしょうか。
ご教授よろしくお願いいたします。
DLL以前に、普通にクラスを作ったり使ったりはできますか?
DLLであることを気にしなければ、普通、
#include CLS_A.h
void CTestDlg::OnButton1()
{
CLS_A a;
// a を使う
}
と、しませんか?
また、TEST()関数は、クラスメンバ関数である必要はありますか?
書かれている内容を見るとC++言語に関する知識がほとんどないのでは?
もし、C++言語の知識がないのであれば、C++言語の入門書を最初から読まれた方が
良いと思います。どうもC言語の知識か何かでプログラミングしようとしているように
みえます。
クラスの概念が良く分かっていないのであれば、入門書でじっくり勉強される事をお勧め
します。
ちなみに入門書等で基礎知識をある程度は勉強しないと
いきなりC++言語でプログラミングするのは無理だと思います。
確かに「プログラミングは習うより慣れろ」という場合もありますが、
これは基礎知識があってプログラミング経験がない人に対しての言葉であって
基礎知識がない人の場合は、やっぱり書籍等で勉強しないと無理です。
きちんとした内容であれば、ホームページでも構わないとは思いますが、
じっくり勉強するなら書籍の方がやりやすいような気もします。(私見ですが)
みなさまレスありがとうございます。
お返事が遅くなり申し訳ありません。
PATIOさんのご指摘の通り、C++言語に関する知識が全くありません。
近くに教えてくれる先輩もおらず、質問をさせていただいた次第です。
C++もわかってない、DLLのこともよくわかってない、で仕事を渡されたので
にっちもさっちもいきません。
まずは、あせらずに基礎知識を身につけていきたいと思います。
dairygoodsさん
>また、TEST()関数は、クラスメンバ関数である必要はありますか?
TEST()関数はクラスメンバ関数である必要はありません。
本当はある関数(A)にEXEからアクセスしたかったのですが、引数があったため、
困ってTEST関数(引数なし)を関数Aと同じクラスに作成し、TESTからAへアクセス
しようとした結果、あのようなプログラムになりました。
低レベルな質問で申し訳ありませんでした。
またのご教授をよろしくお願いいたします。
> void CTestDlg::OnButton1()
MFCならば、MFCのDLLの作成をしてみればどうでしょうか?
DLLを作ろう!(関数編)
http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/03.html
次へを選んで 3(関数編) ~ 5(クラス編) までを参考にしてみてください。