ようこそゲストさん

つーさのくーかん -再誕-

2006/01/26(Thr) Moon Goddessを640 x 480ウィンドウモードで!

はてブ 2006/01/26 9:23 ソフトウェア::Windows

DLL Injectionという手法に従って(ry

詳細は以下の記事とコメント欄参照。
DLL Injection

動かない! とかそういうときはお気軽にコメントお願いします。
解決できるとは限りませんが、原因について考えたいのでω
ソース同梱してるので、ツッコミも歓迎します、あぃ

2006.01.28 05:35 とりあえず Rev2 公開。結構必死orz

 Moon Goddess 640x480化プログラム 第二版
使い方。
 HSPDXFIX.dll をMGのフォルダに放る。
 → 元に戻したくなるかもしれない人は、バックアップをとっておくこと。
注意。
 ゲーム内でのフルスクリーン/ウィンドウモードが無効になります。
 → かわりにAlt+Enterを押すといつでもフルスクリーンとウィンドウを行き来できる(はず)。
おまけ。
 ExchangeXZ.txt という名前のファイルをMGフォルダに置くと、XキーとZキーが入れ替わります。
 → ちなみに、キーコンフィグなんていう面倒なモノは付けてません。悪しからず。

2006. 7. 5 ふっと思い出して追記。

動作には MSVCRT.dll と DBGHELP.dll が必要です。
普通に入ってるもんだと思いこんでいたのですが、そうでない場合もあるようで。
DLLが見つからないというエラーが出る方はその辺がインストールされているかどうかを確認してみてください。
大抵はVB6のラインタイムパッケージを入れれば一緒に入ってます。

ZIP Rev.2 ZIP Rev.2(for Babel)

1: Y+Y=M.H 2006年01月26日(Thr) 午後2時08分

こんにちは
表題の件、OKですよ!便利になって助かります
こちらからもこの記事へリンクを貼ってよろしいか許可をお願いしますm(_ _)m

ところで、ちょっと今夜当りまとまった時間がとれそうなので、Moon Goddessの640×480化をしようと思うのですが、

#undef redraw
#deffunc redraw int

について、教えてください。
#deffuncは当然モジュール内ではなくグローバルに宣言するのですよね?
何せ#deffuncは今までモジュール内でしか使ったことがなかったものですから・・・
で、この場合もintを取得するときは通常通り mref でいいんですよね?
それと、例えば#deffuncでパラメータをintにしていて、そこに数値型変数を指定しても上手くいくのですが、これってマズイことなんですか?やっぱり(変数)+0とかして数値化した方がいいのでしょうか?

#undef、今まで敷居が高く感じられ使ってこなかった命令ですが、こうやって新たな命令を覚え使っていくのはワクワクします。
処理速度的には極端に遅くなりそうな今回の『gzoom640×480』、つーささんの表題のヤツがあれば必要なさそうですが、モノは試しにとやってみたいと思います

2: つーさ 2006年01月26日(Thr) 午後6時59分

個別記事へのリンクに関しては、どの記事でも基本的にリンク可なので、そういうことでよろしくお願いします。

#deffunc abc@modulename とかやらない限りは、グローバルで定義されるので、どっちでも大丈夫です。
ただ、#undefはglobalエリアじゃないとうまく動かなかったような……。

intの取得はmref 0でOKです。
ただし、グローバルでmrefやった場合は、変数名の衝突が考え得るので、普通に#module内でいいと思います。

#deffunc int の int の引数に変数を指定した場合、
「変数の中身」が数値として渡されるだけですので。。
というか、単に数値型変数は単に数値として扱われます。
引数strで宣言したところに文字列変数を渡すのも同じです。
もちろん、intに対して文字列変数を渡せば当然型違いのエラー吐きますがω
# 数値型変数を数値化とか、意味不明な気が……ω

とりあえずはこういうところで。

3: Y+Y=M.H 2006年01月27日(Fri) 午前9時59分

#deffuncの引数はそういうことになってたのですね、安心しました!
でも結局640×480化はできませんでした・・・
redrawを使わないで描画している箇所が多数あり、修正には相当な手間がかかりそうなので・・・
始めからそういう設計にしとけばよかったなぁ
でも、次回作では640×480も視野に入れたプログラムをします!

ところで、動かないときは気軽にコメントを、ということで気軽のコメントさせていただきます。動かないです!
もしかして、本体と同じフォルダになければいけないのでしょうか?

4: hoshu 2006年01月27日(Fri) 午前11時48分

こんにちは。
私のところでも動かないので何でかなーと思ったら、
プロセス検索時の比較対象文字列の拡張子の文字がいっこ抜けてますω

あと、CreateRemoteThread、UNICODE APIを使っているので9xでは動きませんねぇ。

CreateRemoteThread等々を環境に応じてエミュレートするなり、Hook方法をかえるなりすれば、9x系も行けますが、まあ、あえてそこまでする必要もないでしょうか。

どっちでも動かす一番お手軽な方法はmgが動的に読み込むライブラリを置き換えるか、ファイルのImport Descripterを書き換えちゃうことですね。
後者はファイル改ざん検出機能を持つプログラムには通用しませんがω

5: つーさ 2006年01月27日(Fri) 午後2時39分

動かないってのをみての書き加えでしたがω

自分の環境では、逆に最後のeを書くと動かないのですよ、なぜか。
タスクマネージャでの表示名も.exで止まっていたので、モジュール名は16バイトの制限でもあるのかなと、勝手に思っていた次第です。

あれですね、HSPDXFIX.dllあたりを、上書きする仕様にすればまとめて解決、ってもんでしょか。
フルスクリーン化が死にますが、FIXと言う割になんか不具合多めで、自前実装した方がいいかも?

とりあえず、ご指摘くださった点につきまして、帰ったら直しますですω

6: つーさ 2006年01月28日(Sat) 午前5時35分

とりあえず直してみました。

7: Y+Y=M.H 2006年01月28日(Sat) 午前10時06分

お~!スゴイ!!
無事、640×480になりました!

残念ながらウチのマシンパワー(700MHz)ではノロノロでしたが・・・

描画は全て標準命令だからしょうがないですね

しかし、改めてスゴイと思いました。つーささんのこと。

8: つーさ 2006年02月04日(Sat) 午前2時15分

ダウンロードしたファイルが壊れているか、
ファイルのコピーのやり方を間違えているか、です。
ファイルを解凍すると、HSPDXFIX.dll, mg6402.txt, _ExchangeXZ.txt, src.zip という4つのファイルが出てきます。
このうち、HSPDXFIX.dllだけをMoon Goddessを解凍したにコピーしてください。

参考までに。
HSPDXFIX.dll 6144バイト CRC32:16258604

この辺見直してもだめな場合はまたコメントください。

9: Kn 2006年06月14日(Wed) 午後8時23分

こんばんは。
上の方と同じ状況なのですが、私の方でも
「hspdxfix.dllが見つかりません」というダイアログボックスが出て、
起動できません。

OSがWindows98なので、hoshuさんの書き込みの
UNICODE API周りが原因でしょうか?

10: つーさ 2006年06月14日(Wed) 午後9時14分

コメントありがとうございます。

Unicode API はRev2で殲滅済みで、
95以上で使用可能なAPIのみを使って作ってあります。
手元に98環境がないので何とも言えないのですが、
一応、「動いたよ」というご報告はいただいるので……。
いやはや、技術不足で申し訳ないのですが、ちょっとわかりません^^;

#独り言を言うと……
#大文字小文字を区別したり、、しないよなぁ。。
#元のDLLと同じ場所に置いてもらうんだから、
#たぶん、LoadLibraryは成功してるよなぁ。
#次のDLLの正当性チェックで弾かれるんだと思うのだけど。
#Exportの関数名と序数は元のDLLと同じだし。
#なんで弾かれるんだろう。はてなぁ……?


名前:  非公開コメント