α


リソースを書き出すには?  2001-07-05 19:54:38  No: 74598  IP: [192.*.*.*]

リソースの中のEXEを起動させたり、
ファイルとして外に出すにはどうすればよいのでしょうか。

編集 削除
α  2001-07-05 19:55:44  No: 74599  IP: [192.*.*.*]

うわー最悪だ。
題名と名前間違えました!
本当にすみません。

編集 削除
こころ  URL  2001-07-06 01:13:35  No: 74600  IP: [192.*.*.*]

LoadResDataして、バイナリ単位で読み込んでから
ファイルに書き出せばいいのでは?
んで、Shell系で立ち上げればいける気がします。

編集 削除
α  2001-07-06 15:54:14  No: 74601  IP: [192.*.*.*]

なるほど。
でもバイナリの書き出しはまだやったことがないんです。
解説書を読めばいいのですが、どうもよく分からなくて…
バイナリの読み出し、書き出しはどのようにすればよいのでしょうか。
知識不足で誠にすみません。

編集 削除
たかみちえ  URL  2001-07-06 21:42:05  No: 74602  IP: [192.*.*.*]

バイナリデータは…。
たぶん、何にもいじくったりしなければ、ふつうに保存できるんじゃあないかなぁ…。
http://ww2.tiki.ne.jp/~kotb/に、読みこむ方法はあります。
ただ、exeはバイナリでも書きかえられないようにロックしてあることがあるようなのでわからないです。

編集 削除
こころ  URL  2001-07-07 00:41:14  No: 74603  IP: [192.*.*.*]

ロックされるのは、基本的には
起動中のexeだけなので大丈夫でしょう。

Openでバイナリモードで開けばいけるはずです。
こころはAPIでゴリゴリ書き込んで、
しかも最近はモジュール化したものを使用しているので
ファイルアクセスを忘れつつあったり・・・。
うちのページにバイナリ書き出し用のモジュールもあるので
どうしてもわからなければ参考にしてみるのもいいかもしれません。

編集 削除
α  2001-07-07 07:40:59  No: 74604  IP: [192.*.*.*]

すみません、図々しいのですが

        ReDim byBuf(1 To LOF(1))
        Get #1, , byBuf

うえの二つは何を表しているのですか?

編集 削除
α  2001-07-07 07:56:09  No: 74605  IP: [192.*.*.*]

ごめんなさい。こころさんのページの
バイナリのURLは何処ですか?
どうも分からなくなったもので。

編集 削除
α  2001-07-07 17:35:53  No: 74606  IP: [192.*.*.*]

前々の質問、無かったことにしてください。
読み出していくのはいいのですが、だんだん遅くなってきますね。
何ででしょうか。

編集 削除
こころ  URL  2001-07-07 22:21:15  No: 74607  IP: [192.*.*.*]

VB系のファイル入出力はほとんど使ってないんで
ちょっと自信ないんですが
>ReDim byBuf(1 To LOF(1))
>Get #1, , byBuf
LOFは指定ファイル番号のファイルサイズを返すので
その分だけバッファを用意してデータを読み込んでいます。
っていうか、最近ファイル番号を直値で指定してる人、
よく見ますが、ちゃんとFreeFile使いましょうね。

> バイナリのURLは何処ですか?
ファイル入出力系のモジュールをVBのコンテンツで
公開してますが無かったことに、ってことは
見つけられたんでしょうか?
それとも、別の方法が見つかったんでしょうか?

> 読み出していくのはいいのですが、だんだん遅くなってきますね。
これはLoadResDataを何度も使っていると、ってことでしょうか。
どういう方法で読み出して何回ぐらい繰り返すと
どれぐらいの時間遅くなるのか、って情報がないと
コメントのしようがありませんが・・・。

編集 削除
α  2001-07-08 15:21:35  No: 74608  IP: [192.*.*.*]

すみません。

>ファイル入出力系のモジュールをVBのコンテンツで
>公開してますが無かったことに、ってことは

これなんですが、

>うえの二つは何を表しているのですか?

の打ち消しです。ごめんなさい。

たかみちえさんのURLを参考にして作りました。
この方法でやると徐々に遅くなっていきます。

Private Sub Command1_Click()
Dim byBuf() As Byte

'ファイル名はお好きに変えて下さい
    Open "C:\WINDOWS\Calc.exe" For Binary As #1
        
        ReDim byBuf(1 To LOF(1)) '変数を1番からファイルの大きさ(Byte)でまで再宣言
        Get #1, , byBuf 'ファイル番号1をbyBufへExport
  
    
    bar.Max = LOF(1) '進行状況のバーの最大値をファイルの長さに
    
    For i = 1 To LOF(1)
    
        If i <> 1 Then Text2.Text = Text2.Text & " " & Hex(byBuf(i)) 'i番目を読み出し、追加していきます。
        If i = 1 Then Text2.Text = Text2.Text & Hex(byBuf(i))
        
        If i = 1000 Then DoEvents '1000演算に一回自由を与えます。
        
        bar.Value = i 'バーの進行状態
        
    Next i
Close
End Sub

試してみてください。

編集 削除
こころ  URL  2001-07-09 00:27:43  No: 74609  IP: [192.*.*.*]

試したらフリーズしました。
テスト用にシンプルにつくってあるのだとは思いますが
重すぎです、これ。
テキストボックスへの代入をやめれば、なんとか動きますが・・・。
他にも色々と遅くなる仕組みが多すぎます。

っていうか、当初の目的はリソースの読み出しと
ファイルへの書き込みだったのでは?
何か、16進文字列への変換プログラムになってますが・・・。

んで、本題。
まさか、Test2の文字列をクリアしていないため
メモリ消費がどんどん増えて・・・ってことはないですよね?
1回終わるのに10秒前後かかるので、
何度もテストする気にはなれませんでした。

編集 削除
Say  2001-07-09 07:11:53  No: 74610  IP: [192.*.*.*]

参考までに一般論を・・・
1度しかやらない処理はループの外に出すべきです。
プロパティへの代入は変数より遅いので、必然性がなければ
ループ内では変数を使用すべきです。
さらに、Valiantは遅いので、Stringのほうがまし。
さらに自動変数のほうが一般にはやいです。
If i=1000 だと、ループ内で1回しかDoEvent発生しません。
strA = strA & strB のような文字列連結処理をやると、
内部ではそのつどヒープからメモリ取得して、ブロックコピー
してしまいます。配列のほうが速いかもしれません。

そもそもVBは文字列処理が死ぬほど苦手なので、
ループ内部分だけでもVC++でDLL作って、
VBからよびだしたほうがいいでしょう。
ポインタ使えば高速なプログラムくめます。
Cだとファイル入出力もメモリ処理もVBより得意なので、
全部VC++にしてもいいかもしれません。

編集 削除
Say  2001-07-09 10:30:47  No: 74611  IP: [192.*.*.*]

ちょっといじってみました(最低限しかいじってません)
うちのマシンで約45倍スピードアップしてます。

Option Explicit
Option Base 1
Private Sub Command1_Click()
Dim byBuf() As Byte
Dim i As Long                ' Longが一番高速
Dim lngLOF As Long
'Dim strBuf(10000) As String
'ファイル名はお好きに変えて下さい
Open CStr(Text1.Text) For Binary As #1
lngLOF = LOF(1)         'ループの判定に使うなら、変数に入れたほうが速い
ReDim byBuf(1 To lngLOF) '変数を1番からファイルの大きさ(Byte)でまで再宣言
Get #1, , byBuf 'ファイル番号1をbyBufへExport


ProgressBar1.Max = lngLOF '進行状況のバーの最大値をファイルの長さに
ReDim strBuf(lngLOF) As String  '文字列連結より配列代入が高速

For i = 1 To lngLOF
    strBuf(i) = Hex(byBuf(i))
    If i Mod 1000 = 0 Then DoEvents '1000演算に一回自由を与えます。
    ProgressBar1.Value = i 'バーの進行状態
    ProgressBar1.Refresh
Next i
Close
Stop
End Sub

編集 削除
α  2001-07-09 17:55:46  No: 74612  IP: [192.*.*.*]

すみません。
ミスが多すぎました、勉強し直します。

小さい所にも気を配らないといけないですね。

サンプル試してみました。
とても速く動いています。
ありがとうございます。今後も参考にしていただきます。

ところでバイナリの書き出しはどのようにすればよいのでしょうか。

編集 削除
こころ  URL  2001-07-09 20:24:23  No: 74613  IP: [192.*.*.*]

16進変換プログラムなら、昔つくったサンプルが
うちのページにおいてあったりします。
まぁ、興味があればどうぞ。
「BinaryToString」とかいう奴です。
変換テーブルを使っているので、それなりには速いです。
こういう変換処理ではテーブルを使用するのが一般的です。

上のサンプルではAPIを使用してファイルに書き出してますが
VBのファイル入出力を使用するなら
Putを使えばいいのでしょうか。
2,3回ぐらいしか使ったことないのであまり覚えてませんが
確か、Getと似たような使い方だったと記憶してます。

編集 削除
α  2001-07-10 17:26:50  No: 74614  IP: [192.*.*.*]

>うちのページにバイナリ書き出し用のモジュールもあるので
ごめんなさい。URLは何処ですか?

編集 削除
Say  2001-07-11 01:03:05  No: 74615  IP: [192.*.*.*]

こんなかんじ
intHandle = FreeFile
Open strSaveFileName For Binary Access Write As #intHandle
Put #intHandle, , strBuf
Close #intHandle

編集 削除
こころ  URL  2001-07-11 02:43:11  No: 74616  IP: [192.*.*.*]

> ごめんなさい。URLは何処ですか?
名前の横の[HomePage]からリンクが張られてますが・・・。
VB FRONTIERっていうのを選んでもらえばOKです。
一番下から2,3個目にあると思います。

編集 削除
α  2001-07-11 16:26:46  No: 74617  IP: [192.*.*.*]

参考にしていただきます。
ありがとうございました。

編集 削除