【ActiveScript】RubyをWindowsで使うスレ【GUI】

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2006/08/08(火) 19:08:09
他プラットホームとの互換性なんかいらん!
漏れはWindowsの上だけで快適に使いたいんだ!
Windows独自の技術的な話題や、
Windows版だけのrubyの問題について語るスレ。

■ruby
 http://www.ruby-lang.org/ja/

■ruby関連スレ
 ・Rubyについて Part 22 (本スレ?)
  http://pc8.2ch.net/test/read.cgi/tech/1147897915/
 ・Ruby初心者スレッドPart7
  http://pc8.2ch.net/test/read.cgi/tech/1154077799/l50

2011/03/02(水) 11:58:46.15
>>758
全部にあるかは知らないけど、rubyw.exe ってない?
cygwin版だけだったかなぁ…
760758
垢版 |
2011/03/03(木) 06:21:41.99
>>759
ありがとうございます。rubyw.exeを知らなかったので試してみました。
たしかにrubyw.exeによって走らせるrubyスクリプト自体のコマンドプロンプトは出なくなりました。

ですが、相変わらずrubyw.exeから呼び出されている
`コマンド内容` や system("コマンド内容")
からはコマンドプロンプトが開いてしまいます。
なんとかこれを開かずに済む良い方法はないでしょうか。
761デフォルトの名無しさん
垢版 |
2011/03/03(木) 15:02:43.14
ViualuRubyのVRListviewで
フォーカスが外れた状態でも、選択している項目の色を反転させたままにしておく方法はないでしょうか?
VRListviewで実行する項目を選択するようにしているのですが、
フォーカスをGUI内の別のアイテムに移すと、VRListviewでどの項目を選択したか分からなくなります。

C++のMFCでいうところのAlways Show Selectionをtrueにするのと同じ処理をさせたいのですが。
2011/03/03(木) 20:55:54.27
>>760
require 'win32ole'
shell = WIN32OLE.new('WScript.Shell')
shell.Run("cmd /c dir /b /s 2>&1 > dir.txt", 0, true)

これでウィンドウが開かなくなるとは思う
出力をファイルハンドルで受けられないのが不便だが
763760
垢版 |
2011/03/04(金) 06:15:50.66
>>762
出来ました! ありがとうございます。
764761
垢版 |
2011/03/07(月) 17:39:04.42
どなたか、よろしくお願いします。 >>761
VRListViewの一覧からファイル選択して、それからオプション項目を設定してもらいたいんですけど、
オプション項目を設定するときに、どのファイルが選択されているか分からなくなるので困ってます。
2011/03/10(木) 15:06:21.98
スタイルにLVS_SHOWSELALWAYSを加える
766761
垢版 |
2011/03/10(木) 19:32:21.32
>>765
ありがとうございます
767デフォルトの名無しさん
垢版 |
2011/03/10(木) 19:44:00.60
VisualuRubyで、読み込んだ画像の上から(上位のレイヤーみたいな感じで)
線で加工する範囲を指定したいのですが、良いサンプルはないでしょうか?
とりあえず、VRCanvasPanelで(VRBitmapPanelのように)
画像ファイルを読み込ませられないかなと調べているのですが、やりかたが分かりません。。
2011/03/11(金) 09:07:22.88
むり
2011/03/11(金) 23:49:14.12
IronRubyで何が不満なん?
770767
垢版 |
2011/03/12(土) 13:36:22.18
うーむ。そうですか。IronRubyを調べてみます。
2011/03/12(土) 14:07:37.15
何でそこまでRubyにこだわるかねー
C#なら何でもできるのにw

ライブラリの仕様が標準化されていない
バグだらけの糞Rubyなんてやる気せんわw
2011/03/13(日) 02:48:45.20
>>771
環境の問題でしょ。
C#使ってるとバカになるよ。
2011/03/13(日) 03:32:28.66
お前みたいなバカだとな
2011/03/13(日) 04:21:14.39
もうmicrosoftには未来が無いし
C#なんぞに手を出すならObjectiveCの方が良くね
2011/03/13(日) 04:29:56.54
シェア1%のRuby信者は言うことが違うなぁww
2011/03/13(日) 07:01:24.13
バカがそれ以上バカになるとはどういうことだろう
2011/03/14(月) 22:29:48.50
スレチ
Rubyアンチスレでも逝け
778デフォルトの名無しさん
垢版 |
2011/03/23(水) 14:27:27.24
VisualuRubyで、ウィンドウサイズを固定する方法を教えてください。
よろしくお願いします。
779778
垢版 |
2011/03/24(木) 14:13:01.97
self.w = 816; self.h = 628
として固定したまま変更を許可しないようにしたいのですが。。
2011/03/27(日) 19:35:21.81
暇だったんで調べてみた
どうも、VisualuRubyを使いこなすにはWinAPIの作法を勉強しないとだめみたいですな
WindowStyleってので「リサイズできる枠」とかのフラグがあるのでそれをオフにするといいようだ
require 'vr/vruby'
frm=VRLocalScreen.newform
frm.move 100,100,300,300
frm.caption="サイズ固定Window"
frm.style= frm.style ^ WStyle::WS_THICKFRAME ^ WStyle::WS_MAXIMIZEBOX ^ WStyle::WS_MINIMIZEBOX
frm.create.show
VRLocalScreen.messageloop
781778
垢版 |
2011/04/03(日) 21:19:01.21
>>780
できました。ありがとうございます!
お礼が遅くなって申し訳ないです。

>どうも、VisualuRubyを使いこなすにはWinAPIの作法を勉強しないとだめみたいですな
はい、精進します。
782デフォルトの名無しさん
垢版 |
2011/04/03(日) 22:32:20.48
WinAPI絡みの質問なのですが、
vrubyによるダイアログによるファイル指定で、以下のように単一の拡張子PDFのファイルを表示するだけでなく、
  file = openFilenameDialog [ ['pdf', '*.pdf'] ]
複数の拡張子による絞り込みはできるんでしょうか?たとえばPDFとZIPのみを表示したいのですが。
よろしくお願いします。
2011/04/04(月) 00:04:19.38
vrubyは知らんけど、WinAPI的には
file = openFilenameDialog [ ['pdf', '*.pdf'], ['zip', '*.zip'] ]
もしくは
file = openFilenameDialog [ ['pdf/zip', '*.pdf;*.zip'] ]
を試してみたら?
784782
垢版 |
2011/04/04(月) 00:57:24.56
>783
とても助かりました。ありがとうございます。
785デフォルトの名無しさん
垢版 |
2011/04/07(木) 01:54:29.84
vrubyについて教えてください
  path = saveFilenameDialog([["*.pdf","*.pdf"]])
のように開くときに、
デフォルトで開かれるフォルダの初期位置を変えることはできるのでしょうか?
ついでにファイル名も与えたいのですが。。よろしくお願いします。
786デフォルトの名無しさん
垢版 |
2011/04/09(土) 02:59:56.94
Twitter、検索結果表示が“3倍速く”なったと発表――フロントエンドの切り替えで
Twitterは、フロントエンドをRuby on RailsからBlenderに切り替えた結果、検索結果の待ち時間が大幅に改善されたと発表した。

http://www.itmedia.co.jp/news/articles/1104/07/news043.html
-----------------
急成長する検索ニーズに対処するために検索エンジンを書き換え、リアルタイム検索エンジンを立ち上げた。
その際にバックエンドをMySQLからJavaベースのテキスト全文検索エンジンLuceneに移行した。
また先週、フロントエンドをRuby on RailsからBlenderと呼ばれるJavaサーバに切り替えた。
待ち時間の短縮は、こうした取り組みの成果だという。
2011/04/09(土) 12:27:34.96
まるち
2011/04/09(土) 14:13:52.93
はわわ
2011/04/20(水) 17:30:01.97
Windows版Ruby1.9.0〜1.9.1のRuby/Tkは
起動したときに何も無いウィンドウが表示されてから
ウィジットが配置されていくのが見えるという変な動作だったけど
1.9.2になってスパッとウィンドウが表示されるようになった
Ruby1.9でネイティブスレッド化したのが原因だったのかな

Windowsではファイルを読み込むときにテキストモードだと
ユニバーサル改行変換のせいで遅かったのが
1.9.2でかなり速くなった
それでも1.8よりは遅くなるけど

ところでMacの世界では今でも改行がCRなんだろうか
そうならばCRとLFの変換とかするのかな
それともMac界も改行がLFになってるのかしら?
2011/04/20(水) 17:40:27.93
>>789
OSXになった時点でUNIXになったので基本的にLFよ。
791デフォルトの名無しさん
垢版 |
2011/04/22(金) 16:38:11.26
gem install opencv -- --with-opencv-include=C:\OpenCV2.2\include;C:\Program Files\Microsoft SDKs\Windows\v7.1\Include
と設定したいのですが
mkmf.logでは、-IC:\apps\OpenCV2.2\include -IC:\Program となってしまっていて、パス設定が途中で欠けてしまいます。
間にスペースが入る場合のパスの書式を教えてください。
ダブルクオートで囲むなどいろいろ試行錯誤しているものの、うまく行かず困っています。
2011/04/22(金) 21:35:55.77
>>791
たしかmswinにはショートネームってのがあるんじゃなかったっけ
dirコマンドを実行してみたら良いんじゃない
2011/04/23(土) 10:43:03.43
>>789
標準のターミナルとシェルで cat > hoge.txt して開いたら UTF-8/LF だった
2011/04/23(土) 15:47:05.43
>>791
"\"C:\OpenCV〜\""みたいにエスケープしてダブルクォートを二重にするんじゃなかったかな
上手くいかなかったらエスケープを適当に増減してみてくれ
795791
垢版 |
2011/04/23(土) 21:31:07.56
>>791
アドバイスありがとうございます。
>>794
とりあえず二重に囲むやりかたでうまく行ったように思います。ありがとうございました。
796791
垢版 |
2011/04/23(土) 21:35:51.73
>>795
>>791>>792氏でした。失礼しました。
2011/04/24(日) 17:18:33.89
1.9.2はいろいろと1.9.1よりよくなっているんだが
なぜだか Dir.globは遅くなっている
1.8や1.9.1より2倍遅い

うーむ
798デフォルトの名無しさん
垢版 |
2011/06/11(土) 02:03:50.24
VisualuRubyのVREditとフォーカスについて教えてください。
実現したいのはEditBoxにフォーカスした時にEditBox内を空にするということです。

VREditを継承したMyEditクラスで、
VRFocusSensitiveをincludeしました。

self_gotfocusメソッド内で text="" としたのですが、ダイアログ上の表示は変わりません。
メソッド内でputs text で出力させてみるとtextの内容は変わっているようです。

他に何か必要なのでしょうか。
あるいは、根本的に何かおかしいのでしょうか。

部分的ですが、コードは下のようになっています。

class MyEdit < VREdit
include VRFocusSensitive

def self_gotfocus
text = ""
puts text
end
end

class MyDialog < VRModalDialog
def construct
addControl(MyEdit, "number", Kconv.tosjis("数字を入力"), 90, 120, 200, 25, WStyle::WS_TABSTOP)
end
end
2011/06/11(土) 03:01:16.00
知らないけど、self.text = "" じゃないの?
800798
垢版 |
2011/06/12(日) 21:01:57.31
>>799
ありがとうございます。

self.text=""
で意図したとおりに動きました。

それにしてもselfかぁ、なんて恥ずかしい見落としを。
2011/06/29(水) 00:01:41.13
VisualuRubyで、
$frm=VRLocalScreen.showForm VRMainForm
$frmsub=VRLocalScreen.newform($frm,style,VRSubForm)

とかで複数生成したとき、$frm終了させたら$frmsubも終了するのは作れたんですけど
メッセージウィンドウを表示させた時の後ろのウインドウみたいに
$frmsubが表示されてる時$frmをクリックしても忠告音?を出して$frmsubを閉じるまで
行けなくするやり方わかりますか?
2011/06/29(水) 00:16:28.59
自己解決しました
$frm.enabled = false
でいけるのか・・・・・・
2011/06/29(水) 00:25:32.61
>>802
VisualuRubyは知らんが、そのやり方は間違ってる気がする

http://vruby.sourceforge.net/samples.html
の「モーダルダイアログを開く」あたりがお望みの機能じゃないかと思う
2011/08/01(月) 11:17:26.14
1.8.7は、win32.cのwinnt_statを直してくれんのかね
でかいファイルサイズ扱えないままなんだけど
2011/11/23(水) 21:15:41.01
rubyinstaller 1.9.3-p0 でrubyをインストールして、

File.chmod(0777, '日本語.txt')

とすると、

in `chmod': No such file or directory - (文字化け)txt (Errno::ENOENT)

となってしまいます(日本語.txtは実際には存在します)。
これ、1.9.2になってからずっとこのままなのですが、自分の環境だけでしょうか…?
スクリプトファイル上でcoding指定もしているので、指定間違いではないと思うのですが…
2011/11/24(木) 13:32:40.37
>>805
そのcodingに指定した文字コード名と、実際のコードの文字コードは一致してる?
2011/11/24(木) 21:06:56.97
>>806
文字コードはShift_JISで、スクリプトには
# coding: Windows-31J
と書いてます。

メニューから「Start Command Prompt with Ruby」でRuby用のコマンドプロンプトを開いて、
ruby -e "File.chmod(0777, '日本語.txt')"
としても同じです。

OSはWindows7 Ultimate 64bitです。
自分の環境だけなんでしょうか…。
2011/11/25(金) 19:29:53.31
>>807
WindowsXPのMingw版Ruby 1.9.3でも日本語が通りませんね

プログラミングは不得手ですが
Rubyのソースを追ってみると
パスをUTF-8に変換しているのにもかかわらず
それをSJISとみなしてUTF-16に変換しているように見えます

で、その文字化けしたUTF-16のパスをWindowsAPIに渡しているので失敗していると思われます

ユニコード版WindowsAPIに切り替えた際の、対応漏れのような感じです
7bitASCIIの範囲では問題が起こらないので気づかれなかったのでしょうか
2011/11/25(金) 21:43:25.18
win32/win32.cの5704行目を修正してコンパイルしなおしたところ
正常にFile.chmodできるようになりました

どなたかRuby開発者のRedmaineに報告してください
私はAnonymous Cowardなので無理です
810デフォルトの名無しさん
垢版 |
2011/11/25(金) 22:03:10.98
フリーメールの捨てアドレスで報告すれば?
2011/11/26(土) 01:11:50.23
ありがとうございます。そんなに簡単に追えるものなんですね。うらやましすぎる…というかプログラマのくせに自分がしょぼすぎる(´Д`)

自分の環境の問題でないことがわかっただけでも助かりました。気が向いたらアカウント取って報告します
(どなたかやってくださる奇特な方がいらっしゃいましたらやっていただいて構いません)
2011/11/26(土) 09:33:14.34
報告しなきゃ…と思ってアカウント取っていたらどなたかが報告してくださってた
感謝です!(゚∀゚)
2012/01/03(火) 09:31:48.12
プログラミングRubyのRubyベタボメっぷりにRubyを使い始めて早10数年、使えば使う程にRubyって駄目だなと痛感する
Rubyを学習し始めた頃は誰でもRubyは素晴しいと思うのだが、数年も使えばそのどうしようもない互換性のなさにウンザリする
しかも互換性が無くなることをマズいと思っていない集団がRubyを制作しているのでどうしようもない
1.4時代のコードが1.6になった途端に互換性がなくなり動かなくなることはあったが、1.6→1.8ではそれが顕著になり、1.9など何のエラーも出さずに前のコードが動く方が珍しいほど
それどころか1.9に行かずREEが海外ではデファクトになりつつある現状、そして始まるPlain RubyとREEの方言問題
例えばPassengerもREEの方がうまく動いたり、かと思えば特定のバージョンだとPlainじゃないとまともに動かなかったりと、とても面倒臭い

美しいコードを求める為の副作用、という名の互換性のなさはRuby界全体に蔓延していて
例えばあれだけもてはやされたRailsも、Rails2とRails3の互換性のなさに誰しも苦労したのは記憶に新しいところ
誰もが互換性のなさに辟易し、俺ライブラリを量産するため、gemで探すと似たような事をする終わったプロジェクトがわんさか引っかかる
諸処の小さなプロジェクトだけがそんな現状ならば許せるが、dbiアダプタでさえそんな現状なので
バージョンが変わるとデータベースにすら接続できなくなったとか、dbiのAPIバージョン変わったのにアダプタ側の更新ないな、
とか思ってるとアダプタ作者がRubyから足洗ってたとか余裕

身内同士でRubyはコードが美しいと四六時中自画自賛しているが、実はそれこそがRubyのガン
その美しいコードという名のオナニーの為に一体どれだけの互換性と人的リソースが失われていったことか
Rubyのコードは美しい、Railsスゲー、ベタボメする人は沢山いたがいつも一過性の人気しか得られないのはそこにあるし
ベタボメしていた人達もしばらくするとウンザリしてRuby界から消えてしまうのも原因は実はそこにある
達人プログラマーはRubyをベタボメしなくなったし、Mongrel作者はRailsどころかRubyに見切りをつけちゃったしね
ああいう熱狂的なRuby信者でもRubyから足を洗っているのを見ると、tDiaryがRubyに見切りつけてPythonで全部書き直したとか言われても驚かないだろう自分がいる
814デフォルトの名無しさん
垢版 |
2012/01/29(日) 14:26:32.76
Win7(64bit)で ActiveScriptRuby 1.9.3-p0 をインストールしましたが、
ActiveScript として動作しません。
ruby hoge.rb で実行できているものが、cscript hoge.rb だと

C:\>cscript hoge.rb
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

CScript エラー: スクリプト "C:\hoge.rb" のスクリプト エンジン "GlobalRubyScript" が見つかりません。

となり、GlobalRubyScript の登録がうまくいっていないような気がしますが、
Ruby-1.9.3.msi のインストール以外に何か作業は必要でしょうか?

XP(32bit)では同じことをやって正しく動いています。
2012/01/29(日) 15:30:48.91
>>814
同じ環境(win7 64bit)で、今1.9.2アンインストール=>19.3インストールしてみた
自分のとこだと、ActiveScript としては問題なく動作してるけど、
拡張子の関連付けだけができてないように見える
# cscript.exe, ruby.exe ともに .rb が関連付けされてない

作業が足りないというよりインストーラの問題に見えるけど、>>814と挙動が違うのが気になる
他の環境でも試してみるか
2012/01/31(火) 12:29:44.08
>>814
64ビット版cscript.exeが動いているんじゃね?
64ビット版からは32ビットActiveXコンポーネントは呼び出せないよ。
32ビット版(C:\Windows\syswow64\cscript.exe)で実行してみたら?
817814
垢版 |
2012/02/01(水) 23:45:40.64
>>816
あぁっ、そういうことでしたか。
32bit版cscriptで動作しました。どうもです。

やりたかったのは、Paper Plane xUI, 秀丸エディタから
rubyを使うことだったのですが、どちらも64bitアプリでした。
32bit版でrubyスクリプトが使えるようになりました。
2012/03/03(土) 08:50:23.56
Rubyの話と言うよりWin32OLE(COM)の話になるのですが
Excelの名前付き範囲を取得する方法ってありますか?
VBAだと

Range('name')

ってやるだけで取れるのですが、Win32OLEで取得する方法が分からない状態です。
2012/03/03(土) 18:06:24.07
>>818
同じように sheet.range("ほげ") とかで取得できるっぽいよ
名前が間違ってるとか文字コードがシフトJISじゃなかったとかいう落ちはないよね
2012/03/05(月) 10:10:36.79
それです
821デフォルトの名無しさん
垢版 |
2012/05/23(水) 16:08:32.35
あげ
822デフォルトの名無しさん
垢版 |
2012/08/10(金) 14:20:08.95
823uy
垢版 |
2012/08/15(水) 20:19:30.82
z
2012/08/29(水) 17:17:34.54
実行されているスクリプトファイルと同じディレクトリにあるスクリプトファイルを require したいとき
$LOAD_PATH.unshift File.dirname(File.expand_path __FILE__)
としますが、Cygwin 版 Ruby で ruby "D:/test/script.rb" として実行すると $LOAD_PATH に
"D:/test" が追加され、このときコロンがパスの区切りとして解釈されて require に失敗していしまいます。

$LOAD_PATH.unshift File.dirname((/-cygwin\z/ =~ RUBY_PLATFORM) ? `/usr/bin/cygpath -au "#{__FILE__}"`.chomp : File.expand_path(__FILE__))
とすると POSIX 形式のパスになりコロンが含まれないので require は成功しますが、外部プロセスを
呼び出すので遅くなってしまいます。

Win32API を使用して cygwin_conv_to_full_posix_path を呼び出せば外部プロセスをを呼び出す必要
はありませんが、スクリプトの作成で毎回このようなコードを書くのは面倒です。

みなさんはどのようにしていますか?
825デフォルトの名無しさん
垢版 |
2012/08/29(水) 20:48:59.18
1.9系: require_relative './hoge_lib.rb'
1.8系: require File.expand_path("hoge_lib.rb", File.dirname(__FILE__))
で良いのでなかろうか。
2012/08/29(水) 23:22:53.42
>>825
ありがとうございはした。確かにこれでできそうです。
require ではベース名しか指定できないものと勘違いしていました。
827デフォルトの名無しさん
垢版 |
2012/09/02(日) 17:02:16.34
WinでRuby 1.9環境にスイッチしようと思ったけど
kakasiがみつからない。
古いライブラリってメンテされなくなってるの結構みかけるね。
いまの代替品はなにかいいのある?
2012/09/03(月) 01:29:07.02
kokesi
2012/10/14(日) 23:16:19.16
1.9.3-p286
2012/11/11(日) 23:17:27.36
1.9.3-p327
2012/11/14(水) 06:14:34.19
おまえら最大化ボタンおしてる?
最大化ボタンって必要ないよな!
2012/11/23(金) 06:59:50.74
HTAアプリケーションから別のHTAアプリケーションにデータを送りたい時は
どうやればいいでしょうか?
2012/12/04(火) 05:17:34.54
>>830
Windows 2000でうごかないのですか?
なぜサポートしてくれないの?
2012/12/04(火) 05:19:16.34
Linux板より。
@インストールしただけで選民思想
Aやっていることはwindowsと同じ。しかもめんどくさくなっただけ。
Bコマンド打ち込んでプロだと勘違い
C新参に対して黙ってwindowsでも使ってろと間口を狭める
Dカーネルいじればいいだろと無茶を要求
Elinux開発者とのずれを認識できていない
Fwineを使うくせにlinuxを再現しようとする動きがあるとたたく
Gプログラミングできないのにソース要求する
H何でもオープンでないと、気に食わないエセ共産主義者
IWindowsユーザに馬鹿にされてることに気づいていない
JAndroidの事例をを引っ張り出して、「linuxは普及している」と虚勢を張る
KAndroidのセキュリティ問題を指摘されると、AndroidはLinuxではないと言い出す。
L結局普及してない点を指摘されると、「別に普及しなくていいよ」と思考停止
M三度の飯よりアップデートが大好き、コンパイルが大好き、カスタマイズ大好き
NOSを弄ることがゲームと化しているので、ゲームソフトが必要ない
2012/12/04(火) 08:42:33.24
>>833
ruby 1.9.3p327および cygwinの例(Windows 2000)

Administrator@computer_name ~
$ which perl
/cygdrive/c/Perl/bin/perl

Administrator@computer_name ~
$ which ruby
/usr/bin/ruby

Administrator@computer_name ~
$ ruby --version
ruby 1.9.3p327 (2012-11-10 revision 37606) [i386-cygwin]
2013/01/19(土) 00:08:13.48
1.9.3-p374
2013/01/21(月) 21:59:01.07
2.0.0-rc1
838デフォルトの名無しさん
垢版 |
2013/01/22(火) 00:25:24.59
dl2を使ったコールバックのWin向けのサンプルコードってどこかにありませんか?
リファレンスマニュアルのサンプルコードはunix向けだし、肝心のbindが書いていないし・・・
2013/01/22(火) 14:19:10.42
こんな感じとか

require 'dl/import'
require 'dl/types'

module CBTest
extend DL::Importer
dlload 'user32.dll'
include DL::Win32Types
typealias "LPARAM", "void*"
extern "BOOL EnumWindows(void*, LPARAM)", :stdcall
WNDENUMPROC = bind("BOOL EnumFunc(HWND, LPARAM)", :stdcall) do |hwnd, obj|
DL.dlunwrap(obj).call(hwnd)
end
end

CBTest::EnumWindows(CBTest::WNDENUMPROC, DL.dlwrap(proc {|hwnd| p hwnd; 1 }))
840838
垢版 |
2013/01/23(水) 07:52:41.60
ありがとう
>DL.dlunwrap(obj).call(hwnd)
のところで
>`dlunwrap': can't convert DL::CPtr into Integer (TypeError)
って出る・・・って調べていったら1.9だと通るけど1.8+dl2だとダメなのか
なんじゃそりゃ・・・orz
841839
垢版 |
2013/01/23(水) 14:37:49.03
>>840
DL.dlunwrap(obj.to_i).call(hwnd)
ならどう?
842838
垢版 |
2013/01/25(金) 07:39:32.37
>>841
ありがとう。動いた
う〜ん・・・もうちょっと悩んでみます
843838
垢版 |
2013/02/04(月) 08:00:57.45
長文失礼します

どうにも行き詰まってしまったので質問させてください
環境はruby 1.8 or 1.9+dl2+wxruby2です
>>839氏のサンプルを元に:stdcall、:temporal共に意図した動作をすることを確認しました
しかし、wxrubyと組み合わせて使おうとするとエラーが出てしまいます
やりたいことは
ttp://www.michaelnygard.com/blog/2009/01/ # Rubyの例
ttp://wiki.wxpython.org/HookingTheWndProc # Pythonの例
で、Windowsのメッセージをトリガーに処理をしたいです
コードは書き途中ですが
>type test.rbw
#!/usr/bin/env ruby
# encoding: utf-8
require 'dl/import'
require 'dl/types'
require 'wx'
module Win32
GWL_WNDPROC = -4
extend DL::Importer
dlload 'user32.dll'
include DL::Win32Types
typealias('LONG', 'long')
typealias('LRESULT', 'long')
typealias('WPARAM', 'void*')
typealias('LPARAM', 'void*')
typealias('WNDPROC', 'void*')

extern 'LONG SetWindowLong(HWND, int, LONG)', :stdcall
WND_PROC1 = bind("LRESULT WindowProc(HWND, UINT, WPARAM, LPARAM)", :temporal)
WND_PROC2 = bind("LRESULT WindowProc(HWND, UINT, WPARAM, LPARAM)", :stdcall){ p "call WND_PROC2" } # ここが呼ばれても嬉しくない
end
844838
垢版 |
2013/02/04(月) 08:01:50.28
class MyApp < Wx::App
def on_init
MyFrame.new.show
end
end
class MyFrame < Wx::Frame
def initialize
super(nil, -1)
@oldWndProc = Win32.SetWindowLong(get_handle(), Win32::GWL_WNDPROC, Win32::WND_PROC1){ callback_func } # こっちは例外発生
#@oldWndProc = Win32.SetWindowLong(get_handle(), Win32::GWL_WNDPROC, Win32::WND_PROC2) # こっちはWin32内の関数が呼ばれる
end
def callback_func(*args)
p "call WND_PROC1"
end
end
MyApp.new.main_loop
>ruby test.rbw
test.rbw:23:in `show': undefined method `call' for nil:NilClass (NoMethodError)
from test.rbw:23:in `on_init'
from test.rbw:36:in `main_loop'
from test.rbw:36:in `<main>'
そこはnilじゃないし、callメソッドが無いってお前は何を(ry
例外の内容が意味不明でお手上げ状態です。よろしくお願いします
2013/02/04(月) 08:29:16.63
MyFrame.new.show でエラーだろ
MyFrame.new がマジでnil
2013/02/04(月) 09:10:45.74
typealias('LONG', 'long')
typealias('LRESULT', 'long')
typealias('WPARAM', 'long')
typealias('LPARAM', 'long')
typealias('WNDPROC', 'void*')
typealias('HWND', 'long')
extern 'LRESULT SetWindowLong(HWND, LONG, WNDPROC)', :stdcall
847838
垢版 |
2013/02/04(月) 22:39:43.13
レスありがとうございます

>>845
それが
- MyFrame.new.show
+ frame = MyFrame.new
+ p frame
+ frame.show
として実行すると
>ruby test.rbw
#<MyFrame:0xa92180>
test.rbw:26:in `show': undefined method `call' for nil:NilClass (NoMethodError) # 26はframe.showの行
from test.rbw:26:in `on_init'
from test.rbw:39:in `main_loop'
from test.rbw:39:in `<main>'
>>844と同じ例外が出て???です。nilだったらnilって出力されますよね?

>>846
あ、SetWindowLongのexternが変でしたね。extern / typealiasの書き方がおかしいのかと思っていじって直していませんでした
お手数をおかけします。typealiasとexternを>>846の通りに直してみましたが同様の例外が発生します

現在のコード
-typealias('WPARAM', 'void*')
-typealias('LPARAM', 'void*')
+typealias('WPARAM', 'long')
+typealias('LPARAM', 'long')
-
+typealias('HWND', 'long')
-extern 'LONG SetWindowLong(HWND, int, LONG)', :stdcall
+extern 'LRESULT SetWindowLong(HWND, LONG, WNDPROC)', :stdcall
自分の知らない何かを根本的に勘違いしているのだろうか・・・
2013/02/05(火) 07:34:07.89
同じコードをコピペして試すと違う例外が出た

c:/ruby/lib/ruby/1.9.1/dl/func.rb:92:in `call': can't convert DL::TempFunction into Integer (TypeError)
from c:/ruby/lib/ruby/1.9.1/dl/func.rb:92:in `call'
from wxprob.rb:18:in `SetWindowLong'
from wxprob.rb:31:in `initialize'
from wxprob.rb:25:in `new'
from wxprob.rb:25:in `on_init'
from wxprob.rb:38:in `main_loop'
from wxprob.rb:38:in `<main>'
849848
垢版 |
2013/02/05(火) 07:35:33.98
ちなみにバージョン
ruby 1.9.3p362 (2012-12-25) [i386-mingw32]
(Windows 8 64bit)
850839
垢版 |
2013/02/05(火) 10:26:29.62
コールバックの呼ばれるタイミングがSetWindowLongの呼び出しタイミングとは違うので
temporalだとうまくブロックを渡せないのかな?

それならGWL_USERDATAにProcやMethodをdlwrapしてSetWindowLongで格納、
stdcallのbindのブロック内でGWL_USERDATAからGetWindowLongして
dlunwrapしてcallするのがよいのでは?

...
WND_PROC2 = bind("LRESULT WindowProc(HWND, UINT, WPARAM, LPARAM)", :stdcall){|hwnd, msg, wp, lp|
DL.dlunwrap(GetWindowLong(hwnd, GWL_USERDATA)).call(hwnd, msg, wp, lp)
}
...
Win32.SetWindowLong(get_handle(), Win32::GWL_USERDATA, DL.dlwrap(method(:callback_func)))
@oldWndProc = Win32.SetWindowLong(get_handle(), Win32::GWL_WNDPROC, Win32::WND_PROC2)
...
2013/02/10(日) 13:52:02.49
1.9.3-p385
852838
垢版 |
2013/02/11(月) 23:02:53.21
長文すみません。ソースを貼るので長くなります
>>850
レスありがとうございます
そのコードでコールバック関数が呼ばれるようになりました
が、"DL.dlunwrap(GetWindowLong(hwnd, GWL_USERDATA))"が
callback_func以外のオブジェクトを返す現象が発生します
Ruby本体の問題かと思って思い切ってmingw32の最新版にして
みたらまた走らなくなった・・・
OSはWinXP x86 SP3でwxruby 2.0.1。rubyは1.8.7と1.9.2

>type test.rbw
require 'dl/import'
require 'dl/types'
require 'wx'
module Win32
GWL_WNDPROC = -4
GWL_USERDATA = -21
extend DL::Importer
dlload 'user32.dll'
include DL::Win32Types
typealias('LONG', 'long')
typealias('LRESULT', 'long')
typealias('WPARAM', 'long')
typealias('LPARAM', 'long')
typealias('WNDPROC', 'void*')
typealias('HWND', 'long')
extern 'LRESULT SetWindowLong(HWND, LONG, WNDPROC)', :stdcall
extern 'LONG GetWindowLong(HWND, int)', :stdcall
WND_PROC1 = bind("LRESULT WindowProc(HWND, UINT, WPARAM, LPARAM)", :stdcall){|hwnd, msg, wp, lp|
DL.dlunwrap(Win32.GetWindowLong(hwnd, GWL_USERDATA)).call(hwnd, msg, wp, lp)
}
end
853838
垢版 |
2013/02/11(月) 23:03:27.17
class MyApp < Wx::App
def on_init
MyFrame.new.show
end
end
class MyFrame < Wx::Frame
def initialize
super(nil, -1)
Win32.SetWindowLong(get_handle(), Win32::GWL_USERDATA, DL.dlwrap(method(:callback_func)))
@oldWndProc = Win32.SetWindowLong(get_handle(), Win32::GWL_WNDPROC, Win32::WND_PROC1)
end
def callback_func(*args)
p "callback func"
end
end
MyApp.new.main_loop
854838
垢版 |
2013/02/11(月) 23:04:35.21
>ruby -v
ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-mswin32]
>ruby test.rbw
"callback func"

"callback func"
test.rbw:21:in `block in <module:Win32>': undefined method `call' for "l!":String (NoMethodError)
from c:/Dev/ruby19/lib/ruby/1.9.1/dl/func.rb:102:in `call'
from c:/Dev/ruby19/lib/ruby/1.9.1/dl/func.rb:102:in `block in bind'
from test.rbw:39:in `call'
from test.rbw:39:in `on_run'
from test.rbw:39:in `main_loop'
from test.rbw:39:in `<main>'
#「"l!":String」は実行するたびに変わります。Arrayになったり他のオブジェクトになったり・・・
>ruby -v
ruby 1.9.3p385 (2013-02-06) [i386-mingw32]
>ruby test.rbw
test.rbw:26:in `show': can't convert String into Integer (TypeError)
from test.rbw:26:in `on_init'
from test.rbw:39:in `main_loop'
from test.rbw:39:in `<main>'
振り出しに戻っている・・・
2013/02/11(月) 23:27:45.98
python使った方が楽よ
856838
垢版 |
2013/02/12(火) 07:38:35.03
>>855
それは自分も思い始めていたけど、Pythonはあの使えないドキュメントにストレスがたまる
Rubyみたいに一目で継承関係やメソッドがわかるリファレンスマニュアルがないんだよね
2013/02/12(火) 10:14:20.96
えっ
858デフォルトの名無しさん
垢版 |
2013/02/12(火) 10:30:38.25
確かに ttp://python.jp/ の方は使えないな。
ttp://python.org/ の方が良い。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況