第318章 カスタム・リソースをdll化する


前章で作ったカスタム・リソースの部分を dllにしておくと、画像ファイルを追加するとき便利です。

まず、今回はGIFファイルを追加します。

適当なGIFファイルを用意しておきます。

mail.gif
home.gif
index.gif
back.gif
contents.gif

では、さっそくプログラムを見てみましょう。まずはdll側です。 dllの作り方については第119章を参照してみてください。

// hedll01.h #define EXPORT extern "C" __declspec(dllexport)

ヘッダファイルです。

//hedll01.cpp #include <windows.h> #include "hedll01.h" #include "resource.h" int WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, PVOID pvReserved) { return TRUE; }

実際にはDllMainは何もしていないので、省略可能です。

プロジェクトにカスタム・リソースを追加します。

// hedll01.rcの一部 ///////////////////////////////////////////////////////////////////////////// // // GIF // WHAT GIF DISCARDABLE "what.gif" MAIL GIF DISCARDABLE "mail.gif" HOME GIF DISCARDABLE "home.gif" INDEX GIF DISCARDABLE "index.gif" BACK GIF DISCARDABLE "back.gif" CONTENTS GIF DISCARDABLE "contents.gif"

dll側はずいぶん簡単です。

では、EXE側は、前章のプログラムからカスタムリソースを削除します。 また、メニューに今回加えた画像の項目を足しておきます。

// htmedit13.cpp ...省略... char szClassName[] = "htmedit13"; //ウィンドウクラス char szExeName[] = "hedll01.dll"; //このプログラムの名前 ...省略... //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { ...省略... switch (msg) { ...省略... case WM_COMMAND: switch (LOWORD(wp)) { ...省略... //画像ファイルGIFの呼び出し・出力 case IDM_WHAT: MyCreateFileFromResource(hEdit, hEdit_hide, "WHAT", "GIF", "what.gif"); break; case IDM_MAILTO: MyCreateFileFromResource(hEdit, hEdit_hide, "MAIL", "GIF", "mail.gif"); break; case IDM_HOME: MyCreateFileFromResource(hEdit, hEdit_hide, "HOME", "GIF", "home.gif"); break; case IDM_INDEX: MyCreateFileFromResource(hEdit, hEdit_hide, "INDEX", "GIF", "index.gif"); break; case IDM_BACK: MyCreateFileFromResource(hEdit, hEdit_hide, "BACK", "GIF", "back.gif"); break; case IDM_CONTENTS: MyCreateFileFromResource(hEdit, hEdit_hide, "CONTENTS", "GIF", "contents.gif"); break; } ...省略...

szExeNameは今回作ったdllの名前にしておく必要があります。

メニューに今回追加した画像の項目を増やしました。

BOOL MyCreateFileFromResource(HWND hEdit, HWND hE_hide, char *szResourceName, char *szResourceType, char *szResFileName) { HMODULE hExe; HRSRC hRs; HGLOBAL hMem; HANDLE hFile; LPBYTE lpByte; DWORD dwWritten, dwResSize; if (strcmp(szFileName, "") == 0) { MessageBox(hEdit, "まず名前を付けて保存してください。", "注意", MB_OK | MB_ICONEXCLAMATION); return FALSE; } hExe = LoadLibrary(szExeName); if (hExe == NULL) { MessageBox(hEdit, "LoadLibrary Error", "Error", MB_OK); return FALSE; } hRs = FindResource(hExe, szResourceName, szResourceType); if (hRs == NULL) { MessageBox(hEdit, "FindResource Error", "Error", MB_OK); return FALSE; } dwResSize = SizeofResource(hExe, hRs); hMem = LoadResource(hExe, hRs); lpByte = (BYTE *)LockResource(hMem); hFile = CreateFile(szResFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { MessageBox(NULL, "CreateFile Error", "OK", MB_OK); return FALSE; } WriteFile(hFile, lpByte, dwResSize, &dwWritten, NULL); CloseHandle(hFile); if (dwResSize != dwWritten) { MessageBox(hEdit, "WriteFile Error", "Error", MB_OK); return FALSE; } MyInsertTag(hEdit, hE_hide, "<IMG SRC=\""); MyInsertTag(hEdit, hE_hide, szResFileName); MyInsertTag(hEdit, hE_hide, "\">"); if (!MySave(hEdit)) return FALSE; return TRUE; }

何も保存されていない状態でこの関数が呼び出されたときは、注意を促して 戻るようにしました。

今回はずいぶん簡単でした。できたプログラムを実行すると・・・

画像を挿入したい位置にカーソルを置き、メニューの 「挿入」「GIF画像」から選択します。



ブラウザで閲覧して左の図のように、意図した画像が 表示されれば成功です。




[SDK第4部 Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 25/Aug/2001 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。