1.
Cの関数呼び出しは、アセンブリとして見るとどんなコードになっているのでしょうか?
2.
http://oshiete1.goo.ne.jp/qa5750174.html
すみませんが、上記質問「サンク方式について」の続きとして質問させて頂きます。
http://mentai.2ch.net/prog/kako/957/957341074.html
cb=(WNDPROC)VirtualAlloc(NULL,10+5 , MEM_COMMIT, PAGE_EXECUTE_READWRITE);
char *b=(char*)cb; //コールバックゲートをこしらえる
*b++= 0xC7; *b++= 0x05; //MOV [adr],xxxx
*((int *)b)++=(int)(&callbackSelf); //メモリアドレス
*((int *)b)++=(int)this; //オブジェクトアドレス
*b++= 0xE9; //jump long xxxx
*((int *)b)= ((int)WndProcGate)-(4+(int)b);//ジャンプ先
リンク先の79レス目のコードを一部抜粋致しました。
おそらくMOV命令からオブジェクトアドレス代入までが実行環境の切替か調整を行ってる部分と思うのですが、これらの値を入れる事で結果どういう作用があるのでしょうか?
また、この疑問に関する内容の書籍なりサイトがございましたら、そちらも紹介して頂けるとありがたいです。
No.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()をオーバーライドできるようにするための仕掛けのようです。
オブジェクト指向とかウィンドウプログラミングの知識がないと何のことだか分からないでしょう。
この回答への補足
改めてsalsberryさん、回答ありがとうございました。
もう新しい回答もなさそうなので、自分なりの結論を書いて締めようと思います。
マシンコードを直接打ち込む方法は面白く大変勉強になりました。
でも使う分には、やっぱり私の書いたコードで十分ですね。多分。
ありがとうございます。
dumpbinとclの事は知らなかったのですが、これ本当に便利ですね。
おかげさまで疑問のほとんどがclだけで解決しました。
以下、参考にしたサイトを載せておきます。
[起動方法]
http://d.hatena.ne.jp/uox/20080302/p2
[dumpbin]
http://d.hatena.ne.jp/language_and_engineering/2 …
http://www.xlsoft.com/jp/products/intel/cvf/docs …
[cl]
http://besky-works.spaces.live.com/Blog/cns!555C …
http://msdn.microsoft.com/ja-jp/library/367y26c6 …
>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;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
C++のfor文について
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
C++でboolにintの値を代入する...
-
main.c:7:43: warning: implici...
-
変数の型を定義しなかった場合...
-
void func( void )について
-
int main の前のint add(int a,...
-
直接アドレス指定のポインタの...
-
intとINTの違いは?
-
構造体の要素すべてに対する四...
-
構造体
-
visualstudio C# テキストボッ...
-
エラー「invalid conversion fr...
-
inline
-
C++ Builderでのpublic変数の扱...
-
gccのエラー "initialization d...
-
戻り値の型??
-
typedef enumの使い方を教えて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
typedef enumの使い方を教えて...
-
C++でboolにintの値を代入する...
-
関数の実体定義にヘッダファイ...
-
main.c:7:43: warning: implici...
-
構造体の要素すべてに対する四...
-
変数の型を定義しなかった場合...
-
void func( void )について
-
【#define】 defineで定義した...
-
VC6でlong longでエラー?
-
0除算を判定したい
-
プログラムの中で別のmainを呼...
-
C言語のコンパイルエラー
-
構造体の宣言でエラーが出ます。
-
intとINTの違いは?
-
DLLでLIBファイルが作成されない
おすすめ情報