ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 10:18

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - 大きな配列の初期化
作成者 メッセージ
  記事の件名:  Re: 大きな配列の初期化  引用付きで返信する
言い忘れていましたが、埋め込む方のプログラムはNT系でないと動作しません(汗
開発にWin98やMeをご使用の場合はご注意ください(取り出す方は9xでもOK)。
投稿記事 Posted: 2005年7月09日(土) 15:03
  記事の件名:  Re: 大きな配列の初期化  引用付きで返信する
> 要点だけを記述したので少々わかりにくいかもしれませんが、何とか解読してください(汗

十分です。すぐわかりました。
あとからリソースを埋め込むことができるとは知りませんでした。自己解凍するexeをどうやって作っているのかが長年の疑問でしたが、こういうことをやっていたんですね。いまからやってみます。

ありがとうございました。
投稿記事 Posted: 2005年7月08日(金) 23:23
  記事の件名:  Re: 大きな配列の初期化  引用付きで返信する
少し面倒かもしれませんが、リソースを追加するプログラムを別に作成しておき、元のプログラムではリソースを読み込むようにしてはいかがでしょうか。

<例>
Oar32.dllへのリソース追加で使用しているコードをそのまま掲載してみます。参考にしてください。
コード:
Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (hInstance As HINSTANCE,lpName As BytePtr,lpType As BytePtr) As HANDLE
Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (pFileName As BytePtr,bDeleteExistingResources As Long) As Long
Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (hUpdate As DWord,lpType As BytePtr,lpName As BytePtr,wLanguage As DWord,lpData As VoidPtr,cbData As Long) As Long
Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (hUpdate As DWord,fDiscard As Long) As Long

Dim hUpdateFile As DWord
Dim hRsrc[1] As DWord
Dim strExePath As String
Dim Buf As String
Dim i As DWord,FormatedNum As String
Const SFXCount=2

strExePath="..\..\oar32.dll"

hUpdateFile=BeginUpdateResource(strExePath,FALSE)
If hUpdateFile Then
	For i=1 To SFXCount
		FormatedNum=ZeroString(2)
		wsprintf(FormatedNum,"%02d",i)
		Open FormatedNum & ".bin" For Input As 1
		Field #1,Lof(1)
		Get #1,1,Buf
		UpdateResource(hUpdateFile,"SFX",i,MAKELANGID(&H11,&H2),Buf,Lof(1))
		Close 1
	Next
	EndUpdateResource(hUpdateFile,0)
End If
次は、読み込む方のコードです。こちらを元のプログラムに記述してください。
コード:
Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (hInstance As HINSTANCE,lpName As BytePtr,lpType As BytePtr) As HANDLE
Declare Function LoadResource Lib "kernel32" (hModule As HANDLE,hResInfo As HANDLE) As HGLOBAL
Declare Function FreeResource Lib "kernel32" (hResData As HGLOBAL) As DWord
Declare Function LockResource Lib "kernel32" (hResData As HGLOBAL) As VoidPtr
Declare Function SizeofResource Lib "kernel32" (hModule As HANDLE,hResInfo As HANDLE) As DWord

(変数の宣言などは省略)
Ret=FindResource(hDLL,dwSFXType+1,"SFX")
Ret2=SizeofResource(hDLL,Ret)
Ret=LoadResource(hDLL,Ret)
pSFXRes=LockResource(Ret)
			WriteFile(hFile2,pSFXRes,Ret2,VarPtr(Dummy),ByVal NULL) 'SFX部分
Buffer=ZeroString(&H100000)
Do
	ReadFile(hFile,Buffer,&H100000,VarPtr(Ret2),ByVal NULL)
	WriteFile(hFile2,Buffer,Ret2,VarPtr(Dummy),ByVal NULL)
Loop While Ret=&H100000
FreeResource(Ret)
要点だけを記述したので少々わかりにくいかもしれませんが、何とか解読してください(汗
投稿記事 Posted: 2005年7月08日(金) 19:49
  記事の件名:  Re: 大きな配列の初期化  引用付きで返信する
> では、予め初期データをファイルにバイナリ形式で保存しておき、プログラムの起動時にそれを読み込むのはどうでしょうか。

そうしています。
回避策があるにしてもコンパイラが落ちるのはバグだと思うのですが・・・。

むしろカスタムリソースに対応してほしいです。
投稿記事 Posted: 2005年7月08日(金) 13:29
  記事の件名:  Re: 大きな配列の初期化  引用付きで返信する
> このような大きいデータはリソースに入れたいのですが、ABではカスタムリソースに対応していないので・・・。

では、予め初期データをファイルにバイナリ形式で保存しておき、プログラムの起動時にそれを読み込むのはどうでしょうか。
コード中に直書きするよりも管理が容易ですし、確実ですよ。
ただ、データを隠蔽したいのならばこの手段は避けるべきかもしれません。
投稿記事 Posted: 2005年7月06日(水) 16:19
  記事の件名:  大きな配列の初期化  引用付きで返信する
コード:
Dim lngTable[ELM(6561)] = [ ...(6561個のデータ)... ] As Long
このように大きな配列を初期化するコードを書くと、コンパイル中にコンパイラが落ちます。どれぐらいの大きさから落ちるのか、型の種類は関係あるのかは調べていませんが、とりあえず私の環境ではLong型、6561個で落ちました。

このような大きいデータはリソースに入れたいのですが、ABではカスタムリソースに対応していないので・・・。


WinXP SP2 AB 4.02.01 メモリ 256MB
投稿記事 Posted: 2005年7月03日(日) 23:51

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean