こちらのサイトが復帰したと聞いて、飛んできました。
ずっと一人で考えていたのですが、なかなか思うようにいかないので、質問させていただきます。
今回、プログラムAとプログラムBを用意し、
プログラムAで何かファイルを選択し、プログラムBに追加して、
プログラムBでボタンを押すとプログラムAで追加したファイルを取り出す
と言った、ファイルをまとめる感じのソフトを作成して見ようと思っています。
しかし、文字列追加は上手くいくのですが、ファイルの追加が出来ません。
ON ERROR RESUME NEXT様のコードを参考にさせていただきました。
コード: 全て選択
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_MANIFESTID=1
Const RT_MANIFEST="24"
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Dim Dir As String
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
SoftBoxAddFiler_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim path[MAX_PATH] As Byte
GetCurrentDirectory(MAX_PATH,path)
Dir=path+"\"
End Sub
Sub MainWnd_FindFiles_Click()
Dim ofn As OPENFILENAME
Dim FilePath[MAX_PATH-1] As Byte
Dim test As Integer
Dim a As Long
'ファイル名を取得
ofn.lStructSize=Len(ofn)
ofn.hwndOwner=hMainWnd
ofn.lpstrFilter=Ex"追加するファイル(ALL FILES)\0*.*\0\0"
ofn.nFilterIndex=1
ofn.lpstrFile=FilePath
ofn.nMaxFile=MAX_PATH
ofn.lpstrTitle="ファイルを開く"
ofn.Flags=OFN_HIDEREADONLY or OFN_EXPLORER
If GetOpenFileName(ofn)=0 Then
MessageBox(hMainWnd,"ファイルのオープンに失敗しました!","Error 01",MB_OK or MB_ICONHAND)
Exit Sub
End If
SetDlgItemText(hMainWnd,FilePathBox,FilePath)
End Sub
Sub MainWnd_SetCommand_Click()
Dim Length As Long
Dim buf As BytePtr
Dim str As String
Dim IsUpdate As Long
Dim Update As Long
Dim temp As String
Length=GetWindowTextLength(GetDlgItem(hMainWnd,FilePathBox))
If Length=0 Then
MessageBox(hMainWnd,"追加するファイルが選択されていません!","Error 02",MB_OK or MB_ICONHAND)
Exit Sub
End If
buf=malloc(Length+1)
GetDlgItemText(hMainWnd,FilePathBox,buf,Length+1)
temp=MakeStr(buf)
IsUpdate=BeginUpdateResource(Dir+"ProgramB.exe",FALSE)
If IsUpdate=0 Then'エラー
free(buf)
MessageBox(hMainWnd,"リソースの埋め込み先に異常あり","Error 03",MB_OK or MB_ICONHAND)
Exit Sub
End If
Update=UpdateResource(IsUpdate,RT_MANIFEST,RT_MANIFESTID,MAKELANGID(LANG_JAPANESE,SUBLANG_SYS_DEFAULT),temp,Len(temp))
If Update=0 Then'エラー
EndUpdateResource(IsUpdate,TRUE)
free(buf)
MessageBox(hMainWnd,"リソースの埋め込み時に異常事態発生","Error 04",MB_OK or MB_ICONHAND)
Exit Sub
End If
EndUpdateResource(IsUpdate,FALSE)
free(buf)
MessageBox(hMainWnd,"たぶんエラーなく書き込みを完了しました。","Success!!",MB_OK or MB_ICONINFORMATION)
End Sub
上のサイトを参考にしたところ、UpdateResourceAの第二パラメータに更新するリソースのタイプを指定するようなのですが、
自由データを追加したいので RT_RCDATA を指定したのですが、無効な識別と出ます。
(RT_RCDATAの定義が24なので、Const RT_MANIFEST="24"としてみたのですが、書き込みは完了するのに、プログラムBが起動できなくなる)
すみませんが、どのように表記していけばいいのかをご教授お願いできないでしょうか。