__wargv にアクセスするとクラッシュする
どこで聞いたのか忘れたが Visual C++ には __argc, __argv, __wargv みたいなグローバル変数があって、プログラムの引数にアクセスできる。こりゃ便利だなと思って __wargv 使ってみると APPCRASH する。
そもそもこれらの変数の管轄は CRT なのかそれとも Windows SDK なのかいまいちよくわからんが、少し調べてみると
- エントリポイントが main か WinMain の時は __argv
- エントリポイントが wmain か wWinMain の時は __wargv
を使うということらしい。
本当は __targv を使うのが正しいやり方っぽいが、自分はマクロで Unicode 版と ANSI 版を書き分けるのが好きではないので気付かなかった。
IrfanViewのahk_class
#IfWinActive, ahk_class IrfanView WheelDown:: Send, {PgDn} WheelUp:: Send, {PgUp} MButton:: Send, {Enter} XButton1:: Send, {Space} XButton2:: Send, {Backspace}
とやってるのだが、IrfanView を全画面にすると効かなくなるんだよな。
Windows Spy で何とか調べてみたら ahk_class FullScreenClass とか言ってる。全画面はどうも別のウィンドウみたいだな。しかしクラス名が一般的するぎるのでどうもあやしい。念のため i_view32.exe を検索してみたがそんな文字列はない。とういか IrfanView という文字列すら見つからない。もしやと思い Process Explorerで見ると色が紫。パックされてるわ。
バイナリを Stirling で覗いてみると先頭の方に UPX0 という文字列(たぶんセクション名)が見えるのでどうも UPX (the Ultimate Packer for eXecutables) で圧縮されてるっぽいな。
copy i_view32.exe a.exe upx -d a.exe
で展開して中身を覗いてみると、やっぱり RegisterClass してたわ。
なんか他と衝突しそうなクラス名でいやだな。
昔「バイナリ変更」とかに憧れて、EXEの仕組みとかアセンブラとか少しやってみたことがあったけど、ぜんぜん物にならなかった。だが今日は少しは役に立ったな。
はてなブックマークはくりかえす……のか?
はてなブックマークを見たら、こういうサイトが人気になっていた。
実はこんなに実用的だった! 誰でも1着は持っているパーカーのスゴイ使い道! ? Pouch[ポーチ]
ん? 昨日ブックマークの整理中に同じ画像見たぞ??
どこにでもあるパーカーをノートパソコン用のキャリーケースとして使う方法 - GIGAZINE
気になって探し見てみると、他にもこれとかこれとか出てくるのね。
得られた教訓は2つ。
- 1. 海外で流行っているものを日本に持ってくると、ありがたがられる(情報の個人輸入)
これはプログラミングの記事で使えるか。というか自分もよくやる。
- 2. 少し前に流行ったものをもう一度取り上げるとうける(一度あることは二度ある)
少し前にあった「ドラクエの世界がドーナツ型になってる」なんて話はその当時から言われたけど、いまだに知らない人がいるわけだ(数学の与太話なんかでよく聞かないか?)。それはともかく、1度話題になったことでも知らない人は結構いるとういこと。
うん。なんか自分でもアクセス数を稼げるんじゃないかという気がしてきた。
'\0'で連結する簡単な方法
ファイルをごみ箱に送るには SHFileOperation() を使うのだが、こいつはファイルを一度に複数処理できるようになっていて、そのためパスの指定方法が特殊で、 \0 でパスを連結し最後を \0\0 で終端するという面妖なやりかたをしなくてはならない。
でだ。この \0 で連結されたパスを作るのに簡単な方法はないかと前から思っていたのだが、STL の std::basic_string を使うと簡単にできるんじゃないかと思いついた。
#define UNICODE #include <windows.h> #include <string> void foo() { using namespace std; // ファイル1 PWSTR s = L"c:\\abc\\def"; wstring from; from.append(s, lstrlen(s) + 1); // ファイル2 s = L"C:\\ghi\\jkl"; from.append(s, lstrlen(s) + 1); // 最後に \0 を追加 from.append(L"", 1); SHFILEOPSTRUCT op = { NULL,FO_DELETE, from.c_str(), NULL, FOF_NOCONFIRMATION | FOF_ALLOWUNDO | FOF_NOERRORUI}; SHFileOperation(&op); }
append する文字数を指定するところが肝だ。
ちなみに、VC++のデバッガで見る限りはうまく動いているようだが、はたして規格的にこれでいいのか、C++に疎い小生では判定しかねる。
関連記事
4chanに投稿しようとるとはねられる
4chanにコメントを投稿しようとしたら、
Part of your comment isn't allowed to be posted :(
コメントに投稿できない部分が含まれてます (・A・)
と言ってきやがる。
色々試してみると、どうもTwitterのアドレスを貼るとだめみたいだな。それもかなり柔軟に判定してるみたいで、例えば
http://twitter(dot)com/toptweets_ja/ http://twitter .com/toptweets_ja/
とかやっても迂回できない。最終的に . を , に置き換えることで突破できた。
どうもこの処理はreCAPTCHAの判定より前に挿入されているようなので、Verificationを空欄にして色々投稿してみることで、禁止ワードの検出方法を探ることができる。
Googleノートブックの宣伝を消した
Googleノートブックが、使えなくなった拡張の宣伝をいつまでもやっていて鬱陶しいので、
chrome/userContent.css をいじって非表示にさせておいた。
@-moz-document url-prefix(http://www.google.co.jp/notebook/), url-prefix(https://www.google.co.jp/notebook/) { td#gn0_0 { display: none !important; } }
開発が停止してるとはいえ、保守くらいはしてほしい。