ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 23:26

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




新しいトピックを投稿する  トピックへ返信する  [ 11 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2009年6月07日(日) 12:08 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
こんにちわ。

こちらのサイトが復帰したと聞いて、飛んできました。
ずっと一人で考えていたのですが、なかなか思うようにいかないので、質問させていただきます。

今回、プログラムAとプログラムBを用意し、

プログラムAで何かファイルを選択し、プログラムBに追加して、
プログラムBでボタンを押すとプログラムAで追加したファイルを取り出す

と言った、ファイルをまとめる感じのソフトを作成して見ようと思っています。
しかし、文字列追加は上手くいくのですが、ファイルの追加が出来ません。

ON ERROR RESUME NEXT様のコードを参考にさせていただきました。
http://msdn.microsoft.com/ja-jp/library/cc364849.aspx
上のサイトを参考にしたところ、UpdateResourceAの第二パラメータに更新するリソースのタイプを指定するようなのですが、
自由データを追加したいので RT_RCDATA を指定したのですが、無効な識別と出ます。
(RT_RCDATAの定義が24なので、Const RT_MANIFEST="24"としてみたのですが、書き込みは完了するのに、プログラムBが起動できなくなる)

すみませんが、どのように表記していけばいいのかをご教授お願いできないでしょうか。

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2009年6月08日(月) 10:02 
オフライン

登録日時: 2005年5月31日(火) 10:52
記事: 264
お住まい: 高知
引用:
> こんにちわ。
こんにちは
引用:
> こちらのサイトが復帰したと聞いて、飛んできました。
> ずっと一人で考えていたのですが、なかなか思うようにいかないので、質問させていただきます。
>

ご心配おかけしました。
と、言ってみる(笑
引用:
今回、プログラムAとプログラムBを用意し、
>
> プログラムAで何かファイルを選択し、プログラムBに追加して、
> プログラムBでボタンを押すとプログラムAで追加したファイルを取り出す
>
> と言った、ファイルをまとめる感じのソフトを作成して見ようと思っています。
> しかし、文字列追加は上手くいくのですが、ファイルの追加が出来ません。
>
> ON ERROR RESUME NEXT様のコードを参考にさせていただきました。

記事の最後に
引用:
ただ気を付けたいのは、実行中の自分には埋め込むことが出来ないという点です。
それと、既にアイコンなどのリソースがある実行ファイルにしか付け足せません。何故だかは分かりませんが。
と、あります。

ProgramB.exeには予めリソースが埋め込まれていますか?
私も試してみましたが、確かにリソースが埋め込まれていないアプリケーションには
リソースを追加できないみたいですよ。

あと、このプログラムを見る限り、
ファイル名をだけをアプリケーションに埋め込んでいるように見えますが、
ファイルの中身を埋め込むわけではないのですか?

引用:
> http://msdn.microsoft.com/ja-jp/library/cc364849.aspx
> 上のサイトを参考にしたところ、UpdateResourceAの第二パラメータに更新するリソースのタイプを指定するようなのですが、
> 自由データを追加したいので RT_RCDATA を指定したのですが、無効な識別と出ます。
使用中のABのバージョンが分からないので何ともいえませんが、
AB2.4以前はRT_RCDATAといった定数などは定義されていませんので
自分で定義する必要があります。

リソースタイプですが、これは実は何でも構いません。
※もちろん適切なタイプを選択するほうがよいのですが。。。

RT_RCDATAなどは予めよく使用されるリソースタイプをみんなで使いまわすことで
便利にしようというものなので、適当にプログラマが自分で
リソースタイプ名を付けてしまっても構いません。

ですが、自分で名前をつけた場合はLoadStringやLoadBitmapなどの
標準のリソース系関数ではProgramBから呼び出せなくなります。

もちろん、FindResourceと LoadResource関数を使って
対応するリソースを自分で呼び出すことは可能です。


通報する
ページトップ
投稿記事Posted: 2009年6月08日(月) 16:44 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
ご返信ありがとうございます。
引用:
ProgramB.exeには予めリソースが埋め込まれていますか?
私も試してみましたが、確かにリソースが埋め込まれていないアプリケーションには
リソースを追加できないみたいですよ。
自分も実験してみました。
iconリソースを含んだ物を使用しています。
引用:
あと、このプログラムを見る限り、
ファイル名をだけをアプリケーションに埋め込んでいるように見えますが、
ファイルの中身を埋め込むわけではないのですか?
はい、そうしたいのですが、やり方がいまいちわからないので質問させていただきました。
引用:
ABのバージョン
すみません、書き忘れていました。
ABの4.23.00を使用しています。

引用:
RT_RCDATAなどは予めよく使用されるリソースタイプをみんなで使いまわすことで
便利にしようというものなので、適当にプログラマが自分で
リソースタイプ名を付けてしまっても構いません。
なるほど。
では、RT_RCDATAは、どう定義してあるのでしょうか。
すみませんが、ご教授お願いします。

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2009年6月09日(火) 00:29 
オフライン

登録日時: 2005年5月31日(火) 10:52
記事: 264
お住まい: 高知
引用:
> では、RT_RCDATAは、どう定義してあるのでしょうか。
> すみませんが、ご教授お願いします。
それはMSDNに書いてある通り、RAW(生の)データです。
簡単に言えば文字列や数列ですので
コンパイル済みのプログラムなどのもこれに含まれます。
ビットマップを取り出されないように、わざとRT_BITMAPの変わりに
こちらにビットマップ配列を埋め込む場合もあります。


ファイルを埋め込む場合は、いろいろな方法があるので
下記の方法以外にもいろいろな方法があります。

1.まずGetOpenFileName関数でパスを取得
2.取得したパスでCreateFile関数を使ってファイルを開く
3.ファイルハンドルを使ってGetFileSize関数でファイルサイズを取得
4.ReadFile関数でファイルの中身をバッファに読み込む
5.UpdateResource関数でバッファの内容を書き込む
EX.文字列リソースでファイル名も一緒に書き込んでおくと便利


通報する
ページトップ
投稿記事Posted: 2009年6月13日(土) 23:53 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
たぶん、ファイルの書き込みは出来るようになりました。

今度は、プログラムBから取り込んだリソースファイルを取り出そうとしたのですが、
上手くいきません。

例えば、txtファイルを取り込んで、取り出すと0KB(空っぽ状態)で作成されてしまいます。
問題のコードです。

すみませんが、添削の方をお願いします

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2009年6月14日(日) 21:06 
オフライン

登録日時: 2005年5月31日(火) 10:52
記事: 264
お住まい: 高知
引用:
> たぶん、ファイルの書き込みは出来るようになりました。
>
> 今度は、プログラムBから取り込んだリソースファイルを取り出そうとしたのですが、
> 上手くいきません。
>
> 例えば、txtファイルを取り込んで、取り出すと0KB(空っぽ状態)で作成されてしまいます。
一応、ちゃんと書き込めているかは確認しておいた方がいいと思います。
exeファイルが大きくなっていることをしらべるか、
バイナリエディタで実際に書き込まれているか確認した方がいいでしょうね。

ざっと見た感じですが、
コード:
 	hResource=FindResource(hDLL,RT_MANIFESTID,RT_MANIFEST)
MSDNによるとFindResource関数の第一パラメータは
「リソースが入った実行可能ファイルを持つモジュールのハンドル」
となっていますので、ここに指定するのはLoadLibrary関数の戻り値ではなく
GetModuleHandle関数の戻り値です。
さらにMSDNには
「NULL を指定すると、現在のプロセスを作成するときに使われたイメージファイルに関連付けられたモジュールが使われます。」
とありますので、この場合はNULLを指定してもいいでしょう。

コード:
 	lResource=LoadResource(hDLL,hResource) 
ここもFindResource関数と同じく、第一パラメータはNULLでいいでしょう。


通報する
ページトップ
投稿記事Posted: 2009年6月14日(日) 21:32 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
引用:
ちゃんと書き込めているかは確認しておいた方がいいと思います。
確認したところ、お恥ずかしながら書き込めていませんでした・・・
ファイルサイズが変化していませんでした。

書き込みの処理 一応、ファイル名とファイルサイズを一緒にひっくるめてリソースとして保存しています。
読み出しのとき、ファイル名しか取得できていませんでした。
一応、このコードは自分の今使える実力の塊なのですが・・・
すみませんが、無知な自分に救いの手をお貸しください。
何度もすみません。

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2009年6月16日(火) 03:00 
オフライン

登録日時: 2005年5月31日(火) 10:52
記事: 264
お住まい: 高知
一応、動くものになっていると思いますので、ご確認を

いくつか気になったことがあるので確認を、


1.カレントディレクトリを格納した変数Dirは
コード:
    Dir=MakeStr(path)+"\"
と、すべきです。
以前のコードをコピーしたので現在は直されているかもしれませんが。
基本的にAB4.Xでは文字列と文字配列の足し算はできません。
Dir=path+"\"は計算できないわけです。


2.ファイルのバッファはファイルサイズ+1する必要はないです。
コード:
    buffer=malloc(fSize)
文字列の場合は終端NULLと呼ばれる方式になっていますので、
確保したい文字列+終端NULL文字用に+1する必要がありますが、
ファイルはそのようなことを考える必要はないです。


3.ファイルの中身をリソースに書き込む際は文字列に変換する必要はありません。
コード:
    Update=UpdateResource(IsUpdate,RT_MANIFEST,RT_MANIFESTID,MAKELANGID(LANG_JAPANESE,SUBLANG_SYS_DEFAULT),buffer,fSize)
バッファへのアドレスうをそのまま渡せばよいです。


4.数値型変数をLenすると変数の大きさが返ります。
コード:
    UpdateResource(IsUpdate,RT_MANIFESTSIZE,RT_MANIFESTSIZEID,MAKELANGID(LANG_JAPANESE,SUBLANG_SYS_DEFAULT),VarPtr(fSize),Len(fSize))
この場合、fSizeはLONG型なのでLen(fSize)は4[Byte]という結果が返ります。
なので,ファイルサイズが格納されている変数へのポインタを渡します。
こすれば4バイトの変数の中身をリソースへそのまま書き出すことができます。


5.ポインタをLenしても文字の長さを得ることはできません。
コード:
    UpdateResource(IsUpdate,RT_MANIFESTFILE,RT_MANIFESTFILEID,MAKELANGID(LANG_JAPANESE,SUBLANG_SYS_DEFAULT),FileName,Len(MakeStr(FileName)))
FileNameは文字配列なので[]を省略すると
先頭文字へのアドレスを指し示すポインタとして機能します。
ですので,Len(FileName)の結果は4Byteになるおそれがあります。
※もしかしたらちゃんと動いてしまうかもしれませんが避けるべきです。
FileNameをMakeStrをかまして文字列にしてからLenで文字の長さを取得します。


通報する
ページトップ
投稿記事Posted: 2009年6月20日(土) 14:18 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
書き込み、出来ました。
きちんとサイズが変化しました。

ただ、ファイルを取り出すとき、どうしても0KB(空っぽ状態)で作成されてしまいます。
そして、mp3等のファイルを取り込むと、CreateFile関数で、エラーが返って来ます。

FindResource関数の第一パラメータをNULLにしても同じ動作になります。
これはやはり、根本的に間違っているのでしょうか。

すみませんが、ご教授ください

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2009年6月21日(日) 19:38 
オフライン

登録日時: 2005年5月31日(火) 10:52
記事: 264
お住まい: 高知
引用:
> 書き込み、出来ました。
> きちんとサイズが変化しました。
それはよかったです。

引用:
> ただ、ファイルを取り出すとき、どうしても0KB(空っぽ状態)で作成されてしまいます。
> そして、mp3等のファイルを取り込むと、CreateFile関数で、エラーが返って来ます。
0KB → ちゃんとFILEをLoadResourceしてますか?
mp3 → こちらの環境では問題は発生していません。

引用:
> FindResource関数の第一パラメータをNULLにしても同じ動作になります。
> これはやはり、根本的に間違っているのでしょうか。
動くコードを載せておきます。
問題と思しき点にコメントを入れておきました。


通報する
ページトップ
投稿記事Posted: 2009年6月23日(火) 18:24 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
ありがとうございます。
出来ました。

お付き合いありがとうございました

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


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

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


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot], Bing [Bot], Google [Bot] & ゲスト[28人]


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

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