著作一覧 |
2日前から、2か3年ぶりに仕事で、ちょろっとATLプログラミング。
バックグラウンドでポールしまくるオブジェクトからの通知を受けて、フロントエンドのアプリケーションにイベントを投げるActiveXコントロールだ。
これって、プロトコルの固まりなんだよね。特にIEで使う場合には。たとえば、
1. VBもIEもスレッド縛りがある(TLS使う)からアパートメントモデル。
2. VBもIEも、アプリケーションプログラマー(今回はおれだが)はデバッグのためにMsgBoxとかalertとか使う。使うとメッセージループに入る。
とりあえず、この2つについてのプロトコルは
1. バックグラウンドスレッドは、フロントエンドスレッド(コンテナアプリケーションと同一スレッド)に対してイベント通知の必要性を通知
2. 特にポールするやつだと、イベントのネストのイベントのネストのイベントのネストの……で、MsgBox300でスタックアンダーフローとか、IEのalert800個でハングとかになるのを防止するため、イベント通知中はネストしてイベントを出さないようにキューしておく
が重要。
1.のためには、次の2種類の方法を使う。
1. Windowメッセージ。フロントエンドスレッドはWindowを作成し、バックグラウンドスレッドはここに通知する。データは共有リストを使うか、WPARAM/LPARAMにヒープからアロケートしたメモリーブロックを嵌め込んで送る。(当然、スタックは使えない。SendMessageはネストするとハングするから、PostMessageを使うことになる)
2. COMにマーシャリングさせスレッド間通信。ただし、ポールする場合、待ち状態になる可能性があるので、基本的には使ってはだめ。おいらは好きだけど。スタック上の値を引数としてもマーシャリングされるから大丈夫だし。
なんてことを思い出しながら作るのであった。
で、こういうプロトコルを説明したのって見たこと無いけど(実装レベルでは)、みんなどうやってんのかな? とか。COMの仕様をMSDNから掘り出して読めばいいわけだが。
ちなみに、今日、宇野さんと話したがこういうことかな。
WithEvents X As EventPublisher
...
Set X = CreateObject("EventPublisher")
...
Public Sub X_SomeEvent()
Set X = Nothing
End Sub
これはすごくまずい。なぜなら、
public class EventPublisher : IDispatch {
...
public HRESULT Release() {
int n = --refcount;
if (n == 0) {
delete this;
}
return n;
}
void someMethod() {
...
Fire_SomeEvent();
... // ここに戻ると、thisが逝ってる!!!!
....(必要に応じて後処理) -> SEGV
}
};
極悪ですな。したがって、信頼できない相手にイベントを通知する場合には、
....
AddRef();
Fire_SomeEvent();
....(必要に応じて後処理)
Release();
// ここでthisが削除されているかもしれないからインスタンスを触ってはいけない
return S_OK;
}
というように防御が必要。
ついにということにしたいのですねに毎日ではなってるよ。
逆にアドレスを偶然いじっていて、アクセスした場合は、不正アクセスだが「意図的」でない限り、同法に抵触しないとみられる。
意図的かどうかは取り調べでわかることだ。つまり、アドレスを偶然いじってアクセスした痕跡が見つかれば、十分に、別件逮捕の理由にできるってことですな(もちろん、別件がアドレスいじったことね)。
突然思い出したが、某都市銀行の大都市の支店長(当時)の息子に聞かされた言葉が印象に残ってるんだが、それは実感に合ってるからでもある。「親父いわく、朝日はインテリのつもりの人が読む。みんなはみんなが読むから読売新聞を読む。経営者や企業人は毎日と日経を読む。」-朝日は少し左で、読売は少し右、中道が必要な人は毎日という意味だそうだ。
なるほど、我慢して最後まで読むと
プログラムの数字の一部(引数)を若干替えてやってみても不正アクセス禁止法違反となるのなら大事になる。善意でぜい弱性を指摘することも減るかもしれない。
と、最初の意図を騙るための仮想人格(法律に詳しい関係者)とは異なり、実在するらしい固有名を持った人間に正論を語らせて、最後にIPAが届け出先をどうするかの調査を開始(っていうか、AISTとは違うからか)というふうに進む。
もちろん、企業人は多忙だから、縦読みできない長い記事は最初の数段落を読んで、すべてを理解するから、うまい書き方だ。ということにしたいことが非常に明白に語られている。これが中道だ(常にレトリックの手法を学び研鑚するのは重要だ)。
#ま、みなさん、自分に興味がある点にしか言及しないから、言及してない点
#がどのへんにあるかを見てると、スタンスが見えておもしろかったり。
#っていうか、書き手にとって自明なことを日記に書いてもしょうがないしな。
思い出した。新聞の読み方は中学で習った。見出し、リード、本文。本文の段落は、総論―背景説明―詳細と段落を分けて記述する。したがって、先頭の数段落を読めば、意図はわかる。
常識としてこの読み方を知っている人間をたぶらかす方法は、意図的に、このフレームワークを崩し、各論―背景―正論―総論と配置することだ。
なんで毎朝、新聞を読むの? っておいらは、新聞を取らなくなってもう15年だが。最後にとってたのは読売だが。
それは、その日、一日を、気持ちよく過ごすため。朝1番の快を得るため。
だから、新聞は複数の会社が共存できる。
ちょっと右なら読売を読んで気持ちよく、結構右なら産経の正論読んで大きく頷き、もっと右なら朝日を読んで吠えて鬱屈を発散し、ちょっと左なら朝日を読んで気持ちよく、結構左なら赤旗読んで力づけられ、もっと左な人は日本には多分いない。宗教者は宗教する。そして中道な人は毎日を読んで納得する。日経を読んで株価を知る。
ジェズイットを見習え |