BCC32Cを使ってみた

サンプルプログラム3


DLL プログラム

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コンパイル、ライブラリ作成結果




DLL呼び出しプログラム(C)

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実行結果



DLL呼び出しプログラム(C++)

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実行結果


戻る