|
[1998.03.28] Visual C++でByteio32.DLLを使用してみよう
Visual C++でDelphiやC++Builderで作成したDLLを使用するには次の手順で行えます。
但し、この方法以外にも色々な方法があると思いますが、今回は下記の方法をお勉強しました。
なにわともあれ、Windows\Systemフォルダ又はプロジェクトが保存されているフォルダにByteio32.DLLをコピーします。
|
1.まず、このDLL自体Delphiで作成していますので、VC++で使用する
ヘッター(*.h)やライブラリ(*.Lib)は存在しません。
このファイルがあれば extern "C" __declspec(dllexport)..を使用できます。
(*.h、*.Libのインクルードは必要です。)
2.ここでは、DLLのインポートはLoadLibraryを使用します。
3.次にGetProcAddressを使用してDLL内の関数のアドレスを取得します。
但し、ここでは、関数の頭に_が付いた形の変数にアドレスを代入します。
4.最後に_が付いた関数の形でDLL内の関数を呼び出し、実行します。
5.使用後にFreeLibraryで領域を解放します。
以下にそのソースコードを示します。
このコードはAPPWizerdで作成したアプリのバージョン情報を表示する際に
PC−98のビープ音を鳴らすコードです。
// ダイアログを実行するためのアプリケーション コマンド
void CTEST1App::OnAppAbout()
{
//ここから
DWORD (*_outportb)(int adr , int dat);
HINSTANCE hLib = LoadLibrary("Byteio32.dll");
*((FARPROC *)&_outportb) = GetProcAddress(hLib , "outportb");
_outportb(0x37 , 0x06);
FreeLibrary(hLib);
//ここまで
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
以下は入力方法の例です。
DWORD (*_inportb)(int adr);
HINSTANCE hLib = LoadLibrary("Byteio32.dll");
*((FARPROC *)&_inportb) = GetProcAddress(hLib , "inportb");
m_inp = _inportb(0x37);
FreeLibrary(hLib);
|
[1998.03.28] この際、ついでにC++BuilderでもByteio32.DLLを使用してみよう
なにわともあれ、プロジェクトが保存されているフォルダにByteio32.DLLをコピーします。
|
1.Byteio32.dllをプロジェクトのソースフォルダにコピーします。
2.MS−DOSプロンプトのコマンドラインから、ソースフォルダに移動し
implib Byteio32.lib Byteio32.dllとして、Byteio32.libを作って、それをプロジェクトに追加します。
3.メニューから プロジェクト −> プロジェクトに追加で
Byteio32.libをプロジェクトに追加します。
(上記の方法で自動的にプロジェクトソースファイルに追加されます)
プロジェクトファイルソース
USELIB("A:\Program Files\Borland\CBuilder\Projects\Bytio32b.lib");
4.仮にUnit1に宣言を記述するには次のソースのextern文を追加します。
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
extern "C" __declspec(dllimport) __stdcall outportb(WORD adr, WORD data);
extern "C" __declspec(dllimport) BYTE __stdcall inportb(WORD adr);
TForm1 *Form1;
これでinportb,outportbが使用可能になります。
5.最後に適当なイベントのソースに次の様に記述します。
(例)
このoutportbの例ではPC98のビープ音をon/offします。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
outportb(0x37 , 0x06);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
outportb(0x37 , 0x07);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int a;
char st[24];
a = inportb(0x10);
itoa(a , st , 16);
Edit1->Text = st;
}
|
戻る
|