午後のこ〜だDLLの読み込み手順

午後のこ〜だDLLは、以下のような手順で取得してください。
サンプルプログラム :
stab.cpp

  1. カレントディレクトリ・システムディレクトリの"gogo.dll"をオープンします。
    以下に記述例を示します。

    hModuleHandle = LoadLibrary("gogo.dll");

  2. ( 1.でDLLが読み込みできなかった場合) レジストリ項目の
      HEY_CURENT_USER\Software\MarineCat\GOGO_DLL
    キー以下の
      INSTPATH (REG_SZ形式)に設定されている文字列を取得します。
    あらかじめ、 _MAX_PATH (Microsoft Windows® 95/98/NTの場合 _MAX_PATH = 260 )分のバッファサイズを確保してください。正常に取得できたなら、その文字列をLoadLibraryへ渡します。

    以下に例を示します。
    #define Key	HKEY_CURRENT_USER
    #define SubKey "Software\\MarineCat\\GOGO_DLL"
    HKEY	hKey;
    DWORD	dwType, dwKeySize;
    LONG	lResult;
    static	char	*szName = "INSTPATH";
    char	szPathName[ _MAX_PATH + 8];
    dwKeySize = sizeof( szPathName );
    
    // レジストリ項目の HEY_CURENT_USER\Software\MarineCat\GOGO_DLL
    // キー以下の INSTPATH (REG_SZ)を取得します。
    if( RegOpenKeyEx(
    		Key,
    		SubKey,
    		0,
    		KEY_ALL_ACCESS,
    		&hKey ) == ERROR_SUCCESS 
    ){
    	lResult = RegQueryValueEx(
    		hKey,
    		szName,
    		0,
    		&dwType,
    		(BYTE *)szPathName,
    		&dwKeySize);
    	RegCloseKey(hKey);
    	if( lResult == ERROR_SUCCESS && REG_SZ == dwType ){
    		// レジストリから取得したパスで再度DLLの読み込み
    		hModule = LoadLibrary( szPathName );
    	}
    }
    
    以下の処理で読み込みが失敗した場合は、アプリケーション側で読み込み失敗の処理(表示)を行ってください。
    
  3. 関数のエクスポートを取得します。
    
    この際、アプリケーションで使用する可能性のある関数のエクスポートが
    正しく取得できるか確認してください。
    
    参照可能な関数のエクスポート名・及びプロトタイプ宣言を以下に示します
    
     エクスポート名称   プロトタイプ宣言 
     "MPGE_initializeWork"   MERET (*me_init)(void);
     "MPGE_setConfigure"   MERET (*me_setconf)(MPARAM mode, UPARAM dwPara1, UPARAM dwPara2 );
     "MPGE_getConfigure"   MERET (*me_getconf)(MPARAM mode, void *para1 );
     "MPGE_detectConfigure"   MERET (*me_detect)();
     "MPGE_processFrame"   MERET (*me_procframe)();
     "MPGE_closeCoder"   MERET (*me_close)();
     "MPGE_endCoder"   MERET (*me_end)();
     "MPGE_getVersion"   MERET (*me_getver)( unsigned long *vercode, char *verstring );
     "MPGE_getUnitStates"   MERET (*me_haveunit)( unsigned long *unit );
以下に取得および使用方法の例を示します。
typedef MERET (*me_init)(void);		// プロトタイプ宣言の設定
static  me_init initfunc;		// 初期化関数の定義

initfunc = (me_init )GetProcAddress( hModule, "MPGE_initializeWork" );
if( initfunc == NULL ){
	// 正しくexportが取得できなかった処理
	printf("DLLの関数取得に失敗\n");
	exit(-1);
} else {
	// 正しくexportが取得できた場合
	initfunc();			// iniufunc(MPGE_initializeWork)の実行
}