メモ

覚書です

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

windresとResource Hacker

2008-11-20 03:29:03 | MinGW
今更ながらwindresで日本語が扱えるらしいので、少し使ってみる。

windres -i japanese.dll -O rc -o japanese.rc
などとして作成したリソーススクリプトが、
windres -i japansese.rc -O res -o japanese.res
とするとsyntax errorとなりました。

どうも
COMBOBOX "",
EDITTEXT "",
LISTBOX "",
などがwindresでは扱えないらしい。

ということで、修正してみました。

#他の方が作成したリソースを扱う場合、著作権やライセンス、使用条件などを確認した上で問題ない範囲でやってくださいね。


☆その1 windresでリソーススクリプトを出力した場合
●「COMBOBOX "",」などを「COMBOBOX 」として一括変換してみる。
●CONTROL "List1", , "SysListView32", , , , , , , , 0 -> 最後のパラメータ,0を削除。
●CTEXT、LTEXT、STRINGTABLEのテキストが改行されている箇所を\nに修正し一行に。
●テキスト内で"を表示させてる箇所を""に修正。
●「数字 STRINGTABLE」を「STRINGTABLE」に修正。

unrecognized escape sequenceは無視。
syntax errorがなくなり、コンパイルが通るようになった。
windres -i japansese.rc -O coff -o japanese.o

windres -i japansese.rc -O res -o japanese.res
だとエラーがでて、すべて書き出されない。
●「ソ"」などを「ソ\"」などと一括修正。
●「・」に見えるゴミもあった。削除。

windres -i japansese.rc -O res -o japanese.res
コンパイルが通るようになった。

チェックしてみると、
●STYLEのVISIBLEがfalseのものまで表示されていた。
一行目に#include <windows.h>を追加して、| NOT WS_VISIBLEでスタイルを修正。

これで一応OK。
作成したリソースファイルjapanese.resを使って、Resource Hackerの「アクション」-「すべてのリソースを更新する」で更新。


☆その2 Resource Hackerでリソーススクリプトを出力した場合
Resource Hackerを使ってDLLからrcファイル(リソーススクリプト)を出力してみました。(アクション-すべてのリソースを保存する)

そのままwindresを使ってみると。
LANGUAGE LANG_JAPANESE, 0x1
でwindresがエラーをはきます。
一行目に#include <windows.h>を追加します。

#define BUTTON 0x80
#define EDIT 0x81
#define STATIC 0x82
#define LISTBOX 0x83
#define SCROLLBAR 0x84
#define COMBOBOX 0x85

も追加。windres.hから持ってきた。

/* Control classes. These can be used as the ID field in a struct
dialog_control. */

#define CTL_BUTTON 0x80
#define CTL_EDIT 0x81
#define CTL_STATIC 0x82
#define CTL_LISTBOX 0x83
#define CTL_SCROLLBAR 0x84
#define CTL_COMBOBOX 0x85


●「\"」は「""」に一括修正。
●「VALUE "", 0xXXXX 0xYYYY」を「VALUE "", 0xXXXX ,0xYYYY」とする。
●「ソ"」などを「ソ\"」などと一括修正。

ここで一度コンパイルしてみる。
unrecognized escape sequenceはその1と同様無視。

windres -i japanese.rc -O coff -o japanese.o
windres -i japanese.rc -O res -o japanese.res
どちらもOK。

チェックすると、オリジナルにないのにタイトルバーがある。WS_CAPTIONスタイルが設定されているようだ。
CAPTION ""という行があることが原因みたいなので一括削除。

タイトルバーがあるもので文字化けしている。CAPTIONの言語を認識してくれないみたい。
windres --language=0411 -i japanese.rc -O coff -o japanese.o
とするといいらしい。文字化けしなくなった。
winduni.cをのぞくとlanguageで指定する値とコードページの関係がわかるらしい。
0x0411でも同じ結果だった。
というより、その1で文字化けしなかったのだから、--languageオプションは不要のはず。
結局MENUとかDIALOGとかの項目ごとにLANGUAGEが指定されていたのを、全体に適用されるように「LANGUAGE LANG_JAPANESE, 0x1」を2行目に追加。
これでオプションなしでOKになりました。

その1と同様にVISIBLEがfalseなスタイルも表示される状態だったので、適宜WS_VISIBLEを削除して、| NOT WS_VISIBLEを追加。
これで一応OKでした。


☆その1とその2を比較
windresでリソーススクリプトを出力すると、一部ゴミがでた。
この点を考えると修正はResource Hackerのほうが楽な感じ。
一括置換もしやすかった。
リソースにアイコンファイルなどが含まれる場合、windresだとアイコンのバイナリデータらしきものがrcファイルに埋め込まれるが、そのままだとコンパイルできない。
Resource Hackerだとアイコンを別ファイルに書き出してくれるのでコンパイルが楽でした。


☆そのほか
残念ながらwindresやResource Hackerではリソースを取り出せないファイルがありました。
アイコンのつまったDLLで遭遇しました。16bit実行ファイルなのかな。あとiclファイルとかもそのままだと無理ですね。
他ソフト(シェアウェアなど)では取り出せます。
とりあえずフリーのツールで対応できないか調べてみました。

TGTSoft ResEditを使うと今回のケースでは対応できました。

ResEditで該当DLLを開き、Save Asで適当な名前で保存。(16bitから32bit実行ファイルに変換される?)
保存したファイルをResource Hackerで開き「すべてのリソースを保存」ができました。

ただ上のその1、その2でテストしたファイルをResEditで保存してみると、String Tableが文字化けしていました。Dialogは大丈夫でしたがやMenuも化けました。
日本語の扱いに難があるようです。
どうもencoding='ISO-8859-1'固定のようです。修正したXMLファイルで置き換えても、Saveすると無視されました。
ResEditで開いた時点では*ほぼ*化けていないし(XMLだから&や"などがHTMLエンティティになってたけど)保存もできるので、それを加工して置き換えればOKといえばOK。
ただすべては無理っぽい。一部表示さえできないリソースがありました。
まぁ、いまどきアイコン以外で16bitのDLLにリソースを埋め込んでるケースってなさそうだしいいかな。
どうしても必要にせまられたら有料のソフトを使えばいいね。


☆最後に脱線(アイコンファイルをDLLにまとめてみる)(Msys、MinGWがあること前提)
複数のアイコンファイルを書庫で固めて配布されている場合など
書庫を展開してアイコンファイルを取り出した後、

find . -name "*.ico" | awk '{print NR" ICON \""$1"\""}' > icon.rc
windres -i icon.rc -O coff -o icon.o
gcc -s -shared -o icon.dll icon.o (kernel32.dllやmsvcrt.dllがリンクされるけど)

ld -s -o icon.dll icon.o でも一応使えたけど、自信なし。

#配布されているアイコンの著作権やライセンス、使用条件などを確認した上で問題ない範囲でやってくださいね。

アイコンライブラリ(icl)も上で紹介したResEditでResource Hackerが読み込める形式にするか、アイコンを変換してくれるツールを利用してicoファイルに出力すればDLLにできますね。
ところでフルカラーアイコンを探していたら、拡張子はicoだけど実はBMPというファイルに出会いました。
フォルダのアイコンとしては、そのまま使えたけど、、、。BMPでも使えるんですね。
アイコンファイルに一括変換してDLL化してみましたが、24bits(2^24)の色数でも問題なく扱えました。
といっても32*32で全ピクセル違う色にしたとしても1024色なんだけどね^^;

おしまい。
『ソフトウェア』 ジャンルのランキング
コメント   この記事についてブログを書く
この記事をはてなブックマークに追加
« スーパー牛さんパワー(aptitude... | トップ | UTF-8のBOMとシェルスクリプト、... »

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。

あわせて読む

トラックバック

この記事のトラックバック  Ping-URL
ブログ作成者から承認されるまでトラックバックは反映されません。
  • 送信元の記事内容が半角英数のみのトラックバックは受け取らないよう設定されております。
  • このブログへのリンクがない記事からのトラックバックは受け取らないよう設定されております。
  • ※ブログ管理者のみ、編集画面で設定の変更が可能です。