【C++】DLL明示的動的読み込み【ちょっとだけ簡単にしてみた】
【C++】DLL明示的動的読み込み【ちょっとだけ簡単にしてみた】
#include <windows.h>
#include <tchar.h>class dllload {
private:
HMODULE hDll;
bool failed;
public:
dllload() {
hDll = NULL;
failed = false;
}
dllload(const TCHAR *dllname) {
hDll = NULL;
failed = false;
uselib(dllname);
}
~dllload() {
if(hDll != NULL) freelib();
}
bool uselib(const TCHAR *dllname) {
failed = true;
if(hDll == NULL) {
if((hDll = LoadLibrary(dllname)) != NULL) failed = false;
}
return failed;
}
bool getfunc(const char *funcname, void *func) {
failed = true;
if(hDll != NULL) {
if((*((FARPROC*)func) = GetProcAddress(hDll, funcname)) != NULL) failed = false;
}
return failed;
}
bool freelib() {
failed = true;
if(hDll != NULL) {
if(FreeLibrary(hDll)) {
failed = false;
hDll = NULL;
}
}
return failed;
}
bool fail() {
return failed;
}
};
■DLLの読み込み (1)
dllload hoge;
hoge.uselib(const TCHAR *dllname)
■DLLの読み込み (2)
dllload hoge(const TCHAR *dllname);
■関数の読み込み
hoge.getfunc(const char *funcname, void *func)
■DLLの解放 (省略可。省略時はオブジェクト消滅時に自動で呼ばれる)
hoge.freelib()
■エラーチェック (上らの処理でエラーが発生しているときはtrue、そうでないときにはfalseを返す)
hoge.fail()
#include <iostream>
using namespace std;int (*FuncMessageBoxA)(int hWnd, char* lpText, char* lpCaption, unsigned int uType);
int main() {
// DLLロード
dllload dll; /* 本来はnew演算子でオブジェクトを作成するべき */
dll.uselib(_T("USER32.DLL")); /* 別の場所からもDLL読み込める */
if(dll.fail()) return -1; /* 返り値調べなくてもエラーわかる */
cout << "DLL読み込み完了" << endl;
dll.getfunc("MessageBoxA", &FuncMessageBoxA);
if(dll.fail()) return -1;
cout << "関数読み込み完了" << endl;
cout << "----------------" << endl;
// 関数の使用
FuncMessageBoxA(0, "ログアウトひゅんひゅん!!", ">∀<┘", 0);
return 0;
}
uselibを複数回呼び出した時のことを考えていない。
fDllの必要性がない。
c++ならエラー発生時には例外飛ばせばしたほうが。。。
ライブラリの読み込み(uselib)はコンストラクタで呼び出して、freelibを呼び出したときは処理をしたあとにhDll=NULL。
エラーが発生したら、適当なエラーを飛ばす。
getfuncとコンストラクタ、デストラクタのみをpublicに置くべきかと思います
>uselibを複数回呼び出した時のことを考えていない。
そうですね。すいません。
>fDllの必要性がない。
ああ、なるほど。hDLLがNULLかどうかで判断すればよいんですね。
それなら明示的にfreelibした時でも2重で解放されない。
>例外飛ばし
try catch ?
failはfstreamのパクリです。動的読み込みだと、場合によっては特定のDLLで読み込みに失敗しても処理続行できる場合とかあるし。
ちょっと作り変えてきます。
>>例外飛ばし
>try catch ?
表現が不適切でした。正しくは例外を発生させるですね。
try,catchです。せっかくc++を使っているので、例外処理を簡素にしたほうが使い勝手がいいような気がしたので。
それにしてもこのブログ重すぎ。タブレットからでは、とても見れたもんじゃない。
>例外 (ry
本当は予測できないエラーに対処するためにtry catch使うべきなんですよね…。考えておきます…。
>ブログ
私に言われましても…
ちなみに重たいのはこのブログだけですよ。pcでアクセスしても重たいし。表示しているブログパーツのせいでは?
思いつくとしたら、ブログバナーのGIFアニメかブログランキングのSWFでしょうか…。
重いとだけ言われましても私の環境だと全部サクサク動くのでわかりません。すいません。
いや、単なるjsのこと言ったるんだけど。pcでページ表示直後のカクつくのが、タブレットではかなり重くなり、応答なしとして扱われる。
この現象が発生するのはこのブログだけ。他のyahooブログではそんなこと起きない。
そんなこと言われましてもわからないものはわかりません。