駄六川の草庵 トップページ > 役立たない?/プログラム等 > CvsMks > VC使用例
ごあいさつ
メニューごあいさつ、ご案内
たわごと
メニュー情報処理とビジネス
メニューその他
役立たない?
メニュープログラム等
メニュー英略語集
メニュー友人・知人リンク
プロフィール等
メニュープロフィール
メニューこのサイトについて

メニュー会員のページ

CvsMks : N88-BASIC←→IEEE 浮動小数点表現形式の変換/還元

使用法(2) Visual C から

 使用のためのインクルードファイル(仮称 CvsMks.H)を次のようにしました。適宜、ご改変ください。

使用のためのプロトタイプ宣言(ファイル例 CvsMks.H)
/********************************************************************
 file name : CvsMks.H
   purpose : N88-BASIC <--> IEEE 浮動小数点表現形式の変換/還元
             CvsMks.DLL 使用のためのヘッダファイル(プロトタイプ宣言)

             Version 0.2 / October 31, 2003
 --------------------------------------------------------------------
   history : V0.1/1999-10-26/ 非DLL化ソース CVS.H,MKS.H 転用。
           : V0.2/2003-10-31/ ホームページ用コメント改変。
 ********************************************************************/
#include <windows.h>

#ifndef DllImport
#define DllImport   __declspec( dllimport )
#endif

#ifdef __cplusplus
extern "C" {
#endif

DllImport float  WINAPI n88CVS( unsigned char * );
DllImport double WINAPI n88CVD( unsigned char * );
DllImport unsigned char * WINAPI n88MKS( float,  unsigned char * );
DllImport unsigned char * WINAPI n88MKD( double, unsigned char * );

#ifdef __cplusplus
    }
#endif

 読み込み用関数 n88CVS、n88CVD は次のように使います。

使用例(1) 読み込み
/* 関数へのポインタ処理用 ... DLL 関数への関数ポインタ経由の間接的な */
/* 呼び出しを、関数名による直接的な呼び出しに見せかけるための工夫    */
typedef float            (WINAPI *GETFUNCCVS)( unsigned char * );
typedef double           (WINAPI *GETFUNCCVD)( unsigned char * );

// 中略
    HINSTANCE hDll;
    GETFUNCCVS n88CVS;
    GETFUNCCVD n88CVD;
    FILE *fp;
    FILE *fpw;
    int i;
    size_t size;
    unsigned char buf[512];
    unsigned char tmp[512];
    unsigned char szBuf[512];
    float        fValue;
    double       dValue;

    hDll = LoadLibrary( "CvsMks.Dll" );    /* 下注(*1) */
    if( hDll == NULL )    return;
    n88CVS = (GETFUNCCVS)GetProcAddress( hDll, "n88CVS" );
    n88CVD = (GETFUNCCVD)GetProcAddress( hDll, "n88CVD" );

    if( ( fp = fopen( ReadFile, "rb" ) ) != NULL )    /* 下注(*2) */
    {
        /* Single */
        size = fread( buf, nReadSize, 1, fp );
        tmp[0] = *( buf );
        tmp[1] = *( buf + 1 );
        tmp[2] = *( buf + 2 );
        tmp[3] = *( buf + 3 );
        fValue = n88CVS( tmp );
// 中略
        /* Double */
        size = fread( buf, nReadSize, 1, fp );
        tmp[0] = *( buf );
        tmp[1] = *( buf + 1 );
        tmp[2] = *( buf + 2 );
        tmp[3] = *( buf + 3 );
        tmp[4] = *( buf + 4 );
        tmp[5] = *( buf + 5 );
        tmp[6] = *( buf + 6 );
        tmp[7] = *( buf + 7 );
        dValue = n88CVD( tmp );
// 中略
    FreeLibrary( hDll );

 書き出し用関数 n88MKS、n88MKD は次のように使います。

使用例(2)書き出し
/* 関数へのポインタ処理用 ... DLL 関数への関数ポインタ経由の間接的な */
/* 呼び出しを、関数名による直接的な呼び出しに見せかけるための工夫    */
typedef unsigned char *  (WINAPI *GETFUNCMKS)( float, unsigned char * );
typedef unsigned char *  (WINAPI *GETFUNCMKD)( double,  unsigned char * );

// 中略

    HINSTANCE hDll;
    GETFUNCMKS n88MKS;
    GETFUNCMKD n88MKD;
    unsigned char buf[512];

    hDll = LoadLibrary( "CvsMks.Dll" );    /* 下注(*1) */
    if( hDll == NULL )    return;
    n88MKS = (GETFUNCMKS)GetProcAddress( hDll, "n88MKS" );
    n88MKD = (GETFUNCMKD)GetProcAddress( hDll, "n88MKD" );

    if( ( fp = fopen( WriteFile, "wb" ) ) != NULL )    /* 下注(*2) */
    {
        /* Single */
        n88MKS( (float)-123.456, buf );
        fwrite( buf, 4, 1, fp );
// 中略 
        /* Double */
        n88MKD( 987.654, buf );
        fwrite( buf, 8, 1, fp );
// 中略 
    FreeLibrary( hDll );
*1. 本ソースでは、DLL へのリンクを明示的に行ないました。ゆえにインポートライブラリを、コンパイル時にリンクする必要はありません。もし LoadLibrary、GetProcAddress の2関数を用いずに暗黙のリンクで実行させるならば、必ずインポートライブラリをリンクしてください。インポートライブラリは DLL 生成時に作成できます。
*2. ここでは簡便のため fopen、fread、fwrite で示しましたが、CreateFile、ReadFile、WriteFile などを使っても何ら問題はありません。

darokugawa@master.email.ne.jp darokugawa@master.email.ne.jp このページ最終更新日 : November 2, 2003