文字通り実行ファイルにくっつける。リソースとは違う方法。
1.インストーラ兼ファイル展開ソフトを作る
2.展開するファイルを実行ファイルにくっつける
3.実行時にくっつけたファイルを読み込んでインストール先に出力する
コードにするとこんな感じかと。 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: Const EXESIZE=1024*36'素のexeファイルのサイズ
#prompt
Extract("ext.bin")
Sub Extract(dest As *Byte)
Assert("start:ファイルを抽出します。")
Dim hFile As HFILE,name As *Byte
name=malloc(MAX_PATH)
GetModuleFileName(0,name,MAX_PATH)
hFile=CreateFile(name,GENERIC_READ,FILE_SHARE_READ Or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
If hFile=INVALID_HANDLE_VALUE then
Assert("error:何らかの理由により自分自身にアクセスできませんでした。")
free(name)
Exit Sub
End If
Dim fSize As DWord,fSizeHigh As DWord
fSize=GetFileSize(hFile,VarPtr(fSizeHigh))
If fSize=EXESIZE And fSizeHigh=0 then
Assert("error:ファイルが埋め込まれていませんでした。")
CloseHandle(hFile)
free(name)
Exit Sub
End If
If fSizeHigh then
Assert("warn:FAT32システムを使用している場合は、4GB以上のファイルは展開できません。")
Assert("hint:上手く行かない場合はNTFS形式に変換してみましょう。")
End If
Dim hOutFile As HFILE
hOutFile=CreateFile(dest,GENERIC_WRITE,FILE_SHARE_READ,ByVal 0,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0)
If hOutFile=INVALID_HANDLE_VALUE then
Assert("error:出力先が既に存在してるか、又はドライブへの書き込みアクセスが出来ません。")
Assert("error:ファイルが存在する場合は削除してください。")
CloseHandle(hFile)
free(name)
Exit Sub
End If
SetFilePointer(hFile,EXESIZE,0,FILE_BEGIN)
SetFilePointer(hOutFile,0,0,FILE_BEGIN)
Dim CopySuccess As Long
CopySuccess=CopyTo(hOutFile,hFile)
If CopySuccess=0 then
Assert("error:何らかの理由で出力先への書き込みができなかった可能性があります。")
Assert("error:ディスクが一杯でないか確認した後、再実行してください。")
CloseHandle(hFile)
CloseHandle(hOutFile)
free(name)
Exit Sub
End If
CloseHandle(hFile)
CloseHandle(hOutFile)
free(name)
Assert("success:抽出に成功しました。")
End Sub
Const COPY_BLOCKSIZE=1024
Function CopyTo(dest As HFILE,src As HFILE) As Long
Dim buffer As *Byte,ReadSize As DWord
Dim ReadSuccess As Long,WriteSuccess As Long
Dim WroteSize As DWord
buffer=malloc(COPY_BLOCKSIZE)
Do
ReadSuccess=ReadFile(src,buffer,COPY_BLOCKSIZE,VarPtr(ReadSize),ByVal 0)
If ReadSuccess then
If ReadSize=0 then Exit Do
WriteSuccess=WriteFile(dest,buffer,ReadSize,VarPtr(WroteSize),ByVal 0)
If WriteSuccess=FALSE or ReadSize<>WroteSize then
CopyTo=0
free(buffer)
Exit Function
End If
Else
CopyTo=0
free(buffer)
Exit Function
End If
Loop
free(buffer)
CopyTo=-1
End Function
Sub Assert(buf As *Byte)
Print MakeStr(buf)
End Sub コマンドプロンプトで コード: copy /B A.exe+B.bin C.exe と打ち込むとA.exeとB.binを結合したC.exeが作れます。
文字通り実行ファイルにくっつける。リソースとは違う方法。
1.インストーラ兼ファイル展開ソフトを作る 2.展開するファイルを実行ファイルにくっつける 3.実行時にくっつけたファイルを読み込んでインストール先に出力する
コードにするとこんな感じかと。[hide][code]Const EXESIZE=1024*36'素のexeファイルのサイズ
#prompt Extract("ext.bin")
Sub Extract(dest As *Byte) Assert("start:ファイルを抽出します。") Dim hFile As HFILE,name As *Byte name=malloc(MAX_PATH) GetModuleFileName(0,name,MAX_PATH) hFile=CreateFile(name,GENERIC_READ,FILE_SHARE_READ Or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) If hFile=INVALID_HANDLE_VALUE then Assert("error:何らかの理由により自分自身にアクセスできませんでした。") free(name) Exit Sub End If Dim fSize As DWord,fSizeHigh As DWord fSize=GetFileSize(hFile,VarPtr(fSizeHigh)) If fSize=EXESIZE And fSizeHigh=0 then Assert("error:ファイルが埋め込まれていませんでした。") CloseHandle(hFile) free(name) Exit Sub End If If fSizeHigh then Assert("warn:FAT32システムを使用している場合は、4GB以上のファイルは展開できません。") Assert("hint:上手く行かない場合はNTFS形式に変換してみましょう。") End If Dim hOutFile As HFILE hOutFile=CreateFile(dest,GENERIC_WRITE,FILE_SHARE_READ,ByVal 0,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0) If hOutFile=INVALID_HANDLE_VALUE then Assert("error:出力先が既に存在してるか、又はドライブへの書き込みアクセスが出来ません。") Assert("error:ファイルが存在する場合は削除してください。") CloseHandle(hFile) free(name) Exit Sub End If SetFilePointer(hFile,EXESIZE,0,FILE_BEGIN) SetFilePointer(hOutFile,0,0,FILE_BEGIN) Dim CopySuccess As Long CopySuccess=CopyTo(hOutFile,hFile) If CopySuccess=0 then Assert("error:何らかの理由で出力先への書き込みができなかった可能性があります。") Assert("error:ディスクが一杯でないか確認した後、再実行してください。") CloseHandle(hFile) CloseHandle(hOutFile) free(name) Exit Sub End If CloseHandle(hFile) CloseHandle(hOutFile) free(name) Assert("success:抽出に成功しました。") End Sub
Const COPY_BLOCKSIZE=1024 Function CopyTo(dest As HFILE,src As HFILE) As Long Dim buffer As *Byte,ReadSize As DWord Dim ReadSuccess As Long,WriteSuccess As Long Dim WroteSize As DWord buffer=malloc(COPY_BLOCKSIZE) Do ReadSuccess=ReadFile(src,buffer,COPY_BLOCKSIZE,VarPtr(ReadSize),ByVal 0) If ReadSuccess then If ReadSize=0 then Exit Do WriteSuccess=WriteFile(dest,buffer,ReadSize,VarPtr(WroteSize),ByVal 0) If WriteSuccess=FALSE or ReadSize<>WroteSize then CopyTo=0 free(buffer) Exit Function End If Else CopyTo=0 free(buffer) Exit Function End If Loop free(buffer) CopyTo=-1 End Function
Sub Assert(buf As *Byte) Print MakeStr(buf) End Sub[/code]コマンドプロンプトで[code]copy /B A.exe+B.bin C.exe[/code]と打ち込むとA.exeとB.binを結合したC.exeが作れます。[/hide]
|