• ベストアンサー
  • 困ってます

RubyでWin32APIのCreateWindow

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を扱っているサイト)を教えていただきたいです。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数911
  • ありがとう数9

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1
  • Wr5
  • ベストアンサー率53% (2177/4070)

Rubyは触ったことありませんので細かいところは不明ですが… Dependency Walkerでuser32.dllを見ると…CreateWindowAという関数はエクスポートされていません。 つまり、そんなAPIは存在しません。 # Dependency Walkerはフリーで入手可能です。 WindowsSDKをインストールしてヘッダファイルを確認すると… CreateWindowはCreateWindowExでdefineされています。 # user32.dllにCreateWindowExはエクスポートされています。 ということで、CreateWindowExでWin32API.newすればよいのではないでしょうか。 # 第1引数にWndExtraのサイズを指定する必要があるようです。 # CreateWindow()では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に何を渡していいのやら・・・ もう少し試行錯誤してみたいと思います。参考になりました。

関連するQ&A

  • Win32APIを始めたのですが・・・。

    Window Handleについての質問です。Win32APIではCreateWindow()でチェックボックスを作ることが出来るのですが、 C++でプログラミングしていたところ、困ったことになりました。 まず、クラスのメンバーとしてHWND m_Hwndを宣言し、メンバー関数(CreateChk())において m_Hwnd = CreateWindow(...)とし、WM_CREATEのメッセージ処理内で関数CreateChk()を呼び出して チェックボックスを作るようにしたのですが、WM_CREATEのメッセージ処理を終えると同時にm_Hwndの内容が意味を持たないものに 変わってしまい、チェックボックスの状態を利用することが出来ません。 変数の寿命に関係したものだとは思うのですが、クラスを用いたオブジェクト指向プログラミングも始めたばかりでよくわかりません。 どなたか対処方法をご存知でないでしょうか?

  • Win32APIのメッセージループについて。

    Win32API用のラッパーを作ろうとしているのですが、現在、前提条件としていることが正しいかどうかの判断がつきかねるため、質問させていただきます。 CreateWindow関数で返されるHWndは、どのような状況においても、メッセージループのコールバック関数であるWndProc関数の第一引数HWndと同一でしょうか? また、この値が一致しないときがあるとすれば、どういったときでしょうか? (たとえばhook関数を適用されたら値が変わってしまうのか?) 分かる方がいらっしゃいましたら、お願いいたします。

  • CreateWindowでSTATICコントロールを使ってBITMAP表示する。

    WIN32、VC++2005にて開発中です。 CreateWindowでSTATICコントロールを使ってBITMAPを表示する方法が分からなくて困ってます。 ウィンドウプロシージャのWM_CREATEで、 下記の様に書いてみたんですがダメでした。 CreateWindowW(L"Static", L"***", WS_VISIBLE|WS_CHILD|SS_BITMAP,120, 3, 100, 45, hWnd, HMENU(-1), NULL, NULL); ビットマップはIDB_BITMAP1という名前で追加してリソースビューで確認しました。 CreateWindowで表示させたいんですがいい方法ありますか? 初心者でアホなんでなるべく解り易くお願いします。

その他の回答 (1)

  • 回答No.2

私もRubyをよく知らないので参考までに。 CreateWindowExが失敗する理由はGetLastErrorを使えばわかるはず。 あとhInstanceに渡すのはGetModuleHandle(NULL)の戻り値でいい気がする。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

質問者からの補足

とりあえずウィンドウ作成できたので、ブログにまとめてみました。 http://infosc.blog104.fc2.com/ 誰かの参考になればと思います。

関連するQ&A

  • API

    use Win32::API; my $MessageBox = Win32::API->new("user32", "MessageBoxA", "NPPN", "N"); $MessageBox->Call(0, "Hello, World!\n", "Message", 0); #------------------------------ my $test = Win32::API->CreateWindowEx("user32", "MessageBoxA", "NPPN", "N"); #------------------------------ 以上の記述はXP(32bit)だと動いたと思うのですが、 7(64bit)だと致命的エラーらしきものが出るようになりました。 分かるかたいますか?

  • rubyのWatirでIEが起動しない。

    rubyのWatirでIEが起動しない。 こんにちは rubyをはじめて使ってみたものです。 自動化のためにWatirを使用したいです。 インストールは無事終わっていますが、サンプルプログラムを叩くと以下の様なエラーが出てしまいにっちもさっちも行きません。 IEも起動できません。 どなたか助けていただけると本当にうれしいです。 サンプルプログラム require 'watir' agent = Watir::IE.start "http://www.google.co.jp/" ruby.exe -コンポーネントが見つかりません msvcrt-ruby18.dllが見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールしなおすとこの問題は解決される場合があります。 C:/Ruby191/lib/ruby/gems/1.9.1/gems/windows-api-0.4.0/lib/windows/api.rb:1:in `r equire': 126: 指定されたモジュールが見つかりません。 - C:/Ruby191/lib/ruby/gem s/1.9.1/gems/win32-api-1.4.6-x86-mingw32/lib/win32/api.so (LoadError) from C:/Ruby191/lib/ruby/gems/1.9.1/gems/windows-api-0.4.0/lib/windows/a pi.rb:1:in `<top (required)>' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/windows-pr-1.0.9/lib/windows/er ror.rb:12:in `require' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/windows-pr-1.0.9/lib/windows/er ror.rb:12:in `<top (required)>' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/win32-process-0.6.2/lib/win32/p rocess.rb:1:in `require' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/win32-process-0.6.2/lib/win32/p rocess.rb:1:in `<top (required)>' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/watir-1.6.5/lib/watir/ie-proces s.rb:1:in `require' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/watir-1.6.5/lib/watir/ie-proces s.rb:1:in `<top (required)>' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/watir-1.6.5/lib/watir/ie.rb:45: in `require' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/watir-1.6.5/lib/watir/ie.rb:45: in `<top (required)>' from gui.rb:2:in `<main>' rubyのバージョンは C:\ruby>ruby -v ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32] です。 One-Click Ruby Installer for Windowsを使用してインストールしました。 watirは以下のURL通りにインストールしました。 gem update --system gem install watir http://www.sixapart.jp/techtalk/2008/06/watir_1.html OSはwindowsXP SP2です。 どなたか本当に助けていただけると感謝でいっぱいの気持ちになります。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • XPの頃のWin32APIの本などはまだ役に立つ?

    1999年頃学生でC言語を勉強し平行してC言語だとWindowプログラムが 作るのが大変だったことからVBも少しやりました。 頭が悪かったもので、その後、VC++6.0を使いWindowsプログラミングを 作る以前の段階で挫折し勉強の難しさに悶絶し病んで廃人となりニートをやっていました。 その後、なんとなくプログラミングに未練があり、Windows APIの本を買ったり JAVAの本を読んだりHTMLやVBS、CSSなどを勉強してみたりしましたが 途中でいつも投げ出して中途半端でした。 そして再び、最近、プログラミングの本を読む機会があり、 知り合いの友人に感化されたこともあり、 Rubyを勉強し始めたのですが、 Win32 API? RubyでWindowsプログラミングを作ることに特化した本が200円で売っていたので 2007年の本でしたが購入してみました。 Win32OLEについて解説してありました。 Rubyに関する知識がまだあやふやな部分があり、またCOMやAPIに関する知識も ???なのであまり理解できませんでしたが、 なんとなく雰囲気のさわりのさわりぐらい分かりました。 とりあえず、昔は頭が悪く非常に精神的にも混乱していて よくわからずなんでも取り組もうとしてしまいました。 WEBページなどの処理をするにはHTMLのほかにDOM、CSSなどの知識 Java scriptなどの知識であっているでしょうか? ruby php phython perl などいろいろあるがこれは特性をみて自分がやりたい言葉のようなものなので 母国語を一つマスターすべきということは理解しました。 また、Windowsプログラミングを作るのであれば、 APIやCOMなどの知識があればいいのでしょうか? FLASHやActiveXのように現在お目にかからない仕様もあるのですが、 これらも内包していまでも学ぶ価値はあるのでしょうか? 出来ればでいいのですが、 安く仕入れられるプログラミング書籍でも活用が可能な技術を 教えてください。 教えてくださいと言ってもC言語を覚えればOSだって作れるよとか アセンブラ覚えれば完璧ですとかそういうのは無しで 一般的なバカなおじさんがなんとなプログラミングを作るうえで知っていた方がいい 知識や導入方法、パーツなどを教えてくださいよろしくお願いします。 一応、今、RubyとVBS、CSS,HTMLを勉強しています。 DOMの知識はあまりないです?説明してみろといわれてもあやふやな答えしかできません よろしくお願いします。

  • ruby 1.9.3のrequireについて

    はじめまして。 私は今初めてrubyの勉強をしています。 使用している参考書はたのしいruby第3です。 ruby 1.9.3-P1.9.4でのrequireについて 今回質問させていただく内容としては requireを使用し外部ファイルを読み込もうとするとエラーになってしま.います。 同じディレクトリにファイルを置いています。 ディレクトリ構造として c:\workspaceの中にscopetest.rbとsub.rbをおいております。 scopetest.rb $x = 0 x = 0 require "sub" p $x p x sub.rb $x = 1 x = 1 実行コマンド ruby scopetestr.rb エラー C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- sub (LoadError) from C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:i n `require' from scopetest.rb:4:in `<main>' 参考書と同じにやっているのですがエラーがでてしまいます。 初歩的な質問かもしれませんがよろしくおねがいいたします。

    • ベストアンサー
    • Ruby
  • VC++でウィンドウを作る場合・・・

    えっと、VC++初心者です。 VC++でウィンドウを作るのに色んな方法があるようですが、 WIN32APIの Create関数(CreateEX関数含む)と CreateWindow関数(CreateWindowEX関数含む)の 使い分けの違いがよく分かりません。 どういったときにどちらを使うのがよいのでしょうか? どうぞ宜しくお願いします。

  • Cygwin RubyでのIE

    Cygwin上でRuby言語でInternetExplorerのプログラムを書いています 現在は 1、win32oleでIEを開く 2、プログラム内でhtmlでHPを作成し、IEで開く 3、2をプログラムを終了させるまで続ける といったものですが、2でURLを習得し、IEで開こうとすると新しい窓(ウィンドウ)が開いてしまいます。新しい窓(ウィンドウ)を開かずに、1で開いたIEを更新させたいです。 または、前に開いたページを閉じて、新たなページを開く。 win32oleやwin32APIなど、Cygwin上のRubyで使える方法ならいいので、ご存知の方いましたらお願いします。

    • ベストアンサー
    • Ruby
  • C言語とWin32APIで作成したボタンのデザインをXPの様に

    いつも、お世話になっております。 小生、只今C言語とWin32APIでアプリを開発中です。 そこで質問なのですが、親ウィンドウにCreateWindow関数を使用し、 ボタンを作成したところ、クラシックな角があるボタンが表示されました。 小生としては以下の条件でXPスタイルのボタンを作成したいのです。 ・オーナードローは使いたくないです(猫でもわかる~のWebサイトを閲覧したところ、アルゴリズムの改変をしないと処理に時間がかかると書いてありました。) サンプルコードが掲載されているWebサイト等はないでしょうか?? 出来れば、サンプルコードの方、宜しくお願い致します。 面倒な質問で申し訳ございません。 諸先輩方、ご教授の方、宜しくお願いします。

  • rubyにOCI8をセットアップ

    いつもお世話になってます。 rubyでOracle8のDBにアクセスしたいので、rubyのOCI8をセットアップしようと 試みているのですが、なかなかできません。 http://www.jiubao.org/ruby-oci8/index.ja.html からruby-oci8-0[1].1.9-mswin.rbを落とし、zlib解凍環境を整えてセットアップ まではこぎつけた?のですが、セットアップ完了するとrubyの環境にoci8.rbなどを コピーするようなのですがファイルサイズが0byteになっていて、うまくできてないようです。 そもそもこのやり方であっているのか?もわからず、試行錯誤を繰り返している状態です。。 どなたか、アドバイスいただけないでしょうか? 環境はWindows2000Pro (cygwinは入っておりません) ruby -v は ruby 1.8.2 (2005-02-01) [i386-mswin32] です。宜しくお願いします。

  • ActiveScriptRubyについて

    rubyそのものの質問でなくて申し訳ありせん。 WindowsにてActiveScriptRubyを使用しております。 http://www.geocities.co.jp/siliconvalley-PaloAlto/9251/ruby/ の記述にて、「できること」に「WScript, CScriptからのRubyスクリプトの実行」とあったので試してみたのですが以下の様なエラーが出て動作しません。 Win XP 2台、Win Vista 1台で試しましたが同じ結果となりました。 http://www.artonx.org/data/asr/ から Ruby-1.9.3-p125.msiをインストールして、%ruby_install_dir%\binにパスを通してrubyを使用しておりますが、CScript(或いはWScript)からrubyを動作させるには他に何か設定が必要なのでしょうか? お解りになる方がいらっしゃいましたらご回答をお願い致します。 コマンドプロンプトから実行しています。 D:\ruby>ruby -v ruby 1.9.3p125 (2012-02-16) [i386-mswin32_100] D:\ruby>ruby hello.rb ←これは普通に動作します。 D:\ruby>cscript hello.rb Microsoft (R) Windows Script Host Version 5.7 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. 入力エラー: ファイル拡張子 ".rb" を持つスクリプト エンジンはありません。 D:\ruby>wscript test.rb ←同じエラーのメッセージウィンドウが出ます。

    • ベストアンサー
    • Ruby
  • Net::HTTP#get関連

    楽しいRuby第4版で、Net::HTTPクラスを使ってRubyのホームページのHTMLを取得しコンソールに出力するというプログラムlist 8.13についてなんですが、 require "net/http" require "uri" url = URI.parse("http://www.ruby-lang.org/ja/") http = Net::HTTP.start(url.host, url.port) doc = http.get(url.path) puts doc と、記載通りに打ち込んで走らせても C:Ruby21/lib/ruby/2.1.0/net/http.rb879:in `initialize': no implect conversion of nil into String (TypeError)  from C:/Ruby21/lib/ruby/2.1.0/net/http.rb:879: in `open'  from C:/Ruby21/lib/ruby/2.1.0/net/http.rb:879: in `block in connect'  from C:/Ruby21/lib/ruby/2.1.0/net/timeout.rb:76:in `timeout'  from C:/Ruby21/lib/ruby/2.1.0/net/http.rb:878: in `connect'  from C:/Ruby21/lib/ruby/2.1.0/net/http.rb:863: in `do_start'  from C:/Ruby21/lib/ruby/2.1.0/net/http.rb:858: in `start'  from C:/Ruby21/lib/ruby/2.1.0/net/http.rb:583: in `start'  from http_get.rb:4: in `<main>' というエラーメッセージが出てしまいます。 いったいどうすればいいでしょうか?