|
・今日はお便りがいっぱいあるよん。ではまずひとつめのお便り。
|
|
・これはメンバ関数ポインタですね。うんうん、メンバ関数ポインタって難しいよねー。この例だとちょっと複雑なんで、要らない部分を削ぎ落としてそれを読み解いてみましょう。
class sample2 { public: int func() { return 5; }; }; void Test2() { int (sample2::*mem_ptr)() = &sample2::func; sample2 cSample; printf( "%d\n", (cSample.*mem_ptr)() ); }・まず mem_ptr 。これがメンバ関数ポインタ、つまりメンバ関数のアドレスを格納する変数です。 int (sample2::*mem_ptr)() は、このメンバ関数ポインタが「 sample2 クラスのメンバ関数のうち、戻り値が int で引数なしのメンバ関数のポインタのみ格納できる」ことを示してます。だから同じ戻り値&引数でも他のクラスだと格納できません。逆に言えばこれに合うメンバ関数ならどれも入ります。最初の例で func0 も func1() も入れられるのはこのおかげ。これの書き方は「 戻り値 (属するクラス::*変数名)( 引数 ) 」です。ちょっと複雑やね。 ・このメンバ関数ポインタにアドレスを格納するメンバ関数の指定が &sample2::func です。メンバ関数指定から () を取って & 付けただけ。見ての通り、特定のクラス型変数(つまり sm とか cSample とか)に関係ないのが特徴。で、最後に (cSample.*mem_ptr)() でメンバ関数を呼び出します。 mem_ptr がメンバ関数ポインタ、 cSample が先ほど言ったクラス型変数。この時点で初めて、特定のクラス型変数と、そのクラスが持つメンバ関数とが結びついて呼び出されます。 ・メンバ関数ポインタの特徴は、自由度が高いこと。最初の例みたいにメンバ関数ポインタを配列として入れることで、同じ引数・戻り値のメンバ関数を次々と呼び出すことができます。メンバ関数の「名前」を使わなくていいからね。最初の例だと dat_ptr[] を for ループで呼びまくるとかすれば、わざわざ func0() とか func1() とかって指定せずに呼べるわけですね。 ・次のお便りっ! |
|
・その続き。
|
|
・どうだろう、わても ActiveX にはあまり詳しくないのと、 ActiveX ってゆーと実はかなり広い範囲をカバーするんでその辺が難しいかな。たとえばホームページに貼り付けるプラグインもどきも ActiveX だし。凝ったダイアログコントロールとかは ActiveX コントロール。あとシェルエクステンション関係も ActiveX って含められるかもしんない。
・手元にある本でこの手のことが書いてあるのが Visual C++ 5 パワフルテクニック大全集くらいなんだけど、これにはその ActiveX コントロールの作り方と、プロパティページの追加方法とかが書いてあったりします。でもかなり上級向けかも(汗)。ダイアログに貼り付けて使えるって点で、 ActiveX コントロールを作ってみるのが一番楽しいかもしんない。そういう本って出てそうだし。 ActiveX コントロールは、それを作って VB とかに貼り付けられるから需要高いはず。 ・最後のお便り! |
|
・これは10月5日のですね。 ModifyStyleEx() の第3引数……しまった、何もしない SetWindowPos() を試してなかった(爆)。フツー「1ドット縮小」の前にこれ試すよなー。むぅごめんです。まー解決してよかったです。
・でわまたっ! |
・今日はお休み〜。日記の方にワールドPCエキスポのレビューあるよん。
|
・今日発売のCマガに BCB5.5.1 が付いてました。わては STL & iostream 入門を書いてる関係で VC 以外のコンパイラでもテストする必要が多いんだけど、それにこれまでは gcc for WIN32 ( Cygwin ) を使ってました。んでも、こういうふうに BCB が付いてくると、 BCB の方が何かと便利なこと多いです。ダウンロードの必要がなかったりとか、情報が多かったりとか。日本語ヘルプファイルが付いてるし。
・前にもちょっと書いたけど、コマンドラインコンパイラを VC から便利に使う方法、 BCB 編。メニューの【ツール】−【カスタマイズ】ダイアログの【ツール】ページで C:\Borland\bcc55\Bin\bcb.exe か make.exe を呼び出すようにすればOK。引数の方で $(FileDir)\Main.cpp とかして、常に作成するソースファイル名を同じにするとかすると楽。で、このツールをツールバーに登録すれば、ボタンひとつではいコンパイル。 ・あ、あと[アウトプットウィンドウを使用]をオンにすると便利。コンパイルの結果がアウトプットウィンドウに表示されるからね。で、これと同じ方法で、コンパイル後の実行ファイルを呼び出すようにするとコンソール使わずに出力できるからこれも便利。難点は標準入力が使えないことですな(汗)。なにはともあれ、 VC6 以外のコンパイラを使うと色々発見が多いんでお奨め〜。 ・でわまたっ! |
・ STL & iostream 入門をCodian化してたらミスが見つかりました(汗)。 #06 の iostream で「 seekp( 0, std::ios::cur ) としても、ひとつ前に進んでしまいます」進まねぇ(爆)。何言ってるんだわては、ひとつ進んでるのは直前に文字を書き込んでるからだろーが。あーバカやってるなー。ホームページだとこういうの出してからでも訂正できるけど、まぐまぐのバックナンバーには永久にミスが残ってしまう(泣)。
・で、この関係でサンプルコード作り直してたらさらに問題が(汗)。 std::strstream で seekp( 0, std::ios::end ) すると、最大サイズの最後に来るもの( VC6 )と終端文字のところに来るもの( bcc & gcc )がありました。さらにさらに、 std::streampos が VC6 と bcc じゃクラスなのに gcc だと long 型。 ・ちなみに iostream ベンダは、 VC6 は謎( MS ? Plauger さん?)、 bcc は Rogue 、 gcc は Free Software Foundation 。なんかよく分かんないなー。 STL ベンダは、VC6 は Hewlett-Packard 、 bcc は Rogue 、 gcc は SGI 。つっても Rogue と SGI のは HP 版を元に作られてるから基本は同じ。 iostream もそんな感じになってればいいんだけど、完全テンプレートライブラリじゃないから隠蔽部があってそれがこーなっちゃうんだろうなー。 |
|
・どうなんだろう、あれはたぶん自分で作るしかないんじゃないかなー。似てるのはリバーコントロールとかなんだけど、それであんな感じに実装できるかは不明。分割ウィンドウにはあそこまで自由度あるのかなぁ。一応、困ったときの Codeguru も見てみて。なんか似た感じのがあるかも。そいや Codeguru の日本語版探したんだけどみつかんなかったなー、どこいったんだろ。
・でわまたっ! |
・先日日記の方で「わての知識量は goo と同じ」(最近は「 Google と同じ」かも)とか書いたんだけど、最近ホントそう思うことしきりです。ってゆーのも、今日は就職前研修で情報処理2種レベルの勉強をしてて EDPS ってのが出てきて「なんぞや?」ってことになって。んで検索してみると EDPS についての「生の話」ってゆーか、教科書的でない情報がいっぱい出てくれるんです。こういう情報はすんなりと頭に入るんです、今のいろんな話とかと関連づけられてるから。世の中ホント便利になったもんだ。
・あと今日はプログラミング辞書書いてました。今回も結構粒ぞろいでいい感じです。今ぐらいの単語数がちょうどいいかな。だったら goo に登録しない方がいいかなー、登録すると一見さんが大量に増えるからか一気にどどんと単語数が増えるんだよねー。なんか全文検索って邪魔?<さっきと言ってることが違う! ・でわまたっ! |
・今日はぷらとわ書いてました。今回は API を使ってファイルを開いて書き込むってゆーのなんだけど、これがまた大変だった(汗)。1行ずつ読み込むのとかないから、結局まず全部読み込んでそれを std::strstream で切り取りって形にしちゃいました。結局 iostream のお世話になることに。
・まープログラムはできたんで、あとはその解説を書いていけばいいかな。あと数回はファイル読み書き。そのあとはダイアログコントロールの解説をしていくつもり。コントロールがウィンドウだってことや各コントロールへのアクセス方法、 DDX の仕組みとかについて。あとはレジストリとかかな。そこまで終わるのがいつになるやら(汗)。 ・でわまたっ! |
・今日は就職前研修をしてました。どんなのかは10月14日の日記を見てねん。今日したのは UNISYS の方。「プログラミングの基礎」ってゆーCD−ROMで、テキストと図をブラウジングして章末問題を解くっていう形式。「プログラミングの基礎」の内容はっていうと、たとえば「最初に設計をしてから作るんだよ」とか「フローチャートを作るんだよ」とか「配列はこう使うんだよ」とか「ファイルはこう読み込むんだよ」とか、そーゆーの。
・基本的には言語非依存、だから細かいコーディング手法はなし、概念解説が中心。でもやっぱ解説に言語の特定は必要、ってことでサンプル言語は VB でした。だもんで「イベントドリブンで、各イベントのプロシージャでフローチャートを書く」みたいな感じ。あとは if と while の図とか。確かに解りやすいんだけど、プログラム組みながらじゃないとこれ勉強するのはきついんじゃないかなー。 ・当たり前だけどこれは楽勝で終わらせました。CD−ROMはあと2枚。それより情報処理2種レベルの方が大変だなー。最新のものだけじゃなくて古いのも知ってないといけないから。でもこれもわての方がアドバンテージあるんだもんなー、今の人ってドットインパクトプリンタなんて見たことない人多そうだし。ま、会社入ったらすぐ追い付かれるだろうから、今の記憶リソースを活用しつつ、どんどん先のこと勉強していきましょ。 ・でわまたっ! |
・今日はお便り紹介〜。
|
|
・Cマガ11月号はかなり解りやすそうですね。ここに書いてあるように、本来 COM は「クラスプラグイン」の実装方法のひとつで、仮想関数を関数ポインタの代わりに使うってことが分かればだいたいイメージできると思うです。ただ、それでも使いこなすのは難しいかもしんない(汗)。
・ウィンドウズに最初から入ってるもの…… IShellLink とかのシェルエクステンション系インターフェイスなんかは、使うこと自体が難しいかも(汗)。使い方複雑だしドキュメント英語だし。でもそのへんをクリアすればなんとかなるかも。あとは、 COM を直接使わないで、 COM と同じ仕組みとしてプラグインのシステムを作ってみるとか。そういう練習するといいかもしんない。 ・でわまたっ! |
・今日はお休み〜。
|
・今日はお便りを紹介。ではまずひとつめのお便り。
|
|
・どうもですー。えーっと、まず "default.sty" は _T( "default.sty" ) ってした方がいいかな。そうしないとこの文字列が UNICODE にならないから。でもファイルは開けているみたいですね。次に、 OS はなんでしょーかっていう問題。 Win95 は API が実際には UNICODE に対応してなかったんじゃないかなぁ。 Win98 は不明。 WinNT / 2K は大丈夫なはず。「対応してない」っていうのは、関数そのものはあるんだけど、中身が UNICODE 用の実装になってないってゆーこと。
・あとは表示方法かな、「でたらめ」の確認方法がどうかっていうのがあって、たとえば TRACE() で確認するときには %S でないとダメとかあるし。その辺を確認するためにも、まず UNICODE で書かれたファイルをバイナリー表示して、上のように読み込んで Buffer の中身と見比べてみて「同じ」なら読み込んだときに問題はない、ってことがわかるだろうから。そーやってこつこつ調べてかないと難しいかもしんない。実際、わても UNICODE に関しては複雑そうでちょっと分かんないとこ多い……。 ・もひとつお便り。 |
|
・ホントだ! ControlBar っていうコントロールがあるみたいですね、これを使えばドッキングウィンドウとかできるのかもしんない。でも MSDN に情報皆無(汗)。ネットで探すしかないかも。ユーザー定義メッセージの処理、わてはたいがい CWnd::WindowProc() をオーバーライドしてそのなかで if 使って処理してます。 CWnd::WindowProc() が MFC でのウィンドウプロシージャ代わりってことですな。
・オーバーライドは MFC ClassWizard ダイアログの「メッセージ」の欄に WindowProc があるからこれを選んで「関数の追加」すればOK。あ、 WM_COMMAND ってことは、 CWnd::OnCmdMsg() でも処理できるかも……。 CM_RECEIVE_MESSAGE の値は、そう、 WM_USER を元に決めます。でも使っていい値が決まってたりするんでその辺がめんどいかな。詳しくは WM_USER のリファレンスを参照。 ・ SDK から MFC への送信って、 SDK のと MFC のは別々のアプリですよね。そしたらこれはできないです。 g_RequestBufferMessage は SDK のプロセス内にあるから、 MFC のプロセスからはアクセスできないんで。文字列を送信する方法は面倒なんだよなー、確かシステムに登録してから渡すんだったような……。う”、やりかたすぐ出ないや。……1文字ずつ送るのはやばいか(汗)。 ・でわまたっ! |
・今日もお便り紹介〜。
|
|
・おお、うまくいったみたいですね。 CArchive::ReadString() って1文字ずつ読み込んで処理するみたいです。そこに 0x0a0x00 ( \n\0 かな?)継ぎ足して処理ってことですね。なんか、結局 MFC の複雑さが問題だった気がしないでもない(汗)。こうなったってことは、結局 UNICODE まわりの処理は API の方でされてるってことなのかなー。
・でわまたっ! |
・今日はお休み〜。
|
・今日はずーっと辞書書いてました。昨日から引き続きかも。今回は結構単語数多くてちょっと大変。でもなんとか終わったんで大丈夫そうです。そいや、辞書に WTL というものが送られてきた。どうやら Windows Template Library なるものらしい。あとで Platform SDK からダウンロードしてこよう、ふふふ……。
・でわまたっ! |
・ちょっとお知らせ。今日の更新で、 Codian に iostream の #05 と #06 を載せます。で、その #06 の方、メルマガとして配信した方にミスがあったんで、その辺を直して掲載しています。ちなみに再放送の方も直しておきますんで。出しっぱなしのメルマガとずっと残って更新できるホームページ、メディア結構ちがうのね。
・今日のお便り! |
|
・うーん、わての方でも試してみたんだけど、ちゃんとドラッグで選択できたです。一応リストコントロールは、エクスプローラー的な使い方はデフォルトでできるようになってるはずなんで、もしかしたらなんか設定がどっか変わったりしてるのかも。あとは他の何かが邪魔してるか。こういう時は最初から作ってまずリストコントロールまわりを組んでみて、それでなるかどうかチェックすると結構早道かなと思うです。
・でわまたっ! |
・ WTL 解析したいのにその暇がないわ(泣)な鏑矢です。では今日のお便り。
|
|
・おお、ファイルと同じように COM ポートにアクセスできるとは、知らなかった(爆)。わてって通信とかホントに知らんなぁ……。えーっと、手元にある Win32 システムサービスプログラミングによると、 CreateFile() したあと GetCommState() と SetCommState() を呼んでポートの設定をして、 SetCommTimeouts() と EscapeCommFunction() を呼んで、それから ReadFile() や WriteFile() でアクセスするみたいです。
・なぜかこの本に載ってるサンプルコードと非常に似たコード(汗)があったんでそちらも紹介しておきます。っつーか Codian とか STL & iostream 入門とかどっかでコピられたりしてるんだろーか。いやまーされてないってのも悔しいが(爆)。っと、あとは Google で上記の API で検索すればサンプルコードはいっぱい出てくるし、 MSDN にもあるみたいだからそれ使ってもいいかな。 ・でわまた。 |
・今日はぷらとわと辞書書きました。これまでは使いたくない API の使い方とか書いててちょっと辛かったけど、これからはソースコードへのダイブをするんで結構楽しい(爆)。辞書は相変わらず、結構書き忘れてるとこが送られてきてやっぱ助かるなーと。再確認して改めて気付くこともあるしね。
・いつも迷うんで Platform SDK からダウンロードする方法をメモっときます。米マイクロソフトのダウンロードで Platform SDK 選んでもいっちょ選んで最初のリンクを飛んで Platform SDK Dawnload の Step2 でインストーラーをアップデートしてから Step3 の Download the Platform SDK Setup (x86) now. でセットアップ用アプリをダウンロード。んでこれを実行してツリー表示の中から Sourcecode/WTL を選んで次を選んで……なんかダウンロードサイズ大きいし途中で中止しちゃったし(汗)。でも WTL 自体は落とせたんでOK。しかし使う暇がない(泣)。 ・でわまたっ! |
(C)KAB-studio 2000 ALL RIGHTS RESERVED. |