● 関数リファレンス
バージョン情報の取得
void __stdcall StrCalc_getversion(PSCVER pver);
引数
戻り値
無し
説明
対象の StrCalc DLL が持つバージョン情報を取得します。
テスト1.バージョン情報の表示
#include <stdio.h>
#include "sc39.h"
void main(void)
{
SCVER v;
StrCalc_getversion(&v);
printf("%d . %d . %d\n",v.top,v.mid,v.bottom);
printf("%s\n",(v.bNormal)? "normal" : "oldwin");
printf("%s\n",v.ver);
}
テスト2.
このプログラムについては、コンパイル時に sc39.lib をリンクする必要はありません。
実行する時は、normal の sc39.dll のファイル名を "sc39_normal.dll" 、oldWin の sc39.dll を
"sc39_oldwin.dll" に付け替えて、exe の位置にコピーしてください。
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include "sc39.h"
#define NORMAL_DLL "sc39_normal.dll"
#define OLDWIN_DLL "sc39_oldwin.dll"
#define FUNC_NAME "_StrCalc_getversion@4" /* StrCalc_getversion の関数名(__stdcall) */
typedef VOID (__stdcall *GETVER)(PSCVER );
typedef struct {
HINSTANCE hLib;
GETVER pfunc;
LPSTR pDllName;
} DLLINFO,*PDLLINFO;
/* DLL の読み込みと関数ポインタの取得 */
BOOL LoadV39DLL(PDLLINFO pinf)
{
if ((pinf->hLib = LoadLibrary(pinf->pDllName)) == NULL){
printf("%s : 読み込みエラー\n",pinf->pDllName);
return FALSE;
}
if ((pinf->pfunc = (GETVER)GetProcAddress(pinf->hLib,FUNC_NAME)) == NULL){
FreeLibrary(pinf->hLib);
printf("%s : 関数アドレスの取得に失敗\n",pinf->pDllName);
return FALSE;
}
return TRUE;
}
/* バージョン情報の表示 */
VOID ShowVer(PSCVER pver)
{
printf("%d . %d . %d\n",pver->top,pver->mid,pver->bottom);
printf("%s\n",(pver->bNormal)? "normal" : "oldWin");
printf("%s\n",pver->ver);
}
VOID main(VOID)
{
DLLINFO dll1 = { NULL, NULL, NORMAL_DLL };
DLLINFO dll2 = { NULL, NULL, OLDWIN_DLL };
SCVER ver1,ver2;
if (LoadV39DLL(&dll1) == FALSE)
return;
if (LoadV39DLL(&dll2) == FALSE){
FreeLibrary(dll1.hLib);
return;
}
/* 関数StrCalc_getversion の実行 */
dll1.pfunc(&ver1); /* normal DLL */
dll2.pfunc(&ver2); /* oldWin DLL */
/* 内容表示 */
ShowVer(&ver1); printf("\n");
ShowVer(&ver2); printf("\n\n");
/* バージョン情報の比較 */
if (ver1.top != ver2.top || ver1.mid != ver2.mid || ver1.bottom != ver2.bottom ||
ver1.bNormal != ver2.bNormal || strcmp(ver1.ver,ver2.ver))
printf("異なるバージョンです\n");
else
printf("同じバージョンです\n");
FreeLibrary(dll1.hLib);
FreeLibrary(dll2.hLib);
}
テスト2 ソースファイル(zip)(32 bit 版のみ)
テスト3.ダイナミックリンク
テスト2 と同じく、インポートライブラリをリンクする必要はありません。
#include <windows.h>
#include <stdio.h>
#include "sc39.h"
typedef VOID (__stdcall *GETVER)(PSCVER);
VOID main(VOID)
{
HINSTANCE hLib;
GETVER pfunc;
SCVER ver;
if ((hLib = LoadLibrary("sc39.dll")) == NULL){
printf("DLL の読み込みに失敗しました\n");
return;
}
if ((pfunc = (GETVER)GetProcAddress(hLib,"_StrCalc_getversion@4")) == NULL){
FreeLibrary(hLib);
printf("関数ポインタの取得に失敗しました\n");
return;
}
pfunc(&ver); /* 関数StrCalc_getversion の実行 */
printf("\n");
printf("バージョン番号:%d . %d . %d\n",
ver.top,ver.mid,ver.bottom);
printf(" bNormal:%d\n",ver.bNormal);
printf(" ver:%s\n",ver.ver);
FreeLibrary(hLib);
}
テスト3 ソースファイル(zip)