LoadLibraryの戻り値の型は?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

LoadLibraryの戻り値の型は?

#1

投稿記事 by みけCAT » 14年前

このコードは、自作のDES暗号化DLLを使うコードです。

コード:

#include <stdio.h>
#include <windows.h>

typedef void (__stdcall *pMakeDesKey)(unsigned char key[8],unsigned char in[8]);
typedef int (__stdcall *pCheckDesKey)(unsigned char key[8]);
typedef void (__stdcall *pDesEncode)
		(unsigned char out[8],unsigned char in[8],unsigned char key[8]);
typedef void (__stdcall *pDesDecode)
		(unsigned char out[8],unsigned char in[8],unsigned char key[8]);

void printdata(char* prefix,unsigned char data[8]) {
	int i;
	printf("%s",prefix);
	for(i=0;i<8;i++)printf("%02X",(int)data[i]);
	printf("\n");
}

int main(int argc, char *argv[]) {
	HMODULE hdll;
	int error=0;
	/*関数ポインタ*/
	pMakeDesKey MakeDesKey;
	pCheckDesKey CheckDesKey;
	pDesEncode DesEncode;
	pDesDecode DesDecode;
	/*暗号化変数*/
	unsigned char keymoto[7]={0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE};
	unsigned char key[8];
	unsigned char hirabun[8]={0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10};
	unsigned char angou[8];
	unsigned char fukugou[8];
	/*DLLのロード*/
	hdll=LoadLibrary("des.dll");
	if(hdll==NULL) {
		printf("des.dllが見つかりません。\n");
		return 1;
	}
	MakeDesKey=(pMakeDesKey)GetProcAddress(hdll,"MakeDesKey");
	CheckDesKey=(pCheckDesKey)GetProcAddress(hdll,"CheckDesKey");
	DesEncode=(pDesEncode)GetProcAddress(hdll,"DesEncode");
	DesDecode=(pDesDecode)GetProcAddress(hdll,"DesDecode");
	if(MakeDesKey==NULL) {
		printf("MakeDesKey関数が見つかりません。\n");
		error=1;
	}
	if(CheckDesKey==NULL) {
		printf("CheckDesKey関数が見つかりません。\n");
		error=1;
	}
	if(DesEncode==NULL) {
		printf("DesEncode関数が見つかりません。\n");
		error=1;
	}
	if(DesDecode==NULL) {
		printf("DesDecode関数が見つかりません。\n");
		error=1;
	}
	if(error)return 1;
	/*暗号化*/
	MakeDesKey(key,keymoto);
	printdata("  鍵:",key);
	if(!CheckDesKey(key))printf("鍵が不正です。\n");
	printdata(" 平文:",hirabun);
	DesEncode(angou,hirabun,key);
	printdata("暗号文:",angou);
	DesDecode(fukugou,angou,key);
	printdata("復号後:",fukugou);
	/*解放*/
	FreeLibrary(hdll);
	return 0;
}
このコードでは、LoadLibraryの戻り値を受ける型はHMODULEになっています。
これは、http://www.geocities.jp/ky_webid/win32c/058.htmlの記述に従ったからです。
しかし、サイトによっては、http://www.hm-lab.net/archives/269のように
LoadLibraryの戻り値をHINSTANCE型で受けているところがあります。
これはどちらが正しいのでしょうか?
教えていただければ幸いです。
よろしくお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: LoadLibraryの戻り値の型は?

#2

投稿記事 by softya(ソフト屋) » 14年前

これが答えになりそうです。
http://whileimautomaton.net/2004/12/31234200
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

やんち

Re: LoadLibraryの戻り値の型は?

#3

投稿記事 by やんち » 14年前

ついでに、MSDN も調べて置くと良いです。

http://msdn.microsoft.com/ja-jp/library/cc429241.aspx

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: LoadLibraryの戻り値の型は?

#4

投稿記事 by bitter_fox » 14年前

ヘッダーファイルを見るとLoadLibraryは以下のように宣言されています。(bcc551です)

コード:

// winbase.h

WINBASEAPI
HMODULE
WINAPI
LoadLibraryA(
    IN LPCSTR lpLibFileName
    );
WINBASEAPI
HMODULE
WINAPI
LoadLibraryW(
    IN LPCWSTR lpLibFileName
    );
#ifdef UNICODE
#define LoadLibrary  LoadLibraryW
#else
#define LoadLibrary  LoadLibraryA
#endif // !UNICODE
これを見ると、HMODULEですね。

ちなみに、HINSTANCEは、windef.h内で以下のように宣言されています。

コード:

typedef HINSTANCE HMODULE;      /* HMODULEs can be used in place of HINSTANCEs */
ですので、結果的には同じ型になってるということです。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: LoadLibraryの戻り値の型は?

#5

投稿記事 by みけCAT » 14年前

皆さんありがとうございます。
MinGW(gcc4.5.0)では、HINSTANCEになっていました。
winbase.hより

コード:

WINBASEAPI HINSTANCE WINAPI LoadLibraryA(LPCSTR);
WINBASEAPI HINSTANCE WINAPI LoadLibraryExA(LPCSTR,HANDLE,DWORD);
WINBASEAPI HINSTANCE WINAPI LoadLibraryExW(LPCWSTR,HANDLE,DWORD);
WINBASEAPI HINSTANCE WINAPI LoadLibraryW(LPCWSTR);
でも確かにtypedefされています。
windef.hより

コード:

DECLARE_HANDLE(HINSTANCE);
typedef HINSTANCE HMODULE;
そしてこのDECLARE_HANDLEマクロは多くのハンドル系の型で共通のようです。
ありがとうございました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る