「EnDlEss DREamER」ブログ

最近はunity5メインで活動中。以前はツクールRGSSネタなど。

§ RGSS講座09「Win32API」RGSS・RUBYバージョン

騒音の研究所 様 Win32API解説
http://blog.livedoor.jp/htmltag/archives/51109509.html

RUBYリファレンス
http://webcache.googleusercontent.com/search?q=cache:aL0CLtw13Y0J:www.ruby-lang.org/ja/old-man/html/Win32API.html+&cd=1&hl=ja&ct=clnk&gl=jp

Win32API一覧
http://codepanic.itigo.jp/win32.html

レジストリ関連
http://www.kt.rim.or.jp/~yuta/prog/win32/Registry/index.html

pack unpack
http://webcache.googleusercontent.com/search?q=cache:g30MRaYNYG0J:www.ruby-lang.org/ja/old-man/html/pack_A5C6A5F3A5D7A5ECA1BCA5C8CAB8BBFACEF3.html+&cd=3&hl=ja&ct=clnk&gl=jp



1.使い方


a = Win32API.new('dll名', '関数名', 引数, 戻り値)
a.call(引数)


という形で使う。

で、皆さんが戸惑う「引数」「戻り値」の「型」というのがある。

p : ポインタ(文字列も)
i : 整数(int)
l : 数値(long)ハンドルなども。
v : void


というのが引数・戻り値の基本。

a = Win32API.new('GuruGuruSMF4', 'GGS4CloseDevice', 'v', 'v')
a.call()


guruguruSMFモジュールで使っているAPI呼び出しの一例。
引数がvoid型なのでvを指定している。
返り値もvoidなので何も値は返ってこない。

a = Win32API.new("GuruGuruSMF4", "GGS4Stop", 'i', 'v')
a.call(1000)


これは、GuruGuruSMF4.dllの中のGGS4Stopという関数の引数がiを指定している。
コールする時に引数に1000を渡す。
この関数の引数は音楽を停止してフェードアウトする時間(ミリ秒)で1秒かけてフェードアウトする。




2.ポインタを渡す


引数はstrとかdwordとかなんだかint型とかあるけど、それっぽいのを指定してやるといい。
文字列は全てポインタ。

で、たまに出てくる「ポインタの領域を確保する」ということ。
引数に渡した領域にWin32APiでコールした関数がその引数に値を格納して返す。
ということをやっている。


a = Win32API.new("GuruGuruSMF4", "GGS4GetPlayerStatus", 'pi','v')
status_size = (1.size) * 5 # int型のサイズ
status_value = "\0" * 256 # ポインタ領域確保
a.call(status_value, status_size)
result = status_value.unpack("I5")
return result



上から順に解説。
GGS4GetPlayerStatus関数はポインタの領域とサイズの2つを引数にしていて
返り値はvoid・・・つまり返り値はない。
status_sizeはGGS4GetPlayerStatusの引数で構造体の要素の数。ようは配列の数。
status_value がポインタの領域を確保している。
で、コールをする。
status_value.unpack("I5")はWin32APIの実行によってstatus_valueに格納された値を変換しています。
この場合は、構造体の要素がint型の要素が5つなので"I5"という指定になっています。
resultには配列で値が格納されています。
これでRUBYで使えるようになります。

引数に何かの値が格納されて返る場合の関数はこうした方がいいと思います。



3.文字コード


何かのファイルを読み込んでメモリに保存する。
なんていう関数が結構あります。
そういった場合に陥りやすい罠。
それが文字コードです。

RGSSはUTF-8・ユニコードです。
Win32APIで入れる場合は「シフトJIS」なのです。
でないと読み込み時にエラーを吐きます。
変換するにはどうすればいいか??

RGSSにはNKFがあります。
なので・・・

str = NKF::nkf("-s", text)

でシフトJISに変換されます。
ちなみにUTF-8に変換の場合は・・・

str = NKF::nkf("-w8", text)

です。


NKF変換一覧。

-j JISコードを出力する。
-e EUCコードを出力する。
-s シフトJISコードを出力する。
-w -w8[0] -w16[BL][0] Unicode を出力する。
-w -w80 UTF8コードを出力する。(BOM無し)
-w8 UTF8コードを出力する。
-w16 -w16B0 UTF16コードを出力する。(Big Endian / BOM無し)
-w16B UTF16コードを出力する。(Big Endian / BOM有り)
-w16L UTF16コードを出力す る。 (Little Endian / BOM有り)
-w16L0 UTF16コードを出力する。(Little Endian / BOM無し)


4.最後に


Win32APIはRGSSで唯一外部DLLを読めます。
が、呼び出せるだけでそれをCみたく組み込んで使えるわけではないので
自分でラッパーを作成する必要があります。
今回のguruguruSMFもググってRUBY用のラッパーがあったので完成しましたが
結構、面倒な作業です。
若干のCとか型とかどーとかの知識が必要になってきます。
DLLを自作される方は神ですね。
私には全くできません。
今回は、特に2と3辺りの解説で苦労したのでやってみました。
何かの参考になればと思います。


2013/02/08/Fri 00:22:59  RGSS講座/CM:0/TB:0/
new スイフトRS交渉:中盤編 / MAIN / guruguruSMFモジュール公開! old

COMMENT

COMMENT POST

/
/
/
/



 
 内緒です♪

TRACK BACK

  この記事のURL:
   http://edlogtkool.blog36.fc2.com/tb.php/907-aeac00ab


MAIN
copyright © 2006 「EnDlEss DREamER」ブログ. All Rights Reserved.
Template by TAE-3rd☆テンプレート工房