ご無沙汰しております。
今回、以前に『独自のインストーラ的なものを作りたい!』と、
リソースについて調べていましたが、Konisi様の助言で、
exeにファイルをくっつけていくという手段にしました。
しかし、やってみると、ひとつしかファイルをくっつけることが出来ません。
ということは、ZIPなどで圧縮して1つにまとめたものをくっつけるなどの方法しかないのですが、
それだと、『最初からZIPで配布しろや』ということになってしまいます。
(切り離しのコードをいじる実力はない)
なので、適当なファイルにファイルを合成し、それをくっつけるという手段を選び、
いろいろと実験して来ました。
やっとの思いで、合成する側のコードは書けたと思うのですが、
それを元に戻すのがなぜか出来ません。
分かる方がいらっしゃいましたら、添削の方をお願いします。
まとめる処理
[ここをクリックすると内容が表示されます]
コード: 全て選択
リストボックスを作成し、そこにファイルの一覧(名前)を表示して、
そこからファイルまでのパスを作っています。
Dim num As Long
Dim buf[1000] As BytePtr
Dim hFile As HANDLE
Dim n As Long
Dim LastFileSize As Long
num=SendDlgItemMessage(hMainWnd,ListBox1,LB_GETCOUNT,0,0)
SetDlgItemText(hMainWnd,Static6,Str$(num))
'ファイルを作る
Open dir+"\game.test" For Output As #1
Print #1,""
Close #1
SetDlgItemText(hMainWnd,Static2,"ファイルを読み込んでいます....")
For n=0 to num-1 Step 1
SetDlgItemText(hMainWnd,Static4,Str$(n))
'nコ目のファイルタイトルを取得
Dim Length As Long
Dim name As BytePtr
Dim s As String
Length=SendDlgItemMessage(hMainWnd,ListBox1,LB_GETTEXTLEN,n,0)+1
name=malloc(Length)
SendDlgItemMessage(hMainWnd,ListBox1,LB_GETTEXT,n,name)
s=MakeStr(name)
free(name)
'取得したタイトルから、ファイルパスを作る
Dim path As String
path=str+"\"+s
'作ったパスから、読み込み用ファイルハンドルを作る
Dim dwAccessByte As Long
hFile=CreateFile(path,GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
If hFile=INVALID_HANDLE_VALUE Then
MessageBox(hMainWnd,Ex"読み込みファイルハンドル作成時にエラーが発生しました!\r\n"+path,"Error File Number Is "+Str$(n)+" .",MB_OK or MB_ICONWARNING)
Exit Sub
End If
'ファイルサイズの取得
Dim FileSize As Long
FileSize=GetFileSize(hFile,0)
LastFileSize=LastFileSize+FileSize
'読み込み領域の確保
buf[n]=malloc(FileSize+1)
'ファイルの読み込み
If ReadFile(hFile,buf[n],FileSize,VarPtr(dwAccessByte),ByVal 0)=0 Then
MessageBox(hMainWnd,"ファイル読み込み時にエラーが発生しました!!","Error "+Str$(n),MB_OK or MB_ICONWARNING)
MessageBox(hMainWnd,Ex"FileSize="+Str$(FileSize)+Ex"\r\ndwAccessByte="+Str$(dwAccessByte),"",MB_OK or MB_ICONWARNING)
End If
'ファイル名とサイズを記録
Open dir+"\FileInfo.txt" For Append As #1
Print #1,s+"="+Str$(FileSize)
Close #1
'ハンドルを閉じて、繰り返す
CloseHandle(hFile)
Next
'ファイル名とサイズを記録したテキストファイルを読み出す
hFile=CreateFile(dir+"\FileInfo.txt",GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
If hFile=INVALID_HANDLE_VALUE Then
MessageBox(hMainWnd,Ex"読み込みファイルハンドル作成時にエラーが発生しました!\r\n"+path,"Error File Number Is TEXTFILE.",MB_OK or MB_ICONWARNING)
Exit Sub
End If
'ファイルサイズの取得
Dim TextSize As Long
TextSize=GetFileSize(hFile,0)
'読み込み領域の確保
Dim text As BytePtr
text=malloc(FileSize+1)
'ファイルの読み込み
If ReadFile(hFile,text,TextSize,VarPtr(dwAccessByte),ByVal 0)=0 Then
MessageBox(hMainWnd,"ファイル読み込み時にエラーが発生しました!!","Error "+Str$(n),MB_OK or MB_ICONWARNING)
MessageBox(hMainWnd,Ex"FileSize="+Str$(FileSize)+Ex"\r\ndwAccessByte="+Str$(dwAccessByte),"",MB_OK or MB_ICONWARNING)
End If
'読み込んだデータをまとめる
Dim AllData As BytePtr
AllData=malloc(LastFileSize+TextSize+1025)
SetDlgItemText(hMainWnd,Static2,"ファイルデータを結合しています")
'テキストファイルを結合
If lstrcat(AllData,text)=NULL Then
MessageBox(hMainWnd,"テキストファイルの追加に失敗しました!!","Error",MB_OK or MB_ICONWARNING)
End If
'テキストファイルの重さを結合
Dim ss As String
ss=Str$(TextSize)
If lstrcat(AllData,StrPtr(ss))=NULL Then
MessageBox(hMainWnd,"テキストファイルの追加に失敗しました!!","Error",MB_OK or MB_ICONWARNING)
End If
For n=0 to num-1 Step 1
SetDlgItemText(hMainWnd,Static4,Str$(n))
If lstrcat(AllData,buf[n])=NULL Then
MessageBox(hMainWnd,"データ連結時にエラーが発生しました。","Error File Num "+Str$(n),MB_OK or MB_ICONWARNING)
End If
Next
CloseHandle(hFile)
'まとめたデータを書き出す用のハンドル作成
hFile=CreateFile(dir+"\game.test",GENERIC_WRITE,0,ByVal 0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0)
If hFile=INVALID_HANDLE_VALUE Then
MessageBox(hMainWnd,Ex"ファイルハンドル作成時にエラーが発生しました!","Error まとめファイルハンドル作成時",MB_OK or MB_ICONWARNING)
Exit Sub
End If
SetDlgItemText(hMainWnd,Static6,"ファイルを書き出しています...")
'まとめたデータを書き出す
If WriteFile(hFile,AllData,LastFileSize,VarPtr(dwAccessByte),ByVal 0)=FALSE Then
MessageBox(hMainWnd,"ファイル作成時にエラーが発生しました!!","Last Error",MB_OK or MB_ICONWARNING)
MessageBox(hMainWnd,Str$(LastFileSize)+","+Str$(dwAccessByte),0,0)
End If
CloseHandle(hFile)
MessageBox(hMainWnd,"処理終了","End",MB_OK or MB_ICONINFORMATION)
SetDlgItemText(hMainWnd,Static2,"処理完了")
とりあえず、FileInfo.txtだけを読み出そうとして失敗したコード
[ここをクリックすると内容が表示されます]
コード: 全て選択
#N88BASIC
Dim hFileRead As HANDLE
Dim hFileWrite As HANDLE
Dim FileSize As Long
Dim buf As BytePtr
Dim dwAccessByte As Long
'テキストファイルの重さを抽出
hFileRead=CreateFile("game.test",GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
If hFileRead=INVALID_HANDLE_VALUE Then
MessageBox(0,Ex"読み込みファイルハンドル作成時にエラーが発生しました!","Error",MB_OK or MB_ICONWARNING)
End If
buf=malloc(1025)
If ReadFile(hFileRead,buf,FileSize,VarPtr(dwAccessByte),ByVal 0)=0 Then
MessageBox(0,"ファイル読み込み時にエラーが発生しました!!","Error ",MB_OK or MB_ICONWARNING)
End If
'テキストファイルを出力
Dim TextFileSize As Long
TextFileSize=Val(Str$(buf))/1024
free(buf)
buf=malloc(TextFileSize+1)
SetFilePointer(hFileRead,1024,NULL,FILE_BEGIN)
If ReadFile(hFileRead,buf,TextFileSize,VarPtr(dwAccessByte),ByVal 0)=0 Then
MessageBox(0,"ファイル読み込み時にエラーが発生しました!!","Error ",MB_OK or MB_ICONWARNING)
End If
hFileWrite=CreateFile("FileInfo.txt",GENERIC_WRITE,0,ByVal 0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0)
If hFileWrite=INVALID_HANDLE_VALUE Then
MessageBox(0,Ex"書き込みファイルハンドル作成時にエラーが発生しました!","Error",MB_OK or MB_ICONWARNING)
End If
If WriteFile(hFileWrite,buf,TextFileSize,VarPtr(dwAccessByte),ByVal 0)=FALSE Then
MessageBox(0,"テキストファイル作成時にエラーが発生しました!!","Error",MB_OK or MB_ICONWARNING)
End If
free(buf)
CloseHandle(hFileWrite)
CloseHandle(hFileRead)