サンプルプログラム3
3-1)sampleDLL(DLL ダイナミック・リンク・ライブラリ)
WindowsのDLL、ダイナミック・リンク・ライブラリの作成プログラムです。DLLは、Windowsで標準的に使われるライブラリで、必要な時に呼び出されます。OSに限らず、ユーザも開発することができ、よく使うルーチンや処理を一括してまとめておくことで、再利用やプログラムサイズの抑制ができます。
@がサンプルDLLのソース・プログラム、Aがヘッダ・ファイル、Bがコンパイル、ライブラリ作成結果です。
作成したDLLを他のアプリケーションから利用するために、呼び出す関数を定義したヘッダ・ファイルを必要とします。
作成したdllファイルから、ライブラリ・ファイル(.lib)を作成しています。
ここに載せたファイルは、こちら。
@ソース・プログラム(sample.c)
// ===================================================================
// sample.c サンプル DLL
// 2018/09/01 Kimio Nakamura
// ===================================================================
#include <windows.h>
// =====================================================================
// Name : __declspec( dllexport ) int __stdcall dll_Mul( long *l_out,
// int i_in1, int i_in2)
// Notes : 掛け算結果を返す。 l_out = i_in1 * i_in2
// Parameter:
// Return : 0:OK
// =====================================================================
__declspec( dllexport ) int __stdcall dll_Mul( long *l_out, int i_in1, int i_in2 )
{
*l_out = (long)i_in1 * (long)i_in2;
return 0;
}
// =====================================================================
// Name : __declspec( dllexport ) int __stdcall dll_Div( long *l_out,
// int i_in1, int i_in2)
// Notes : 割り算結果を返す。 d_out = i_in1 / i_in2
// Parameter:
// Return : 0:OK
// =====================================================================
__declspec( dllexport ) int __stdcall dll_Div( double *d_out, int i_in1, int i_in2 )
{
*d_out = (double) i_in1 / (double) i_in2;
return 0;
}
// =====================================================================
// Name :int WINAPI DllMain( HANDLE hInst, ULONG ul_reason_for_call ,
// UPVOID lpReserved )
// Notes : DLLのメイン関数
// Parameter: 形式的に置く、何もしない。
// Return :
// =====================================================================
int WINAPI DllMain( HANDLE hInst , ULONG ul_reason_for_call, LPVOID lpReserved )
{
return TRUE;
}
Aヘッダ・ファイル(samole.h)
// ===================================================================
// sample.h sample.dll 用ヘッダ
// 2018.09.01, Kimio Nakamura
// ===================================================================
// extern "C" は、C++で、このヘッダを
// インクルードできるように入れる。
#ifdef __cplusplus
extern "C"{
#endif
// __declspec( dllexport ) は、外部からの利用を可能にする
// __stdcall は、dllで一般的に使われる呼び出し規約
__declspec( dllexport ) int __stdcall dll_Mul( long *l_out , int i_in1, int i_in2 );
__declspec( dllexport ) int __stdcall dll_Div( double *d_out , int i_in1, int i_in2 );
#ifdef __cplusplus
}
#endif
Bコンパイル、ライブラリ作成結果

3-2)sample_301(C)
3-1)で作成したDLLの関数を呼び出すプログラムです。@がソース・プログラム、Aがコンパイル結果、Bが実行結果です。
@ソースプログラム(sample_301.c)
// =========================================================================
// sample_301.c sample.dllの関数の呼び出し
//
// 2018/09/01 Kimio Nakamura
// =========================================================================
#include <stdio.h>
#include "sample.h"
// =========================================================================
// Name : int main(void)
// Notes : メイン関数、sample.dll中のdll_Mul呼び出し、 dll_Divの呼び出し。
// Parameter: なし
// Return : 0
// =========================================================================
int main()
{
long l_out;
double d_out;
int i_in1, i_in2;
// dll_Mul(掛け算)呼び出し
i_in1 = 1000;
i_in2 = 2000;
l_out =0L;
printf("Multiply 呼び出し前 : out = %8ld in1 = %5d in2 = %5d\n",
l_out, i_in1, i_in2 );
dll_Mul( &l_out , i_in1, i_in2 );
printf("Multiply 呼び出し後 : out = %8ld in1 = %5d in2 = %5d\n\n",
l_out, i_in1, i_in2 );
// dll_Div(割り算)呼び出し
i_in1 = 11;
i_in2 = 13;
d_out =0.0;
printf("Divide 呼び出し前 : out = %6.3f in1 = %5d in2 = %5d\n",
d_out, i_in1, i_in2 );
dll_Div( &d_out , i_in1, i_in2 );
printf("Divide 呼び出し後 : out = %6.3f in1 = %5d in2 = %5d\n",
d_out, i_in1, i_in2 );
return 0;
}
Aコンパイル結果

B実行結果

3-3)sample_301p(C++)
C++プログラムから呼び出すこともできます。Cがソースプログラム、Dがコンパイル結果、Eが実行結果です。
Cソース・プログラム
// =========================================================================
// sample_301p.cpp sample.dllの関数の呼び出し、C++
//
// 2018/08/29 Kimio Nakamura
// =========================================================================
#include <iostream>
#include "sample.h"
// =========================================================================
// Name : int main(void)
// Notes : メイン関数、sample.dll中のdll_Mul呼び出し、 dll_Divの呼び出し
// Parameter: なし
// Return : 0
// =========================================================================
int main()
{
int i_in1, i_in2;
long l_out;
double d_out;
i_in1 = 1000;
i_in2 =2000;
l_out = 0L;
std::cout << "Multiply 呼び出し前 : out =" << l_out << "
in1 =" <<i_in1 <<" in2 =" <<i_in2 <<"\n";
dll_Mul( &l_out, i_in1, i_in2);
std::cout << "Multiply 呼び出し後 : out =" << l_out << "
in1 =" <<i_in1 <<" in2 =" <<i_in2 <<"\n\n";
i_in1 = 11;
i_in2 = 13;
d_out = 0.0;
std::cout << "Divide 呼び出し前 : out =" << d_out << "
in1 =" <<i_in1 <<" in2 =" <<i_in2 <<"\n";
dll_Div( &d_out, i_in1, i_in2);
std::cout << "Divide 呼び出し後 : out =" << d_out << "
in1 =" <<i_in1 <<" in2 =" <<i_in2 <<"\n";;
return 0;
}
Dコンパイル結果

E実行結果


|