|
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 |
このページ最終更新日 : November 2, 2003 |
|