- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:サンク(Cの関数呼び出し)について その2)
サンク(Cの関数呼び出し)について その2
このQ&Aのポイント
- Cの関数呼び出しは、アセンブリとして見るとどんなコードになっているのでしょうか?
- cb=(WNDPROC)VirtualAlloc(NULL,10+5 , MEM_COMMIT, PAGE_EXECUTE_READWRITE); char *b=(char*)cb; *b++= 0xC7; *b++= 0x05; *((int *)b)++=(int)(&callbackSelf); *((int *)b)++=(int)this; *b++= 0xE9; *((int *)b)= ((int)WndProcGate)-(4+(int)b); リンク先の79レス目のコードを一部抜粋致しました。 おそらくMOV命令からオブジェクトアドレス代入までが実行環境の切替か調整を行ってる部分と思うのですが、これらの値を入れる事で結果どういう作用があるのでしょうか?
- この疑問に関する内容の書籍なりサイトがございましたら、そちらも紹介して頂けるとありがたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
1. 適当なCのプログラムを逆アセンブルしてみるなり、Cコンパイラからアセンブリ言語のファイルを出力させたりして、ご自分で見てみればいいのでは? Windows用のVisualC++を使っている場合は > dumpbin /disasm FILENAME.obj とか > cl /FA /FaFILENAME.asm /c FILENAME.c とか。 2. そのcbから始まるアドレスに書き込まれたコードでやっていることは、 Win構造体のcallbackSelfメンバーに、thisオブジェクトのポインタを書き込む WndProcGate関数へジャンプする の2つです。 この状態でcbのアドレスを呼び出すと、WndProcGateを経由してWndProc関数が呼び出されます。 > これらの値を入れる事で結果どういう作用があるのでしょうか? makeClass()を呼んだときのthisによって、コールバックのときに実行されるWndProc()を切り替えられるようにしています。Winを継承してWndProc()をオーバーライドできるようにするための仕掛けのようです。 オブジェクト指向とかウィンドウプログラミングの知識がないと何のことだか分からないでしょう。
お礼
ありがとうございます。 dumpbinとclの事は知らなかったのですが、これ本当に便利ですね。 おかげさまで疑問のほとんどがclだけで解決しました。 以下、参考にしたサイトを載せておきます。 [起動方法] http://d.hatena.ne.jp/uox/20080302/p2 [dumpbin] http://d.hatena.ne.jp/language_and_engineering/20081008/1223384382 http://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg26_10_02.htm [cl] http://besky-works.spaces.live.com/Blog/cns!555CF2E2F9E31C71!499.entry http://msdn.microsoft.com/ja-jp/library/367y26c6(VS.80).aspx >makeClass()を呼んだときのthisによって、コールバックのときに実行されるWndProc()を切り替えられるようにしています。Winを継承してWndProc()をオーバーライドできるようにするための仕掛けのようです。 ところで、これってサンクを応用しなくても以下のコードで十分なような気がします。 makeClass()のような実装にするのは、何か意味があるのでしょうか? class A{ public: A(){ callback = this; } virtual void CallBack(){ cout << "A" << endl; } static void CallBackGate(){ callback->CallBack(); } static A* callback; }; A* A::callback;
補足
改めてsalsberryさん、回答ありがとうございました。 もう新しい回答もなさそうなので、自分なりの結論を書いて締めようと思います。 マシンコードを直接打ち込む方法は面白く大変勉強になりました。 でも使う分には、やっぱり私の書いたコードで十分ですね。多分。