<IMG SRC="wel.gif" ALT="">

[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;
}


戻る