Programing Tips |
---|
プログラム関連の小ネタです。 間違いを発見した方、質問や文句がある方は こちらへどうぞ。 |
Menu |
---|
|
自己解凍ファイルを作ろう |
---|
プログラム | データファイルのヘッダー | データ |
#include <windows.h> // hInstanceにプログラムのインスタンスをいれてやる。 char GetExePath(HINSTANCE hInstance){ char fullpath[_MAX_PATH+1]; // フルパスを受け取る変数 // 実行ファイルのフルパスを取得 GetModuleFileName(hInstance,fullpath,_MAX_PATH); // ディレクトリ情報を返す return fullpath; } |
// リソースを検索 // hInstanceは自己解凍プログラムのインスタンス // リソースのタイプはMYRESOURCE、リソースのIDはMYRESOURCE1 // Windows.hをインクルードしてください。 HRSRC hRes=FindResource( hInstance, MAKEINTRESOURCE(MYRESOURCE1), "MYRESOURCE" ); if (hRes==NULL){ cout <<"Error"; return 0; } // リソースをロード HGLOBAL hGlobal=LoadResource(hInstance, hRes); if (hGlobal==NULL){ cout <<"Error"; return 0; } // リソースのサイズを取得 DWORD size=SizeofResource(hInstance,hRes); // リソースをロック char *pData=(char *)LockResource(hGlobal); if(pData==NULL){ cout <<"Error"; return 0; } // 自己解凍プログラムのサイズをリソースから取得 unsigned long Exesize=*pData; // リソースを解放 FreeResource(hGlobal); // あとはifstream.ignore(Exesize)かなんかで解凍プログラム部分を読み飛ばし、 // ファイルヘッダーを読み込んで、適宜解凍なり、複合なりを行わせます。 |
// 解凍プログラムのサイズは123456だとします // リソースのタイプはMYRESOURCE、 // 埋め込んだりソースのIDはMYRESOURCE1だとします。 // windows.hをインクルードする必要があります。 // Windows 9x、Meでは使えません。 unsigned long size=123456; // サイズを代入 char path[_MAX_PATH]; HANDLE hRes=BeginUpdateResource(path,FALSE); BOOL err=UpdateResource( hRes,// 更新ファイルのハンドル "MYRESOURCE",// 更新するリソースのタイプ MAKEINTRESOURCE(MYRESOURCE1),// 更新するリソース名(ID) MAKELANGID(LANG_JAPANESE,SUBLANG_DEFAULT),// ユーザーのデフォルトの言語 &size,(DWORD)4 ); if (err==FALSE){ MessageBox( NULL,"実行ファイルの書き込みに失敗しました。", "Error",MB_ICONEXCLAMATION ); EndUpdateResource(hRes,TRUE); // 更新を書き込まない } else { EndUpdateResource(hRes,FALSE); // 更新を書き込む MessageBox( NULL,"実行ファイルの更新成功", "正常終了",MB_ICONINFORMATION ); } |
微妙に便利なコメント |
---|
/* int a = 2; int b = 3; int c = a * b; */ |
/* int a = 2; int b = 3; int c = a * b; //*/← ポイント |
//*← ポイント int a = 2; int b = 3; int c = a * b; //*/ |