重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

RubyでWin32APIのCreateWindow
初めまして。RubyでWin32APIを使ってプログラミングをしようとしています。
RubyもWin32APIも勉強を始めて間もないのですが、RubyリファレンスマニュアルのWin32APIのページやグーグル検索などを利用し一通り調べて

(test.rb)
require 'Win32API'
createwindow = Win32API.new('user32', 'CreateWindow', %w(l p l i i i i l l l p), 'l')
createwindow.call(0, "HELLO", 0xc00000, 100, 100, 100, 100, 0, 0, 0, nil)

としてみました。しかしエラーで、
test.rb:2:in `initialize': GetProcAddress: CreateWindow or CreateWindo
wA (RuntimeError)

となりました。
rubyのバージョンは
ruby 1.8.6
です。

コードのどこが間違っているのか、エラーの意味、参考になるwebサイト(rubyでWin32APIのCGIを扱っているサイト)を教えていただきたいです。

よろしくお願いします。

A 回答 (2件)

Rubyは触ったことありませんので細かいところは不明ですが…


Dependency Walkerでuser32.dllを見ると…CreateWindowAという関数はエクスポートされていません。
つまり、そんなAPIは存在しません。
# Dependency Walkerはフリーで入手可能です。

WindowsSDKをインストールしてヘッダファイルを確認すると…
CreateWindowはCreateWindowExでdefineされています。
# user32.dllにCreateWindowExはエクスポートされています。

ということで、CreateWindowExでWin32API.newすればよいのではないでしょうか。
# 第1引数にWndExtraのサイズを指定する必要があるようです。
# CreateWindow()では0を指定していることになっています。

しかし…コモンコントロールならともかく、それ以外のウィンドウだったとしてウィンドウプロシージャはどうなるんでしょうかね?
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

さっそくCreateWindowExを使って試してみたところ、実行はできました!
戻り値が0(エラー)で画面は表示されませんが。。。

createwindow = Win32API.new('user32', 'CreateWindowEx', %w(l p p l i i i i l l l p), 'l')
p createwindow.call(0, "fff", "HELLO", 0xc00000, 100, 100, 200, 200, 0, 0, 0, nil)



ウィンドウプロシージャもウィンドウプロシージャ専用のインスタンス作ってコールバック関数のProcを渡す感じなのかなーって漠然と考えてるんですが・・・わかりません。

hinstanceに何を渡していいのやら・・・


もう少し試行錯誤してみたいと思います。参考になりました。

お礼日時:2010/08/03 15:13

私もRubyをよく知らないので参考までに。



CreateWindowExが失敗する理由はGetLastErrorを使えばわかるはず。
あとhInstanceに渡すのはGetModuleHandle(NULL)の戻り値でいい気がする。

この回答への補足

とりあえずウィンドウ作成できたので、ブログにまとめてみました。
http://infosc.blog104.fc2.com/

誰かの参考になればと思います。

補足日時:2010/08/04 16:47
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
おかげさまでウィンドウを表示させる事が出来ました!
GetLastErrorがとっても便利でした。

お礼日時:2010/08/04 16:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!