
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- WordPress(ワードプレス) wordpressでphpを読み込みたい 1 2022/10/30 23:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
visualstudio C# テキストボッ...
-
C++の分割コンパイルについて
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
変数の型を定義しなかった場合...
-
DDVによるメッセージの変更
-
main.c:7:43: warning: implici...
-
C言語 宣言した変数になにも代...
-
int void (main)の意味・・・
-
構造体を生成時にわざわざ初期...
-
sshdログの意味
-
void func( void )について
-
intとINTの違いは?
-
C言語の課題について
-
c++からdll内の関数を呼ぶ記述...
-
inline
-
関数の実体定義にヘッダファイ...
-
64bit → 32bit型へのキャスト
-
戻り値の型??
-
Aの値からBの値を除するとは??
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
main.c:7:43: warning: implici...
-
2重定義って??
-
変数の型を定義しなかった場合...
-
C++でboolにintの値を代入する...
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
ハンドルされていない例外が発...
-
void func( void )について
-
C言語のコンパイルエラー
-
enumについて
-
関数の実体定義にヘッダファイ...
-
C言語 宣言した変数になにも代...
-
C++ クラスをメンバにもつクラ...
-
プログラムの中で別のmainを呼...
-
sshdログの意味
おすすめ情報