MJexeIO.DLL(東風荘画面入出力用ダイナミックリンクライブラリ) 入門マニュアル
具体的にプログラムを作って動かすには?
C++のコンパイラを使って、コンソールアプリとして構築してみましょう。
マニュアルの指示どおりにサンプルをコピペしていきます。
一部「ShowMessage」などのコンパイラ依存の関数を使っているので、そういう部分は削除してしまいましょう。
下にあるコードのほとんど全部が、ただのコピペです。
そしてプログラムの最初で、必要なインクルードファイルを#includeでインクルードさせます。
また簡単のために、おなじみのint main()から始まるようにしたので、returnのところは返り値を適当につけてやります。
赤字になっている部分以外は、「ShowMessage」を削除したり、「return」を「return
-1」に変えたりしているだけで、基本的にコピペです。
これをこのままコンパイルすれば(たぶん)動くと思います。
当然、MJexeIO.dllを実行ファイルと同じフォルダに置いておく必要があります。
VisualC++の場合、キャストの制限が違うようで、
GetHaiSize = ( GETHAISIZE )::GetProcAddress(
hDll, "_GetHaiSize" );
のような部分でキャストエラーが出るようです。
コンパイラの指示通り、ここを
GetHaiSize = ( GETHAISIZE )::GetProcAddress(
(struct HINSTANCE__ *)hDll, "_GetHaiSize"
);
に直してやることで、コンパイルできます。
#include"windows.h"
#include"string.h"
//★以下はヘッダ部分に記述
//インポート関数の型定義(下の各関数の説明を読んで、同じ型で定義します)
typedef int (*GETTEHAI)(int,int *);
typedef int (*GETSUTEHAI)(int,int,int *);
typedef int (*GETSUTEHAINUM)(int,int,int
*);
typedef int (*GETDLLVERSION)(void);
typedef int (*GETKAZE)(int);
typedef int (*GETTURNPLAYER)(int);
typedef int (*GETFUROHAI)(int,int,int *);
typedef int (*GETTONPUDATA)(char *);
typedef int (*GETHAISIZE)(void);
typedef int (*GETDORAHAI)(int,int *);
typedef int (*PUSHHAI)(int,int);
typedef int (*PUSHFUNCTIONKEY)(int);
typedef int (*RCLICK)(void);
typedef int (*GETTONPUINFO)(HWND *,HWND *);
typedef int (*CHECK_TENPAI)(int *,int *);
typedef int (*CHECK_AGARIHAI)(int *,int);
typedef int (*SETMODE)(int);
typedef int (*GETAVAILABLEFUNCTIONKEY)(int
*,int);
typedef int (*EXISTAVAILABLEFUNCTIONKEY)(int);
typedef int (*GETRIGHTESTTEHAI)(void);
typedef int (*EXT_GETHAI)(int,int,int,int);
typedef int (*GETPLAYERINFO)(int *,int *,int,int)
;
typedef int (*GETHOLDTIME)(int);
typedef int (*GETREACH)(int,int);
typedef int (*SENDCHAT)(char *,int,int);
//インポート関数型の関数へのポインタ変数宣言
GETTEHAI GetTehai;
GETSUTEHAI GetSutehai;
GETSUTEHAINUM GetSutehaiNum;
GETDLLVERSION GetDLLVersion;
GETKAZE GetKaze;
GETTURNPLAYER GetTurnPlayer;
GETFUROHAI GetFurohai;
GETTONPUDATA GetTonpuData;
GETHAISIZE GetHaiSize;
GETDORAHAI GetDorahai;
PUSHHAI PushHai;
PUSHFUNCTIONKEY PushFunctionKey;
RCLICK RClick;
GETTONPUINFO GetTonpuInfo;
CHECK_TENPAI Check_tenpai;
CHECK_AGARIHAI Check_agarihai;
SETMODE SetMode;
GETAVAILABLEFUNCTIONKEY GetAvailableFunctionKey;
EXISTAVAILABLEFUNCTIONKEY ExistAvailableFunctionKey;
GETRIGHTESTTEHAI GetRightestTehai;
EXT_GETHAI ext_GetHai;
GETPLAYERINFO GetPlayerInfo;
GETHOLDTIME GetHoldTime;
GETREACH GetReach;
SENDCHAT SendChat;
int main()
{
int tmphai[51],size; //汎用
HANDLE hDll = ::LoadLibrary( "MJexeIO.dll"
); //DLLをロード
if(hDll==NULL){return 0;} //DLLロードのエラーチェック
//DLLから必要な関数をインポート
GetHaiSize = ( GETHAISIZE )::GetProcAddress(
hDll, "_GetHaiSize" );
GetDorahai = ( GETDORAHAI )::GetProcAddress(
hDll, "_GetDorahai" );
GetTehai = ( GETTEHAI )::GetProcAddress(
hDll, "_GetTehai" );
GetSutehai = ( GETSUTEHAI )::GetProcAddress(
hDll, "_GetSutehai" );
GetSutehaiNum = ( GETSUTEHAINUM )::GetProcAddress(
hDll, "_GetSutehaiNum" );
GetDLLVersion = ( GETDLLVERSION )::GetProcAddress(
hDll, "_GetDLLVersion" );
GetKaze = ( GETKAZE )::GetProcAddress( hDll,
"_GetKaze" );
GetTurnPlayer = ( GETTURNPLAYER )::GetProcAddress(
hDll, "_GetTurnPlayer" );
GetFurohai = ( GETFUROHAI )::GetProcAddress(
hDll, "_GetFurohai" );
GetTonpuData = ( GETTONPUDATA )::GetProcAddress(
hDll, "_GetTonpuData" );
PushHai = ( PUSHHAI )::GetProcAddress( hDll,
"_PushHai" );
PushFunctionKey = ( PUSHFUNCTIONKEY )::GetProcAddress(
hDll, "_PushFunctionKey" );
RClick = ( RCLICK )::GetProcAddress( hDll,
"_RClick" );
GetTonpuInfo = (GETTONPUINFO)::GetProcAddress(hDll,"_GetTonpuInfo");
Check_tenpai = (CHECK_TENPAI)::GetProcAddress(hDll,"_Check_tenpai");
Check_agarihai = (CHECK_AGARIHAI)::GetProcAddress(hDll,"_Check_agarihai");
SetMode = (SETMODE)::GetProcAddress(hDll,"_SetMode");
GetAvailableFunctionKey = (GETAVAILABLEFUNCTIONKEY)::GetProcAddress(hDll,"_GetAvailableFunctionKey");
ExistAvailableFunctionKey = (EXISTAVAILABLEFUNCTIONKEY)::GetProcAddress(hDll,"_ExistAvailableFunctionKey");
GetRightestTehai = (GETRIGHTESTTEHAI)::GetProcAddress(hDll,"_GetRightestTehai");
ext_GetHai = (EXT_GETHAI)::GetProcAddress(hDll,"_ext_GetHai");
GetPlayerInfo = (GETPLAYERINFO)::GetProcAddress(hDll,"_GetPlayerInfo");
GetHoldTime = (GETHOLDTIME)::GetProcAddress(hDll,"_GetHoldTime");
GetReach = (GETREACH)::GetProcAddress(hDll,"_GetReach");
SendChat = (SENDCHAT)::GetProcAddress(hDll,"_SendChat");
//DLL関数インポートのエラーチェック。この例では2つの関数だけをチェックしている。
if(GetHaiSize==NULL){return -1;} //DLL関数インポートのエラーチェック
if(GetDorahai==NULL){return -1;} //DLL関数インポートのエラーチェック
int i;
char str[1024]; //返り値受け取り用の文字列
char players[5][20];
strcpy(players[0],"/w とつげき東北\0");
strcpy(players[1],"/w とつ開発研究\0");
strcpy(players[2],"/w 紅孔雀さん\0");
strcpy(players[3],"/w バイマンキン\0");
strcpy(players[4],"/w デシマンキン\0");
for(i=0;i<5;i++)
SendChat(players[i],0,0); //チャットに文字列送信
//★以下は全ての動作を終了した後に一度だけ行う
//DLLの開放
FreeLibrary( hDll );
return 0;
}
実行結果画面
東風の画面で上のプログラムを実行すると、このように一瞬にして「一括/w」をすることができました。
MJexeIO.dllを利用すれば、主要部分はコピペで、使い勝手を整えボタンなどを配置すれば、実用的なツールを作ることができることがおわかりいただけたでしょう。