鏑矢の憂鬱2000年6月後半
透明1ドットイメージ
 
2000/06/16 (Fri)
・今日は信号処理論のプログラムをちょこっと。こーゆー数学系だと、2重ループが増えて、そういう場合には STL アルゴリズムって不得意なんだよね。だから難しい部分ありますです。結局 for だけで処理することになるかなー。あと、イテレーターの問題とかも。数値計算だと「数値」で要素を指定するんで、その辺とイテレーターとの親和性とか。ま、もちっとがんばってコード量減らしましょう。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/17 (Sat)
・今日も信号処理論のプログラムをブラッシュアップ。配列を std::vector に置き換えたり。 std::back_inserter() って便利すぎ(爆)。以前言った「総和を求めるアルゴリズム」の代わりに、まず「総和を出す関数オブジェクト」を作成。これを for_each() に噛ませるってゆーの。で、さらに一歩進めて、2値取る関数オブジェクトを m_ = Functional( x, m_ ) ってする関数オブジェクト、つまり std::plus 系のを続けて実行する関数オブジェクトを作ってみました。
 
・ std::binder1st をコピー&ペーストしてそんな感じにインプリメント。ついでに std::bind1st 代わりのものも作って完成。「総和を出す関数オブジェクト」だと演算ごとに関数オブジェクトを作らなきゃいけないけど、これなら引数ふたつ戻り値ありのならどの関数オブジェクトでも使えるから汎用性高いのです。……でも結局使わなかった(汗)。
 
・特定のプログラムにしか使わない場合には、どうしても汎用性より可読性を求めてしまうです。それもやっぱ「汎用性高めても使われる可能性低い」からかなとか。と思って、新しいコンテンツ案! 「 STL コレクション」と題して、わてが作った汎用性の高いアルゴリズムや関数オブジェクト、イテレーターを公開するページを作ろうかなとか思ってます。これなら汎用性の高いの作っても無駄になんないかなーとか。まー今は忙しいから無理だけど(泣)。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/18 (Sun)
・今日はお休み……じゃないです(爆)。今日はぷらとわを1話書きました。とりあえず1週間に1話は書いておかないと。
 
・今日は const 参照とか。なんか、概念的な部分が多くなっちゃったなー。つっても、プログラミングにはそーゆー部分少なからず必要だとは思うんで、無駄ではないと思うけどね。次回からはバージョン5へ。前に言ってたファイルをコンボボックスにってのをやろうと思ってます。まだまだ教えることが山積みだぁ。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/19 (Mon)
・今日の授業は情報理論。うむー、相変わらず難しい。んでもマルコフ連鎖は前に確率統計でやったなー。ノート見返してみよう。あとCマガジン購入。「プログラミングの禁じ手C++編」って、対処法書かれてないから Effective C++ と一緒に読まなあかんかも(汗)。 Effective C++ 読破したらこーゆー間違いしないか。ところで Effective C++ 読んだって人、どんくらいいるんだろう。なんか知名度だとデザパ本(ガンマ本)より低いような気も(汗)。すべての C++ プログラマーに読んで欲しいんだけど……。
 
・あと信号処理論のプログラムについて。もうブラッシュアップはほぼ完了、なんで gcc でコンパイルチェック、にあたって、ふと思いついたことが。 VC のツールとして gcc を呼び出せないか? と思って試してみたらばっちり! これは便利っす。「カスタマイズ」−「ツール」で、コマンドを gcc の make.exe に(わての場合 BCC55 との兼ね合いでフルパス指定)、引数を -C $(WkspDir) に、あとは「アウトプットを使用」をチェックして完了。
 
・あとはメニューから選べばコンパイルできるし、アウトプットに結果が表示されるからかなり便利。さらにツールバーにボタンをセットすればボタンひとつでできるし、実行ファイルの実行も同じようにできるし。これまで gcc でのコンパイルチェックは cygwish でやってたんだけど、こっちの方がかなり便利だなー、とっとと気付けば STL & iostream 入門書くの楽だったのに(汗)。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/20 (Tue)
・今日はお便りだけ。では今日のお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 毎日読ませてもらってます。
 
>VC のツールとして gcc を呼び出せないか? と思って試してみたらばっち
>り! これは便利っす。「カスタマイズ」−「ツール」で、コマンドを gcc
> の make.exe に(わての場合 BCC55 との兼ね合いでフルパス指定)、引数
>を -C $(WkspDir) に、あとは「アウトプットを使用」をチェックして完了。
 
 こんな方法があったんですね。いいこと聞きました。早速試してみます。
 
 VCってなんか全然使いこなしてないような気がしてきた。使うのって「ビルド」と「デバッグ」ぐらいかも。いろいろ設定とかできるみたいだけどほとんどディフォルトのまま。いい機会だからいろいろいじってみよっと。
 
 Effective C++は、知名度低いのかなぁ。結構有名じゃないかと思うけど・・・。
透明1ドットイメージ
透明1ドットイメージ
 
・どうもー。 VC はホントにいろんな機能があるんで、いろいろ使い倒してみてください。プログラミング用エディタとして最適だと思うし。 Effective C++ 、なんかどうも知名度低いような気がするんです。気のせいならいいんだけど。 C++ のバイブルと言っていいと思うし。読んでない人はさっそく!
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/21 (Wed)
・今日はお休み。
透明1ドットイメージ
 
2000/06/22 (Thu)
・今日もお休み〜。
透明1ドットイメージ
 
2000/06/23 (Fri)
・今日もお休みです(汗)。ああ、もう3日連続でお休み……。
透明1ドットイメージ
 
2000/06/24 (Sat)
・今日は信号処理論のプログラムを仕上げました。つってもプログラムまわりは特に手を加えないで、頭にファイルのデータとか書き込んだだけ。これは VC と gcc でコンパイルできますよーとか。フツーのですね。んで、おそらく先生は UNIX を使ってると思うんで秀丸で EUC 形式で保存。これでOKかな。今日はこれだけ(汗)。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/25 (Sun)
・今日はお休みなの。
透明1ドットイメージ
 
2000/06/26 (Mon)
・今日はプログラミングしてないけど、お便りが来てるんでそれを紹介しましょう。
 
透明1ドットイメージ
透明1ドットイメージ
 はじめまして、僕は趣味でVCをやっているものです。
 いつもHPを楽しく読ませて頂いています。
 そのなかでもCordian は分かりやすく大変勉強になります。
 
 そこで聞きたいことがあるのですが Codian の「DLL・フック」の「システムフック」のページを参考に他のアプリのマウスイベントを取得するプログラムを作ったのですが、どうしてもうまくいきません。
 
 ページにあったとおりDLLに KHook というクラスを作って、そこで「システムフック」のページで言うSet()関数の中で
 
	
  m_hMouseHook = ::SetWindowsHookEx( WH_MOUSE 
            , (HOOKPROC)KHook::MouseProc
            , GetThisHInst(), 0 );
	
	
 
 という感じで「MouseProc」というフックプロシージャを登録して、そこからマウスイベントをDLLをロードしたアプリケーションに送るということをしたかったので
 
	
LRESULT CALLBACK KHook::MouseProc(
	int p_nCode, WPARAM p_wParam, LPARAM p_lParam)
{
    if( p_nCode < 0 || p_nCode == HC_NOREMOVE )
        return ::CallNextHookEx( m_hMouseHook, p_nCode, p_wParam, p_lParam );

    ::SendMessage
            ( m_hCalledWnd 
              //DLLをロードしたアプリのビューのウィンドウハンドル
            , WM_MOUSEHOOK		//私が勝手に定義したメッセージ
            , p_wParam
            , p_lParam );

    return ::CallNextHookEx( m_hMouseHook, p_nCode, p_wParam, p_lParam );
}
	
	
 
 として、上の「WM_MOUSEHOOK」メッセージをそのDLLをロードしたアプリのイベントハンドラ「OnMouseHook」で受けて処理しました。
 
	
LONG CTest_DllView::OnMouseHook( UINT uiMsg, LONG pstMouseHook)
{
    if(uiMsg == WM_RBUTTONDOWN){
        MOUSEHOOKSTRUCT* pstMHook
		 = (MOUSEHOOKSTRUCT*)pstMouseHook;
        TRACE("%d / %d\n", pstMHook->pt.x, pstMHook->pt.y);
    }
    return 0;
}
	
	
 
 これで実行するとそのアプリのウィンドウ上で右クリックしたときは正常に働きますが、他のアプリのウィンドウ上で右クリックをしたときは「OnMouseHook」の TRACE() のところで例外が出てしまいます。
 これは他のアプリから送られたメッセージの MOUSEHOOKSTRUCT 構造体は DLL 外(DLLをロードしたアプリ)ではアクセスしてはだめということなのでしょうか?それとも何か他に理由があるのでしょうか?どうぞお答えのほどよろしくお願いします。
(参考までに、このコード以外はCodian の「DLL・フック」の「システムフック」のページとほとんど一緒です)
透明1ドットイメージ
透明1ドットイメージ
 
・と、その続き。
 
透明1ドットイメージ
透明1ドットイメージ
 あっとすいません。さきほどMouseProについて質問をだしたものです。
 少し書き忘れていたので質問をもう少し、
 さきほどは MouseProc のMOUSEHOOKSTRUCT 構造体にそのメッセージを出したウィンドウ以外ではアクセスしてはいけないのでしょうか、ということを書きましたが、それは GetMsgProc の MSG 構造体、CBTProc の CBT_CREATEWND 構造体、など他のフックプロシージャにも言えることなのでしょうか。
透明1ドットイメージ
透明1ドットイメージ
 
・どうもですー。さてこの問題ですが、ずばり DLL 外からアクセスすることはできないようです。システムフックプロシージャが「他のプロセス」でも機能するには DLL として他のプロセスにフックプロシージャを刷り込ませる必要があるわけですが、これが逆に、変数が各プロセス内に作られてしまうために外部プロセスからアクセスできないという状況のようです。
 
・わての方では GetMsgProc() で試したんですがおなじことが起きました。この点から考えると、 CallNextHookEx() なんかはうまくメモリ領域を越えるようにしてるのかも。さて解決策ですが、理論上はいくらでもあります(爆)。たとえばファイルマッピング。ウィンドウズのファイルマッピングという機能を使うと、メモリ上にグローバルな領域を取れるんでそこを仲介して構造体全体を渡すことができます。
 
・他には、フックをセットした側に「値を渡すための関数(引数は構造体の各メンバと同じ)」を用意して、フック DLL 側から呼び出して各値を値渡しするっていう方法もあります。いずれにせよ重要なのは、同期処理。すべてのプロセスからばらばらに送られてくるんで、それをうまく処理しないとうまくいかない場合があります。だから「理論上」(爆)。実装は結構大変だなー。
 
・コツとしては、どっちも「順番」とか「ウィンドウハンドル」とかそーゆー付加情報を加えて、同期処理をするためのヒントにするといいと思うです。……ってゆーか、単純に同期オブジェクト( MUTEX とか)使えばうまくいくかも知んないけど、こーゆー処理は結構難しそうです。ってゆーか、 DLL から SendMessage() したときに、その DLL そのものが止まってるのかどうかもちょっと不明。考えたらシステムの同期処理って考えたことなかった……。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/27 (Tue)
・今日はお休みです。ふぅ。
透明1ドットイメージ
 
2000/06/28 (Wed)
・ C# 、しーしゃーぷっと発音します(最後の「っ」は要らんだろう)。マイクロソフトが今度の Visual Studio に搭載する新言語。 VC からも VB からも使えるってことらしいです。ベースは Java 。これに C++ らしさを加えている……らしい(汗)。とりあえずこちらを。
 
・面白いところ。まず const 関係がサポートされてる。たとえば引数に out ってゆー指定ができて、これは「値渡しで値を返せる」とゆーミョーなものです(でも const メソッドはなさげだからどうかなぁ)。また、可変長引数がちゃんとサポートされてたり、演算子のオーバーロードができたりしてます。まだよく分かんないけど、 object とうまく使えばテンプレート的に使えるかもしんないです。
 
・あくまで基本は Java 。だからガベージコレクションもあります。ところが、普段リファレンスとして使っているものを「ポインタ化」することができて、 C++ ライクにポインタ操作することができます。この拡張の関係で C 関係の関数( Win32API とか)も呼べるとのこと。ただ、 API まわりは新たに COM インターフェイスとして提供されると思う( C# は COM をすごく使いやすくしてるらしい)んでその辺がどうなるかがキーかも。
 
・まー実際の所、これがどうなるかは疑問。でも、だからこそ面白い(爆)。マイクロソフトが押し出す以上、それなりには広まるはず。 XML 対応ってのもキーだし、わて的には、これを最大限活用してヒット数増やしたいです(爆)。うふふふふー。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/29 (Thu)
・昨日に引き続き C# の話。これは格好のネタだ(爆)。えっと、まず C# には「標準クラスライブラリ」がないそうです。これは驚きですねー。サンプルの Console.WriteLine() ってのも .NET ってライブラリのもので、 C# とは基本的に関係ないそうです。じゃーどうするかというと、他のライブラリを使用します。そのライブラリは言語を問わないそうです。つまり VB でも VC でも作れるし、 MFC を使うこともできそうです。
 
・型についても面白いです。変数は常に「自分の真の型」を知っているから、アップキャストしたあとまた元の型にダウンキャストするっていうのも明示的キャストせずにできちゃいます。さらに object にアップキャストしたままで元の型のメンバを呼び出すことができます。さらに昨日書いたように演算子のオーバーロードができるから……。
 
・クラスまわりだと、プロパティへのアクセス専用の関数(でも小カッコなしで呼べる)を作れたり。あとプリミティブ型はないらしくて、一見プリミティブ型なものもクラスだから、 100.ToString() ってして文字列型に変換、なんてこともできるそうです。これは System.Int32.ToString() を呼んでるんだそうな。
 
・細かい言語使用。 goto があります(笑)。なんと foreach があります。 Perl 使いはドキドキしましょう。 lock はクリティカルセクション機能を持ってます。言語レベルで同期処理ができるってことですね。その他いろいろありますねー。 C# って名前は政治的に Java って名前を使えないだけ(笑)で、基本は Java みたいです。でもかなり違う言語ですね。いまんとこは「面白い」だけだけど、これからどうなるかは未知数ですねー。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/30 (Fri)
・今日はお休みしますー。
 
 
(C)KAB-studio 2000 ALL RIGHTS RESERVED.