Search
Categories
Articles
Rainmeter関連
ファイル置き場
お知り合いなど

スポンサーサイト

--.--.-- | スポンサー広告

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WideCharToMultiByteにはまる

2009.04.25 | Programming

0 Comments

Rainmeterのプラグインを作っていて、挙動チェックにMeasureCalcを通したところ、出力される値がむちゃくちゃ……。
書式はあっているのに、1と出るはずのところで0しか出なかったり、ちゃんと出たり。数式をいじるとまたバグったり。プラグインのほうに問題があるのかと思い、チェックしてみるけれどわからず。

そういやCalcってログでるよなーと思い、ログを出力してみると……書式に指定したMeasure名が、たとえば「MeasureA」と指定しているのに「MeasureAT」とか、本来のものにゴミがついた状態で認識されて出力されているではないですか。さらに書式ミス時のエラーメッセージにも数文字分ゴミがついて出力されている……。本家版のRainmeterでもチェックしてみるも、起こらないので、ますます自分の書き換えた部分が怪しい……。

MeasureCalcは、パーサの実装部分がcharで処理されているので、扱う際にはWCHARからchar(または逆)への変換が挟まってます。どう考えてもこの変換部分としか考えられない。というか弄ったし。

原因の箇所はLiteStep.cppに定義されているConvertToWide()と、ConvertToAscii()でした。
この関数の中では、文字列の変換をWideCharToMultiByte()とMultiByteToWideChar()を使って行っていますが、勘違いから、ソース文字列の長さを指定する部分に「wcslen()で測った文字列の長さ」を渡してしまっていました。これだと、いくら変換コピー先バッファの大きさが十分にあっても、ソース文字列の長さ分の変換コピーがなされるだけで、最後に肝心のヌルターミネータが入らないっぽいです。この場合には、自分で末尾にヌルターミネータをつけてやる必要があったようで……そりゃ終端処理されてないんだからゴミがつくよねと。

ソース文字列にヌルターミネータがついていれば、最後のヌルターミネータまで変換コピーされるように、「実際の文字列の長さ+1」を指定してやるか、そもそも「-1」を指定してやれば、ヌルターミネータを含めた長さとして動いてくれるようです。この「-1」を指定したときの動作を、文字列の長さ分なんだと勘違いしていました。自動計算を何度もやるのをケチりたかったがために入れた長さの指定が、バグを生んでたというわけでした。

結論。むやみに弄るな ヌルターミネータの扱いがどうなるのか、しっかり調べよう。それだけでなく、NULLを渡したときの挙動も、か。

ちなみに勘違いしていた部分の、MSDN日本語版での記述。これだと含まれるのかどうかがわからない。

-1 を指定すると、文字列が NULL で終わっていると見なされ、長さが自動的に計算されます。

MSDNの日本語版は誤訳もありそうだし、英語のほうも見てみた。

If this parameter is set to -1, the function assumes the string to be null-terminated and calculates the length automatically, including the terminating null character. If cchWideChar is set to 0, the function fails.

……最初からこっち読んでればよかった。情報量が違いすぎた。

スポンサーサイト

M@STER TRAXX

2009.04.18 | ニコニコ動画

0 Comments

 

こんな時間にwww
メンバーからしてハズレなしとわかるw

微修正点とか

2009.04.14 | Rainmeter-dev // その他

0 Comments

Rainmeter本家ではどんどんと追加要素が入っていってますが、何を追加していってるのかさっぱりなので(スキンの部分ではないとはいえ、今まであった設定項目を削るってどうなの?とは思ったりしましたが)、そちらは少し置いといて。
今回は、自分用にビルドして使っているRainmeterのソースのうち、変な処理などを微修正した部分を書き出してみます。追加要素はまた別の機会に。
(修正前のソースを貼るとえらい長くなるので、GoogleCodeへのリンクと行番号だけ書いておきます)

■いろんなとこ
・new char[]やnew WCHAR[]で確保したバッファを、単にdeleteしてしまっている部分を修正(delete tmpSz; → delete [] tmpSz;)。ほとんどがConvertToAscii()、ConvertToWide()、ConvertToUTF8()絡み。複数のファイルにあるので全部(主にプラグインのソースにあります)。
・後置インクリメント/デクリメントをしてる部分のうち、処理的に後置でなくていいものをすべて前置に置き換えた。主にforループでまわしてるイテレータのため。
・forなどのループの条件のうち、処理的に変化のない条件を何度も計算しないようにした。主に「i < wcslen(tmpSz)」みたいなもの。
・構造体の初期化をmemset()でなく、宣言時に{0}を代入することで済ますようにした。NOTIFYICONDATAのcbSizeなど、サイズを指定しなければいけないものは{sizeof(NOTIFYICONDATA)}で初期化(サイズ指定部分は大抵、構造体の先頭にあるため。先頭でない場合は仕方ないので後から代入する)。

■Application.cpp
・コマンドラインからクォート(")を取り除く処理で、取り除いた後の文字列を格納しておくバッファ(WCHAR Path[256])のサイズを超えて書き込もうとするのを修正。……でも、これって何のために存在する処理なのかがよくわかりませんでした。(後述)
・すべてのMeterWindowが"On Desktop"に設定されているときに、!BANG Commandが届かない問題を修正。(後述)

■MeterHistogram.cpp
・ヒストグラムのバーの高さが微妙に設定とズレるのを修正。DrawLine()で描いていたものを、すべてFillRectangle()で描くようにする。(ソースは追加要素と入り混じりすぎてて抜き出せないので割愛)

■MeterString.cpp
・フォントによって、StringAlign=RIGHTのときに文字の位置がズレることがあるのを修正(?)。……というよりは、直っているのかどうか、正しいのかどうかすらわからないやり方なので、おまじない程度。(後述)

■MeterWindow.cpp
・スキン内容を読み込むためのバッファの解放漏れを修正。1054行目で、returnする前にitemsをdelete[]する。
・描画用のダブルバッファを、毎度deleteして作り直すのではなく、サイズの変化がないときは透明色で塗りつぶして再利用するようにしてみた。単に、やたら増えるページフォルトを減らしたかっただけ。速度的には作り直すよりも遅い。(後述)

■Rainmeter.cpp
・OSの判定で、XPでもたぶん2kとして判定されてしまうのを修正。dwMajorVersionだけでなくdwMinorVersionも含めて判定する。……とはいえ、どのへんでOSごとに(例えば2k or XPで)処理を変えるのに使われているのかは、よくわからない。Vista以上で処理を変えたいとかいう流れになってくると、判定処理をしっかり書いたほうがいいのかも。

■WebParser.cpp
・すべてのMeterWindowが"On Desktop"に設定されているときに、FinishActionが届かず実行されない問題を修正。原因はApplication.cppのものと同じ。

■WindowMessagePlugin.cpp
・std::mapにwindowData丸ごとでなく、ポインタを突っ込むようにした。どっちがいいのかは……。

……と、こんな感じです。
他にも、「Meter=STRINGでAutoScale=1のときに、Measureによっては値が小さく表示されてしまう(210か、103かの違い)」なんてのもあるのですが、これは設定を追加するなりして処理を分けないと無理かなぁということで、今回は省略しました。ディスクやメモリ容量などの表示には問題ないけど、Net関連は少しズレてるかもしれません。

続きからは、(後述)って書いてあるものの詳細。

続きを読む »

Google Reader

2009.04.09 | PC関連

0 Comments

便利そうだなーとは思いながらも、今までフィードリーダーを使ったことがありませんでした。
特に理由があったわけではありませんが、なんとなく使ってませんでした(あえて挙げれば、フィードリーダーのUIがあまり好きじゃなかったとか)。とはいえ、巡回先が多くなってくると、いちいち見て回るのも一苦労なので、試しにGoogleリーダーを使い始めてみました。

便利ですね!!(早
使い始めてみると、コロッと意見が変わるのはいつもどおりなので気にしない!

各サイトによって、フィードの内容が全文だったり一部だったり、タイトルですら途中で途切れてて内容が分かりづらかったりして、Googleリーダーだけで済ませることはできないけれど、更新通知という意味では便利だなぁと。
あとは……ブログを直接見に行くのとは違って、UIがそっけない感じがして読みにくい気がするのは慣れるしかないかな。各ブログのテンプレートの雰囲気に慣れてると、微妙に違和感があったりする。

Googleリーダーはデフォルトでも別に困らないけど、ちょこちょこと個人的に使いやすいように調整しました(Firefoxにて)。
まずはアドオンの「Better GReader」。こいつの「Auto Add to Reader (Bypass iGoogle Choice)」と「Colorful List View」が便利。サイトごとに別々の色がついて見やすくなりました。「Auto Add…」は、フィードを登録しようとするときに、鬱陶しいiGoogleを経由せず直接リーダーに追加してくれるオプションですが、そのままだとgoogle.co.jpのiGoogleを経由しようとしちゃうので、反応してくれません。反応させるには設定をgoogle.comに変更してやる必要があります。ということで、about:configにて下のような設定を追加しました。

browser.contentHandlers.types.6.title : "Google Reader"
browser.contentHandlers.types.6.type : "application/vnd.mozilla.maybe.feed"
browser.contentHandlers.types.6.uri : "http://www.google.com/ig/add?feedurl=%s"

登録先に「Google Reader」が選べるようになるので、それを使うようにします。または、上の設定を使わず、デフォルトで存在するGoogleのuriを変えてもOKのはず。

次に入れたアドオンは「Google Reader Notifier」。こいつは定期的に更新があるかどうかをチェックして、更新があればポップアップや更新件数を表示して教えてくれるアドオンです。ずっとリーダーを開いておく必要がないので便利だったんですが、4/8あたりからGoogleのログイン処理周り?が変わったらしく、使えなくなってしまいました。
同じようなアドオンに「Google Reader Watcher」があり、そちらでも同じようなエラーが出ていましたが、更新されて問題なく使えるようになりました。Notifierが更新されるまではこちらを使うのもありかと思います。機能もあまり変わりません。

あとは「Stylish」でCSSを弄って下のような感じに(ソースは続きに突っ込んであります)。

20090409_greader

CSSは探せばいろいろと公開されてそうなので、探して試してみるのも面白そうです。

続きを読む »

Changelog (Rainmeter 0.14 to 0.14.1-r2)

2009.04.01 | Rainmeter-dev

0 Comments

Google Codeには、オリジナルともいえる0.14のソースが存在しません。一番最初にコミットされたr2から既に0.14.1となっています。
面倒なのが、0.14からの差分を簡単にチェックできないこと。
自分用として改変を加えていっているRainmeterは0.14をベースにしていたので、どこが変わったのか知りたい!

ということで、ソースを落っことしてきてWinMergeで比較。
変わってたのは以下のファイル。差分のリンク先はWinMergeで出力したレポート(html形式)なのでデカイです。
(Rainmeter.hも変わってるけど、バージョン表記のみなので省きます)

MeasureNet.cpp
前回の記事で書いた、「MaxValue」読み込み時の判定の修正

MeasureTime.cpp差分
・たぶんこれが「Time measure didn't show correct week number. Fixed.」の修正?

MeasureUptime.cpp差分
・表示内容の整形用の文字列に「%4」が含まれる場合に行われる処理が、「%3」が含まれる場合に処理されていたのを修正
(%4はday、%3はhourで、%4が使われない場合は累積時のまま表示したかったんだと思われる。デフォルトでは%3も%4も指定されているので、結果的には問題ないように表示される)

MeterImage.cpp差分
・MeasureNet.cppと同じく、画像ファイルサイズ取得でのエラー判定がstd::wstring::nposとの比較になってたのを修正

……と、こんな感じでした。
Uptimeの修正は、そもそもヘルプにすら記載されてない部分の修正だから、変更点に書かれてないのかもしれませんね。

以下はそんなUptimeについての雑感。

続きを読む »

えいぷりるふ~る

2009.04.01 | 雑記

0 Comments

エクア

各所で早速始まってますねーw
まだゲームポットくらいしか見てませんが、MoEでもゲーム内で間違い探しが始まったので画像の1箇所だけ見てきた。エクアの格好がひどいんだけど、別にこれでもいいやと思えるから不思議。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。