ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 02:00

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




新しいトピックを投稿する  トピックへ返信する  [ 6 件の記事 ] 
作成者 メッセージ
 記事の件名: 大きな配列の初期化
投稿記事Posted: 2005年7月03日(日) 23:51 
コード:
Dim lngTable[ELM(6561)] = [ ...(6561個のデータ)... ] As Long
このように大きな配列を初期化するコードを書くと、コンパイル中にコンパイラが落ちます。どれぐらいの大きさから落ちるのか、型の種類は関係あるのかは調べていませんが、とりあえず私の環境ではLong型、6561個で落ちました。

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


WinXP SP2 AB 4.02.01 メモリ 256MB


通報する
ページトップ
   
投稿記事Posted: 2005年7月06日(水) 16:19 
オフライン

登録日時: 2005年5月31日(火) 07:49
記事: 162
> このような大きいデータはリソースに入れたいのですが、ABではカスタムリソースに対応していないので・・・。

では、予め初期データをファイルにバイナリ形式で保存しておき、プログラムの起動時にそれを読み込むのはどうでしょうか。
コード中に直書きするよりも管理が容易ですし、確実ですよ。
ただ、データを隠蔽したいのならばこの手段は避けるべきかもしれません。


通報する
ページトップ
投稿記事Posted: 2005年7月08日(金) 13:29 
> では、予め初期データをファイルにバイナリ形式で保存しておき、プログラムの起動時にそれを読み込むのはどうでしょうか。

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

むしろカスタムリソースに対応してほしいです。


通報する
ページトップ
   
投稿記事Posted: 2005年7月08日(金) 19:49 
オフライン

登録日時: 2005年5月31日(火) 20:14
記事: 203
お住まい: 兵庫県
少し面倒かもしれませんが、リソースを追加するプログラムを別に作成しておき、元のプログラムではリソースを読み込むようにしてはいかがでしょうか。

<例>
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日(金) 23:23 
> 要点だけを記述したので少々わかりにくいかもしれませんが、何とか解読してください(汗

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

ありがとうございました。


通報する
ページトップ
   
投稿記事Posted: 2005年7月09日(土) 15:03 
オフライン

登録日時: 2005年5月31日(火) 20:14
記事: 203
お住まい: 兵庫県
言い忘れていましたが、埋め込む方のプログラムはNT系でないと動作しません(汗
開発にWin98やMeをご使用の場合はご注意ください(取り出す方は9xでもOK)。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 6 件の記事 ] 

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


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[12人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

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