• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ActiveBasic リソースの追加と読み込み)

ActiveBasic リソースの追加と読み込み

このQ&Aのポイント
  • ActiveBasic 4.23.00を使用して、リソースの追加方法について教授していただきましたが、文字列以外のファイル(例:zipファイル)を追加する方法を知りたいです。
  • また、プログラムBにリソースを追加した際に、プログラムBのアイコンが消えてしまいます。この問題を回避する方法を教えていただきたいです。
  • さらに、プログラムBから追加したリソースを読み込むプログラムを実行する際にエラーが発生し、回避方法を知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

 こんばんは。補足頂きました。  う~ん、此れは厳しいですなあ・・・。  取りあえず、実験台のプロジェクトを作成して、exeと取り込みたいファイルをプロジェクトのフォルダに置いた後、フォームにボタンを2つ用意して、以下を試してみては如何でしょう。 '----------------------------------------------------------------------------- ' イベント プロシージャ '----------------------------------------------------------------------------- ' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。 ' ウィンドウ ハンドル: hMainWnd ' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。 Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (hInstance As DWord,lpName As BytePtr,lpType As BytePtr) As DWord Declare Function FreeResource Lib "kernel32" (hResData As DWord) As DWord Declare Function SizeofResource Lib "kernel32" (hInstance As DWord,hResInfo As DWord) As DWord Declare Function LoadResource Lib "kernel32" (hInstance As DWord,hResInfo As DWord) As DWord Declare Function LockResource Lib "kernel32" (hResData As DWord) As Long Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (pFileName As BytePtr, bDeleteExistingResources As Long) As Long Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (hUpdate As Long,lpType As BytePtr,lpName As BytePtr,wLanguage As Long,lpData As VoidPtr,cbData As Long) As Long Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (hUpdate As Long,fDiscard As Long) As Long 'ファイル名 Const RT_NAMEID=1000 'ファイルサイズ Const RT_SIZEID=2000 'ファイル内容 Const RT_FILEID=3000 '書き込ませたいexe又はdllの名前 Dim szModuleName[MAX_PATH + 1] As TCHAR '取り込まれるファイルの名前 Dim szResourceName[MAX_PATH + 1] As TCHAR '----------------------------------------------------------------------------- ' ウィンドウメッセージを処理するためのコールバック関数 Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT ' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。 ' イベントプロシージャの呼び出しを行います。 MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam) End Function '----------------------------------------------------------------------------- ' ここから下は、イベントプロシージャを記述するための領域になります。 Sub MainWnd_Destroy() test_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) Dim pszModName As LPTSTR Dim pszResName As LPTSTR pszModName = "xxx.exe" pszResName = "mybitmap.bmp" memcpy(szModuleName, pszModName, lstrlen(pszModName)) memcpy(szResourceName, pszResName, lstrlen(pszResName)) End Sub 'ボタン1でExe又はDllにファイルを取り込み Sub MainWnd_CommandButton1_Click() Dim hUpdate As HANDLE Dim hFile As HANDLE Dim dwSize As DWORD Dim pBuffer As LPVOID Dim dummy As DWORD Dim fDiscard As BOOL hUpdate = BeginUpdateResource(szModuleName, FALSE) If hUpdate = NULL Then MessageBox(hMainWnd,"アップデート対象を開く事に失敗!","Error",MB_OK or MB_ICONHAND) Exit Sub End If hFile = CreateFile(szResourceName, GENERIC_READ, 0, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) If hFile=INVALID_HANDLE_VALUE Then MessageBox(hMainWnd, szResourceName, 0, 0) MessageBox(hMainWnd,"ファイルハンドルの作成に失敗しました!","Error",MB_OK or MB_ICONHAND) Exit Sub End If dwSize = GetFileSize(hFile, NULL) pBuffer = malloc(dwSize) ReadFile(hFile, pBuffer, dwSize, VarPtr(dummy), ByVal 0) fDiscard = UpdateResource(hUpdate, RT_MANIFEST, MAKEINTRESOURCE(RT_NAMEID), 1041, szResourceName, lstrlen(szResourceName)) If fDiscard = FALSE Then MessageBox(hMainWnd,"ファイル名書き込み中にトラブル発生!","Error",MB_OK or MB_ICONHAND) goto *Error End If fDiscard = UpdateResource(hUpdate, RT_MANIFEST, MAKEINTRESOURCE(RT_SIZEID), 1041, VarPtr(dwSize), 4) If fDiscard = FALSE Then MessageBox(hMainWnd,"ファイルサイズ書き込み中にトラブル発生!","Error",MB_OK or MB_ICONHAND) goto *Error End If fDiscard = UpdateResource(hUpdate, RT_MANIFEST, MAKEINTRESOURCE(RT_FILEID), 1041, pBuffer, dwSize) If fDiscard = FALSE Then MessageBox(hMainWnd,"ファイルを書き込み中にトラブル発生!","Error",MB_OK or MB_ICONHAND) goto *Error End If *Error free(pBuffer) EndUpdateResource(hUpdate, fDiscard xor TRUE) CloseHandle(hFile) End Sub 'ボタン2でExe又はDllに取り込まれたファイルを外に書く Sub MainWnd_CommandButton2_Click() Dim hFile As HANDLE Dim hUpdate As HINSTANCE Dim hResource As HRSRC Dim hGlobal As HGLOBAL Dim pszName As LPTSTR Dim dwSize As DWORD Dim dummy As DWORD Dim pBuffer As LPVOID Dim sizeOfRes As DWORD hUpdate = LoadLibrary(szModuleName) If hUpdate = NULL Then MessageBox(hMainWnd,"読み取り対象を開く事に失敗!","Error",MB_OK or MB_ICONHAND) Exit Sub End If '---------------------------------------------------------------------------------- 'Exe又はDllから取り込まれたファイルの文字を取り出す ↓ '---------------------------------------------------------------------------------- hResource = FindResource(hUpdate, MAKEINTRESOURCE(RT_NAMEID), RT_MANIFEST) sizeOfRes = SizeofResource(hUpdate, hResource) if hResource = NULL Or sizeOfRes = 0 Then MessageBox(hMainWnd,"ファイル名読み込み中にトラブル発生!","Error",MB_OK or MB_ICONHAND) goto *Error End If hGlobal = LoadResource(hUpdate, hResource) pszName = malloc(sizeOfRes + 1) memcpy(pszName, LockResource(hGlobal), sizeOfRes) pszName[sizeOfRes] = 0 '---------------------------------------------------------------------------------- 'Exe又はDllから取り込まれたファイルの文字を取り出す ↑ '---------------------------------------------------------------------------------- '---------------------------------------------------------------------------------- 'Exe又はDllから取り込まれたファイルのサイズを取り出す ↓ '---------------------------------------------------------------------------------- hResource = FindResource(hUpdate, MAKEINTRESOURCE(RT_SIZEID), RT_MANIFEST) sizeOfRes = SizeofResource(hUpdate, hResource) if hResource = NULL Or sizeOfRes = 0 Then MessageBox(hMainWnd,"ファイルサイズ読み込み中にトラブル発生!","Error",MB_OK or MB_ICONHAND) goto *Error End If hGlobal = LoadResource(hUpdate, hResource) memcpy(VarPtr(dwSize), LockResource(hGlobal), sizeOfRes) '---------------------------------------------------------------------------------- 'Exe又はDllから取り込まれたファイルのサイズを取り出す ↑ '---------------------------------------------------------------------------------- '---------------------------------------------------------------------------------- 'Exe又はDllから取り込まれたファイルを取り出す ↓ '---------------------------------------------------------------------------------- hResource = FindResource(hUpdate, MAKEINTRESOURCE(RT_FILEID), RT_MANIFEST) sizeOfRes = SizeofResource(hUpdate, hResource) if hResource = NULL Or sizeOfRes = 0 Then MessageBox(hMainWnd,"ファイル読み込み中にトラブル発生!","Error",MB_OK or MB_ICONHAND) goto *Error End If hFile = CreateFile(pszName, GENERIC_WRITE, 0, ByVal 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0) If hFile=INVALID_HANDLE_VALUE Then MessageBox(hMainWnd, pszName, 0, 0) MessageBox(hMainWnd,"ファイルハンドルの作成に失敗しました!","Error",MB_OK or MB_ICONHAND) Exit Sub End If hGlobal = LoadResource(hUpdate, hResource) WriteFile(hFile, LockResource(hGlobal), dwSize, VarPtr(dummy), ByVal 0) CloseHandle(hFile) '---------------------------------------------------------------------------------- 'Exe又はDllから取り込まれたファイルを取り出す ↑ '---------------------------------------------------------------------------------- *Error free(pszName) FreeLibrary(hUpdate) End Sub

if-so-at
質問者

お礼

遅くなってすみません。 出来ました! 此処までのお付き合い、ありがとうございました!!

その他の回答 (3)

回答No.3

 こんばんは。補足頂きました。 #define RT_MANIFEST 24 で上手くいかなければ、 #define RT_MANIFEST MAKEINTRESOURCE(24)  其の他、めぼしい物を載せておきます。 #define RT_CURSOR MAKEINTRESOURCE(1) #define RT_BITMAP MAKEINTRESOURCE(2) #define RT_ICON MAKEINTRESOURCE(3) #define RT_MENU MAKEINTRESOURCE(4) #define RT_DIALOG MAKEINTRESOURCE(5) #define RT_STRING MAKEINTRESOURCE(6) #define RT_FONTDIR MAKEINTRESOURCE(7) #define RT_FONT MAKEINTRESOURCE(8) #define RT_ACCELERATOR MAKEINTRESOURCE(9) #define RT_RCDATA MAKEINTRESOURCE(10) #define RT_MESSAGETABLE MAKEINTRESOURCE(11) #define DIFFERENCE 11 #define RT_GROUP_CURSOR MAKEINTRESOURCE((ULONG_PTR)RT_CURSOR + DIFFERENCE) #define RT_GROUP_ICON MAKEINTRESOURCE((ULONG_PTR)RT_ICON + DIFFERENCE) #define RT_VERSION MAKEINTRESOURCE(16) #define RT_DLGINCLUDE MAKEINTRESOURCE(17) #define RT_PLUGPLAY MAKEINTRESOURCE(19) #define RT_VXD MAKEINTRESOURCE(20) #define RT_ANICURSOR MAKEINTRESOURCE(21) #define RT_ANIICON MAKEINTRESOURCE(22) #define RT_HTML MAKEINTRESOURCE(23)

if-so-at
質問者

お礼

遅くなりました。 回答ありがとうございます。 何とか追加には成功しました。 しかし、追加したりソースを書き出そうと思ったのですが、思うように動きません。 1:テキストファイルの場合 ファイルは出力されるが、中身は0KB 2:その他のファイル 読み込めない(INVALID_HANDLE_VALUEが返る) 問題のコードは、補足の方に書かせていただきます すみませんが、もう少しお付き合いいただけないでしょうか

if-so-at
質問者

補足

Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (hInstance As DWord,lpName As BytePtr,lpType As BytePtr) As DWord Declare Function FreeResource Lib "kernel32" (hResData As DWord) As DWord Declare Function SizeofResource Lib "kernel32" (hInstance As DWord,hResInfo As DWord) As DWord Declare Function LoadResource Lib "kernel32" (hInstance As DWord,hResInfo As DWord) As DWord Declare Function LockResource Lib "kernel32" (hResData As DWord) As Long Const RT_MANIFESTID=1 Const RT_MANIFEST="BINTYPE" Const RT_MANIFESTSIZEID=2 Const RT_MANIFESTSIZE="FILESIZE" Const RT_MANIFESTFILEID=3 Const RT_MANIFESTFILE="FILENAME" Dim FileName[MAX_PATH] As Byte Dim hDLL As DWord, hResource As DWord, lResource As DWord Dim hSize As DWord,fSize As DWord,hName As DWord,fName As DWord Dim FileSize As Long,Name As BytePtr Dim File As BytePtr GetModuleFileName(NULL,FileName,MAX_PATH) hDLL=LoadLibrary(FileName) If hDLL=0 Then MessageBox(hMainWnd,"hDLLエラー",0,0) Exit Sub EndIf hResource=FindResource(hDLL,RT_MANIFESTID,RT_MANIFEST) If hResource=0 Then FreeLibrary(hDLL) MessageBox(hMainWnd,"追加エラー",0,0) Exit Sub EndIf hSize=FindResource(hDLL,RT_MANIFESTSIZEID,RT_MANIFESTSIZE) hName=FindResource(hDLL,RT_MANIFESTFILEID,RT_MANIFESTFILE) lResource=LoadResource(hDLL,hResource) fSize=LoadResource(hDLL,hSize) fName=LoadResource(hDLL,hName) FileSize=LockResource(fSize) Name=LockResource(fName) File=LockResource(lResource) FreeResource(lResource) FreeResource(fSize) FreeResource(fName) FreeLibrary(hDLL) 'ファイルを作成する Dim path[MAX_PATH] As Byte Dim pathstr As String Dim hFile As DWord Dim dummy As DWord Dim NameStr As String GetCurrentDirectory(MAX_PATH,path) pathstr=path NameStr=Name hFile=CreateFile(pathstr+"\"+NameStr,GENERIC_WRITE,0,ByVal 0,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0) If hFile=INVALID_HANDLE_VALUE Then MessageBox(hMainWnd,pathstr+"\"+NameStr,0,0) MessageBox(hMainWnd,"ファイルの読み込みに失敗しました!","Error",MB_OK or MB_ICONHAND) Exit Sub End If WriteFile(hFile,File,FileSize,VarPtr(dummy),ByVal 0) MessageBox(0,File,0,0) MessageBox(0,NameStr,0,0) MessageBox(0,Str$(FileSize),0,0) CloseHandle(hFile)

回答No.2

 こんにちは。補足頂きました。  以下に書かれている様に、  UpdateResource()  http://msdn.microsoft.com/ja-jp/library/cc364849.aspx  記録したいリソースの種類によって、RT_???のフラグを使い分けなければいけないのでは。  zipやmid(midiファイル)等は文字列でも、アイコンでもないので、アプリケーション定義データ(自由データ)として、RT_RCDATAフラグで記録するのではないでしょうか。  'プログラムBで、ファイルなどを追加をする時  UpdateResource(IsUpdate, RT_RCDATA, MAKEINTRESOURCE(xxx), MAKELANGID(LANG_JAPANESE, SUBLANG_SYS_DEFAULT), temp, Len(temp))

if-so-at
質問者

お礼

ご回答ありがとうございます。 早速試してみたのですが、 『RT_MANIFEST 無効な識別子』と表示されます。 ActiveBasicには定義されていないようなので、定義の値を探してみましたが見つかりません。 どう表記していけばいいのでしょうか。 すみませんが、知識をお貸しいただけないでしょうか。

回答No.1

 こんにちは。リソースを持っているプログラムBの方ですが、  BeginUpdateResource()  http://msdn.microsoft.com/ja-jp/library/cc410614.aspx  EndUpdateResource()  http://msdn.microsoft.com/ja-jp/library/cc410830.aspx  上記のAPIリファレンスを見る所、  追加したい場合は、  BeginUpdateResource(pszFileName, FALSE)  として、  変更をセーブしたい時は、  EndUpdateResource(hUpdate, FALSE)  とするのではないでしょうか。  と言う事は、  以下が犯人で(此れだと以前書いて来たリソースが消されてしまう)、 IsUpdate=BeginUpdateResource(buf1, TRUE)'FileName はターゲットファイルのフルパス。Ex:"C:\test.exe" にリソースを埋め込む場合、FileName="C:\test.exe"  以下で追記ではないでしょうか。 IsUpdate=BeginUpdateResource(buf1, FALSE)'FileName はターゲットファイルのフルパス。Ex:"C:\test.exe" にリソースを埋め込む場合、FileName="C:\test.exe"

if-so-at
質問者

お礼

ご回答ありがとうございます。 文字列の追加と読み出しは出来ました。 しかし、最終的には、ファイル/フォルダの書き込みと読み出しを行おうと思っています。 ファイルなどの追加/読み出しはどのような関数を使用すればいいのでしょうか。 よろしければご教授の方をお願いします。

関連するQ&A