● 関数リファレンス

バージョン情報の取得

    void __stdcall   StrCalc_getversion(PSCVER pver);

引数

引数名意味
pverSCVER 構造体の実体アドレス

戻り値

無し

説明

対象の 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)