したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

管理人の独り言(プログラミング関連)

1みみず★:2008/08/10(日) 23:28:15
あまりにもプログラミングの内容が増えすぎた。
よって隔離スレの中を更に隔離。

2774さん:2008/08/10(日) 23:32:49
このスレは、
Sleipnir 50%、プログラミング 50%で出来ています。

3774さん:2008/08/10(日) 23:34:49
Sleipnirの戻る、進むの復元はそのページが全て読み込まれてから行われる。
JavaScriptで例えるならば、
window.onload
のタイミングである。
よって、画像の読み込みも全て含めてから復元が行われる。
ただ、此れは瞬間的に読み込まれるサイトならば問題ないのだが、
画像が一杯のサイトだと復元できるまでの所要時間が長すぎる。
是非ともタブを復元した瞬間に前後移動が出来るようにして欲しい。

4774さん:2008/08/11(月) 02:08:37
スーパープログラマーへの道
http://www.sun-inet.or.jp/~yaneurao/rsp/rsp48to4F.html
----
トリプルバッファリング。
それと描画の部分は関数ポインタにしてやるっていうのも俺の妄想と一緒だなあ。

5774さん:2008/08/11(月) 02:12:19
以下全て引用
-----
第4F回 正確な60FPSの実現(ウエイトタイマ構成法) 99/6/8

どことなくマニアックになってきた、この連載であるが、今回は、正確な60FPS(秒間60フレーム)を実現するためのウエイトタイマ(時間待ち)ルーチンについて説明する。

よく、タイミングはDirectDrawでflipすれば速いマシンなら60FPSになるので、それで調整するという人もいるが、これは、

1.遅いマシンでは60FPSにならない(タイミングが必要ならtimeGetTimeで調整すべき。第49回参照)
2.Flipは、使わないほうが無難。(第44回参照)
3.画面のリフレッシュレートは60Hzとは限らない。

という3つの理由で間違っている。

あと、正確に60FPS刻むような待ち時間を計算できない人がよくいるが、以下のソースを見れば、なんとなくコツがつかめるはずである。コツとしては、

1.システムに負荷をかけないよう、余分な時間はSleepする。(Sleepの精度を考慮に入れて、直前まではSleepさせない)
2.今回の待ち時間は、1000/FPSとやってしまうと、端数分だけおかしくなる
3.かと言って、精度を出すためにdouble型で今回の待ち時間を計算するのは少し、無駄

の3ポイントぐらいであろう。速いマシンで正確に60FPSを刻まないのは、この待ち時間の消費のさせかたが間違っているからである。描画(blt)の直前にこのルーチンを呼べば、必ず安定して、指定のFPSになる。


--------------------------------------------------------------------------------

void ys::ElapseTime(void){ // (C)yaneurao 1998-1999
// 厳粛かつ正確かつ効率良く時間待ちをする

if (iFPS == 0) return ; // Non-wait mode

static DWORD lastdraw = 0; // 前回の描画時刻
// (不運にも第一発目のtimeGetTime() == 0とかゆーこともあるが、それは構わない)

DWORD t = timeGetTime(); // 現在時刻

dwFPSWaitTT = (dwFPSWaitTT & 0xffff) + dwFPSWait; // 今回の待ち時間を計算

// dwFPSWaitは、待ち時間の小数以下を16ビットの精度で持っていると考えよ
// これにより、double型を持ち出す必要がなくなる。
// dwFPSWaitTT = 1000 * 0x10000 / FPS;である

DWORD dwWait = dwFPSWaitTT >> 16; // 結局のところ、今回は何ms待つねん?

// 1フレーム時間を経過しちょる。ただちに描画しなちゃい!
DWORD dwElp = (DWORD)(t - lastdraw); // 前回描画からいくら経過しとんねん?
if (dwElp>=dwWait) {
lastdraw = t;
return ;
}

// ほな、時間を潰すとすっか!

// まだ時間はたっぷりあるのか?
// 4ms以上消費する必要があるのならば、Sleepする
if (dwWait-dwElp >= 4) Sleep(dwWait-dwElp-3);
// いまdwWait>dwElpなのでdwWait-dwElp>=0と考えて良い

// 95/98/NTで測定したところSleep(1);で1ms単位でスリープするのは可能
// ただし、実装系依存の可能性もあるのでSleepの精度は3ms以内と仮定

while ((timeGetTime()-lastdraw)<dwWait) ;
// ループで時間を潰す(あまり好きじゃないけど)

// これで、時間つぶし完了!

lastdraw += dwWait; // ぴったりで描画が完了した仮定する。(端数を持ち込まないため)
}


--------------------------------------------------------------------------------

しかし、きちっと、このようなFPS調整のための時間待ちルーチンを書いている人を見たことがない。

小数点以下をdoubleで表記するのではなく、256倍や65536倍して整数で代用するのは、常用テクなのだが、意外と知らない人が多い。もっとも、なんでもかでも1命令1クロックで実行してしまう最近のCPUではあまり意味のないことなのかも知れない。しかし、最近のプログラマは、lineやcircleをアセンブラで実装した経験が無いのか?cos,sinを65536倍した整数テーブルをいじくり回すプログラムを書かないのか?そんな人たちが3Dでぐりぐり動くゲームを作っているのか?!まったくもって驚きである。8月に恐怖の大王が来るというよりは、65536倍衝撃的なんだってば!!

6774さん:2008/08/11(月) 14:56:27
int main(int argc, char **argv){
const int count = 100;
const int * const p = &count;
const int * const * const pp = &p;
const int * const * const *ppp = &pp;
}

7774さん:2008/08/11(月) 15:15:06
>>http://jbbs.livedoor.jp/bbs/read.cgi/computer/38153/1205557370/492
が大体理解できた。
---
メタ関数::テンプレート・メタプログラミング
http://cppemb.blog17.fc2.com/blog-entry-90.html
---
のおかげ!

8774さん:2008/08/12(火) 01:31:44
JavaScript:document.body.innerHTMLのガイドライン4
http://society6.2ch.net/test/read.cgi/gline/1171265251/122
---
122 :水先案名無い人:2007/11/02(金) 12:04:48 ID:7m0B59Ki0
ちょっと趣旨違うと思うけど

①メモ帳開く

②以下の文を貼りつける

<body onKeyDown=K=event.keyCode><script>X=[Z=[B=A=12]];h=e=K=t=P=0;function Y()
{C=[d=K-38];c=0;for(i=4;i--*K;K-13?c+=!Z[h+p+d]:c-=!Z[h+(C[i]=p*A-Math.round(p/
A)*145)])p=B[i];!t|c+4?c-4?0:h+=d:B=C;for(f=K=i=0;i<4;f+=Z[A+p])X[p=h+B[i++]]=1
if(e=!e){if(f|B){for(l=228;i--;)Z[h+B[i]]=k=1;for(B=[[-7,-20,6,17,-9,3,6][t=++t
%7]-4,0,1,t-6?-A:-1];l--;h=5)if(l%A)l-=l%A*!Z[l];else for(P+=k++,j=l+=A;--j>A;)
Z[j]=Z[j-A]}h+=A}for(i=S="";i<240;X[i]=Z[i]|=++i%A<2|i>228)i%A?0:S+="<br>",S+=X
[i]?"■":"_";document.body.innerHTML=S+P;Z[5]||setTimeout(Y,99-P)}Y()</script>

③html形式で保存して、起動する
---
テトリス。

9774さん:2008/08/12(火) 02:26:04
ブラウザでc言語 part1‐ニコニコ動画(夏)
http://www.nicovideo.jp/watch/sm3702138
---
codepad
http://codepad.org/
---
こんなサイトがあったのか・・・

10774さん:2008/08/15(金) 11:51:04
プログラミングキャンプの講義資料を公開します - IT戦記
http://d.hatena.ne.jp/amachang/20080814/1218677014

11774さん:2008/08/15(金) 11:51:40
>>10
正直なところ、
全体のフィールドと、あるブロックを同じ関数で描画させる方法は凄いなと思った。

12774さん:2008/08/15(金) 13:41:20
俺もゲームプログラミングを本格的に始めるべきなのか。
でも普通のプログラミングも出来ないのにどうすればいいんだああああああああああああああああああああああ

13774さん:2008/08/15(金) 22:03:25
ちょwwwwwwwwwwwwwww
----
素人がプログラミングを勉強するブログ
http://d.hatena.ne.jp/javascripter/
----
こいつ中学生wwwwwwwwwwwwww

14774さん:2008/08/15(金) 22:26:15
>>13
っ!
俺も中学生の時ちゃんとプログラミングを勉強しておかないといけなかったっ!

15774さん:2008/08/20(水) 17:35:38
>>14
取り敢えず最新の仕様を勉強してYahoo!したいと思う。
__noSuchなんとか__とか、
__proto__とか
__defineGetter__とか
__defineSetter__とか
function.next()とか頑張って覚えちゃうぞー!

16774さん:2008/08/20(水) 17:36:14
と言って、殆ど分かっているつもりなんだけれども。
配列の分割代入って面白いの?

17774さん:2008/08/20(水) 17:43:21
サブクラス化したウィンドウに対してウィンドウ毎に変数を確保する方法は直接無い。
SetWindowLongPtr()とかを使おうとしても、自分でExtraなメモリを確保していないし、元々内部で使用しているかもしれない。
だから無理である。
しかし、EditBoxに対して、Ctrl+Aを押したときに全て選択だとかはみなロジックは一緒なので、サブクラス化するためごとに関数を用意するというのもとてもソースの無駄遣いである。
だからそこらへんアセンブリ言語レベルでどうにかならないかなと思って適当に書いて、二時間ぐらいかけて上手くいった。
時間かかりすぎだろうJK。
&nbsp;が利用できるかテスト。

18774さん:2008/08/20(水) 17:45:07
void *SetProcMod(
&nbsp;&nbsp;LRESULT (CALLBACK *proc)(LPVOID, HWND, UINT, WPARAM, LPARAM),
&nbsp;&nbsp;SIZE_T bytes = 0
) const
{
&nbsp;&nbsp;static const BYTE code[] = {
&nbsp;&nbsp;&nbsp;&nbsp;0x53,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PUSH EBX
&nbsp;&nbsp;&nbsp;&nbsp;0x89, 0xE3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//MOV EBX, ESI
&nbsp;&nbsp;&nbsp;&nbsp;0x81, 0xC3, 0x04, 0x00, 0x00, 0x00,&nbsp;&nbsp;//ADD EBX, 4
&nbsp;&nbsp;&nbsp;&nbsp;0xB8, 0x00, 0x00, 0x00, 0x00,&nbsp;&nbsp;&nbsp;&nbsp;//MOV EAX, imm32
&nbsp;&nbsp;&nbsp;&nbsp;0x87, 0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//XCHG EAX, [EBX]
&nbsp;&nbsp;&nbsp;&nbsp;0x5B,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//POP EBX
&nbsp;&nbsp;&nbsp;&nbsp;0x50,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PUSH EAX
&nbsp;&nbsp;&nbsp;&nbsp;0xB8, 0x00, 0x00, 0x00, 0x00,&nbsp;&nbsp;&nbsp;&nbsp;//MOV EAX, imm32
&nbsp;&nbsp;&nbsp;&nbsp;0xFF, 0xE0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//JMP EAX
&nbsp;&nbsp;};
&nbsp;&nbsp;
&nbsp;&nbsp;BYTE *p = (BYTE *)VirtualAlloc(
&nbsp;&nbsp;&nbsp;&nbsp;NULL,
&nbsp;&nbsp;&nbsp;&nbsp;sizeof(code) + sizeof(WNDPROC) + bytes,
&nbsp;&nbsp;&nbsp;&nbsp;MEM_COMMIT,
&nbsp;&nbsp;&nbsp;&nbsp;PAGE_EXECUTE_READWRITE
&nbsp;&nbsp;);
&nbsp;&nbsp;
&nbsp;&nbsp;memcpy(p, code, sizeof(code));
&nbsp;&nbsp;
&nbsp;&nbsp;*((DWORD *)(p + 10)) = (DWORD)(p + sizeof(code) + sizeof(WNDPROC));
&nbsp;&nbsp;*((DWORD *)(p + 19)) = (DWORD)proc;
&nbsp;&nbsp;*((WNDPROC *)(p + sizeof(code))) = SetProc((WNDPROC)p);
&nbsp;&nbsp;
&nbsp;&nbsp;return p + sizeof(code) + sizeof(WNDPROC);
}

19774さん:2008/08/20(水) 17:48:29
codeは雛型。
codeとWNDPROC型と指定されたバイト数のメモリを確保し、実行、読み込み、書き込みを許可する。
次に雛形をコピー。
そして、必要な情報を書き込んだ後、サブクラス化を実行する。
そして、確保されたメモリのポインタを返すと。

20774さん:2008/08/20(水) 17:51:01
こうすると、procの第一引数に確保されたメモリのポインタが入っている。
また、次に呼び出すプロシージャのアドレスは、pを渡されたアドレスだとすると。
*(((WNDPROC *)p) - 1)
で取得できるという代物だ。
此れで態々グローバル変数を利用する必要が無くなる。
メモリの管理についてはもう少し良い方法があるが、64kb程しか一回にリークしないので問題ないかと。
此れでソースが少なくてすむね!

21774さん:2008/08/20(水) 17:57:09
というか、二時間というのはバイトコードの打つ方法に時間がかかった。
Intelの資料糞読みにくい。

22774さん:2008/08/20(水) 18:00:45
何故[ESP]を直接参照する方法が無いんだ!
0x89, 0xE3, //MOV EBX, ESI

0x89, 0xE3, //MOV EBX, ESP
の間違えですた。

23774さん:2008/08/20(水) 18:01:57
[ESP]を直接参照できればもう少しソースコードを短くすることが出来るのだがなあ。
というか此れ自体も適当に入力したので、もうちょっと短く出来るのかもしれない。

24774さん:2008/08/20(水) 18:09:44
一応、返却値として、その確保されたメモリへのポインタを返しているので、
bytesに適当な値を指定したら、
*((int *)p) = 123;
とかすれば、初期状態で変数を与えることも出来るねえと。
因みに、VirtualAllocの仕様上メモリの内容は0で初期化されてます。

25774さん:2008/08/20(水) 18:10:26
と言うことで、此れをMemoPanelに利用しようかなあと。
環境依存だから動かない環境があるかなあ?

26774さん:2008/08/20(水) 18:42:44
おしゃべり総合商社「ネイリー」
http://narude531masu.blog59.fc2.com/
---
P検なんてあったなあ。
なつかしす。
今じゃ要らない資格ですね。因みに俺は四級のはず。
Wordとかエクセルは全然使わないんだけれどもwwww

27774さん:2008/08/20(水) 19:55:58
うはwww、VirtualAlloc関数滅茶苦茶メモリ勿体無いwwwww
ちゃんとメモリ管理はした方が良いようですwwwww

28774さん:2008/08/20(水) 21:58:36
operator new[]で確保したメモリは実行できることが保証されているの?
良く分からんwww

29 ◆rCEzuNnL0g:2008/08/21(木) 18:40:10
Sleipnir.APIが利用できれば、かなりスクリプト+EXEで色々と正確に出来そう。
正確というのは、違うウィンドウとかに効果を起こさないとかそんなことね。

Sleipnir.API.Handleを見ればウィンドウハンドルが分かるので、GetWindowThreadProcessId()を利用すればプロセスIDを取得することが出来る。
で、そこでOpenProcess()を利用すれば、プロセスハンドルを取得できる。
という事で、此れを利用すれば色々とウマーなことが出来るのはではなかろうかと。
VirtualAllocEx()とか使ったり、WriteProcessMemory()とか使うとウマーじゃなかろうか。
まあここら辺でも見ればいいかと。
-----
常駐プログラム隠蔽テクニック
http://ruffnex.oc.to/kenji/text/dll_inj/
-----

30 ◆rCEzuNnL0g:2008/08/21(木) 18:42:56
---
ProcessHandle_ProcessID_WindowHandle - trick-with-Wiki
http://wiki.trick-with.net/ProcessHandle_ProcessID_WindowHandle.html
---
プロセスIDとプロセスハンドルとウィンドウハンドルの件
良いサイト発見!

31 ◆rCEzuNnL0g:2008/08/21(木) 20:40:14
次の JavaScript の仕様はこうなる! ECMAScript 3.0 から 3.1 への変更点まとめ - IT戦記
http://d.hatena.ne.jp/amachang/20080821/1219302804
---
ちょwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
IEでもgetter、setter始まったなwwwwwwwwwwwwwwwwwwwwwwwwww
まだちょっと理解できていない部分があるので、これから勉強を。

32 ◆rCEzuNnL0g:2008/08/21(木) 20:43:39
__defineGetter__、__defineSetter__
で定義したGetter,Setterはfor inで列挙できるみたい。
まあ、どうでもいいことか。

33 ◆rCEzuNnL0g:2008/08/21(木) 20:47:13
MemoPanelに検索機能があったほうがウマーかなあ。

34 ◆rCEzuNnL0g:2008/08/21(木) 20:56:33
>>29
スクリプトからEXEを起動するには、
new ActiveXObject("WScript.Shell").Run()
で。
---
1.10 プログラムを実行する、ファイルやフォルダを開く(Runメソッド) - VBScript & JScript(JavaScript) Tips for WSH
http://www.happy2-island.com/vbs/cafe02/capter00110.shtml
---

35 ◆rCEzuNnL0g:2008/08/21(木) 20:58:41
最近Sleipnir関連のtwitterの動きが熱すぎるw

36 ◆rCEzuNnL0g:2008/08/21(木) 21:00:58
正直な所、キャッシュポッドパネルがspxプラグインだったのは吹いたw
sqlite3.dllも使ってみるか?

37 ◆rCEzuNnL0g:2008/08/21(木) 22:12:23
SUB ESP, 4
PUSH EAX
PUSH EBX
ADD ESP, 12
MOV EAX, imm32
POP EBX
PUSH EAX
PUSH EBX
SUB ESP, 8
POP EBX
POP EAX
JMP cd

38 ◆rCEzuNnL0g:2008/08/21(木) 22:24:12
0x81, 0xEC,&nbsp;&nbsp;&nbsp;&nbsp;0x04, 0x00, 0x00, 0x00&nbsp;&nbsp;&nbsp;&nbsp;//SUB ESP, 4
0x50,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PUSH EAX
0x53,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PUSH EBX
0x81, 0xC4, 0x0C, 0x00, 0x00, 0x00&nbsp;&nbsp;&nbsp;&nbsp;//ADD ESP, 12
0xB8, 0x00, 0x00, 0x00, 0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//MOV EAX, imm32
0x5B,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//POP EBX
0x50,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PUSH EAX
0x53,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PUSH EBX
0x81, 0xEC,&nbsp;&nbsp;&nbsp;&nbsp;0x08, 0x00, 0x00, 0x00&nbsp;&nbsp;&nbsp;&nbsp;//SUB ESP, 8
0x5B,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//POP EBX
0x58,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//POP EAX
0xE9, 0x00, 0x00, 0x00, 0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//JMP cd

39 ◆rCEzuNnL0g:2008/08/21(木) 22:44:01
今までは、EAXレジスタとEBXレジスタを利用して、引数を積んでいたが、
EAXレジスタの値が変わってしまっていた。
という事でEAXレジスタの内容も変わらないようにした。
それが上のアセンブリ。

40 ◆rCEzuNnL0g:2008/08/21(木) 23:18:11
取り敢えず、やりたいことはやったので、(本当はもう一つあるのだが、スクリプトで代用可能)
一部環境で起動出来ない問題を究明したい。

sqlite3.dllがエクスポートしている関数は0x64個か・・・
結構少ないなあ。

41 ◆rCEzuNnL0g:2008/08/21(木) 23:23:34
因みにFenrirLib.fxがエクスポートしているのは0x0729個。
vcl100.bplは0x1D19個。

取り敢えずfxプラグインは、FPI_CreateInstanceをエクスポートすれば良いみたい。

42 ◆rCEzuNnL0g:2008/08/21(木) 23:25:46
_FPI_CreateInstance@4
って何だ?

43 ◆rCEzuNnL0g:2008/08/21(木) 23:29:42
あ、MemoPanel.spxも
SPX_GetPluginInfo
SPX_Initialize
_SPX_GetPluginInfo@0
_SPX_Initialize@4
の四つをエクスポートしていた。
下の二つが何かが気になるなあ。

44 ◆rCEzuNnL0g:2008/08/21(木) 23:30:18
@の後は、引数の数*4だと思われ。

45 ◆rCEzuNnL0g:2008/08/21(木) 23:31:01
FPI = Fenrir Plugin Interface?

46 ◆rCEzuNnL0g:2008/08/21(木) 23:32:58
JIT Actionsも含めて全て、
FPI_CreateInstanceを呼んでいる。

47 ◆rCEzuNnL0g:2008/08/22(金) 18:43:34
レンコン=拳銃… ネット隠語検知 「犯罪」を防止 総務省がソフト開発へ:ニュース - CNET Japan
http://japan.cnet.com/news/media/story/0,2000056023,20379040,00.htm?ref=rss
---
備忘録。メモ。

48 ◆rCEzuNnL0g:2008/08/22(金) 21:04:01
これがC++のソースなんだぜ?
-----
const BYTE *p = ((BYTE *)_p - sizeof(WNDPROC) - sizeof(void *));
SetProc(*((WNDPROC *)(p + sizeof(void *))));
void * const p_code = (void *)(*((DWORD *)p));
void * const base = (void *)((DWORD)p_code & 0xFFFF0000);
SIZE_T * const used = (SIZE_T *)base;
const SIZE_T code_size = *((SIZE_T *)((BYTE *)base + sizeof(SIZE_T)));
BYTE ** const p_p = *((BYTE ***)((BYTE *)base + sizeof(SIZE_T) + sizeof(SIZE_T)));
void * const now_base = (void *)((DWORD)*p_p & 0xFFFF0000);

49 ◆rCEzuNnL0g:2008/08/23(土) 16:27:15
SPXプラグインからアクションを実行する方法を考え中。

50 ◆rCEzuNnL0g:2008/08/23(土) 17:03:16
取り敢えずFenrirLibは大量のクラスを出力しているっぽいので、メンバ変数とメンバ関数の解析を・・・

51 ◆rCEzuNnL0g:2008/08/23(土) 17:06:44
DLLの活用
http://www5a.biglobe.ne.jp/~javajava/ari/30bcc/kimitu/kimitu03.html
---
を参考にして、規則性を解読する。

52 ◆rCEzuNnL0g:2008/08/23(土) 17:12:04
-----
private:
string str;
public:
test_class();
void set_str(string &s);
void show();
-----
??0test_class@@QAE@ABV0@@Z
??0test_class@@QAE@XZ
??1test_class@@QAE@XZ
??4test_class@@QAEAAV0@ABV0@@Z
?func@@YAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z
?set_str@test_class@@QAEXAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z
?show@test_class@@QAEXXZ
-----

53 ◆rCEzuNnL0g:2008/08/23(土) 17:17:21
>>52
駄目です!僕には解読できません><

最近稀に、フィードバックエージェントが出ずにSleipnirが華麗に落ちるときがあるなあ。
間違えて、閉じるを押してしまっているとは到底思えれないし。
何故だ!

54 ◆rCEzuNnL0g:2008/08/23(土) 17:34:27
取り敢えず自分でクラスをエクスポートしたDLLを作ってみた。
上手く行った。上手いもんだなあ。

55 ◆rCEzuNnL0g:2008/08/23(土) 17:38:44
VC++で作ってみた
---
序数: 0001 名前: ??0test_class@@QAE@ABV0@@Z
序数: 0002 名前: ??0test_class@@QAE@XZ
序数: 0003 名前: ??1test_class@@QAE@XZ
序数: 0004 名前: ??4test_class@@QAEAAV0@ABV0@@Z
序数: 0005 名前: ?func@@YAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z
序数: 0006 名前: ?set_str@test_class@@QAEXAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z
序数: 0007 名前: ?show@test_class@@QAEXXZ
----
一緒だwww

56 ◆rCEzuNnL0g:2008/08/23(土) 17:55:05
うーん。
この情報を見ただけでは、そのクラスがメンバ変数に何を持っているのは分からないんだよなあ。
分かれば、メモリを確保して、ecxレジスタにポインタを入れて、普通に呼び出せば良いのだが・・・

57 ◆rCEzuNnL0g:2008/08/23(土) 17:56:19
??0test_class@@QAE@ABV0@@Z
??0test_class@@QAE@XZ
??1test_class@@QAE@XZ
??4test_class@@QAEAAV0@ABV0@@Z
がコントラスタなのかな?
通常は、
引数なしのコントラスタ。
コピーコントラスタ。
が作られるんだったけなあ。
もう忘れた。

58 ◆rCEzuNnL0g:2008/08/23(土) 17:57:24
だけれども、
str.match(/??[0-9]([^@]+)@@/);
RegExp.$1でクラスの名前は少なくとも取得できるなあ。

59 ◆rCEzuNnL0g:2008/08/23(土) 18:02:36
取り敢えず、手動で列挙してみる。

FActionData
FButton
FButtonEx
FButtonState
FByteArrayInputStream
FByteArrayOutputStream
FCharConv
FClientDC
FCmdUI
FColorManager2
FColorManager3
FColorManager
FComboBox
FComboEdit
FComboListBox
FCustomDialog
FCustomDialogEx
FDataInputStream
FDataOutputStream
FDropDownButton
FEdit
FFileInputStream
FFileOutputStream
FFrameSkinManager
FGZip
FGlobal
FGuiManager
FHistoryData
FHoldWnd
FHttpConnection
FImageList
FIniProfile
FMemoryDC
FMenuBar
FObject
FOptionDialogData
FOwnerDrawItem
FOwnerDrawMenu
FPaintDC
FPlugin
FPluginItem
FProgressBar
FReBar
FRotineChecker
FSearchEngine
FSearchItemCombo
FSearchItemList
FSetting
---100行目まで---

60 ◆rCEzuNnL0g:2008/08/23(土) 18:06:09
FSiSu
FSkinItem
FSmartInstallerItemBase
FSmartInstallerManager
FSpliter
FStartupRotineChecker
FStatic
FStatusBar
FStatusBarEx
FStatusBarItemData
FStdMemoryManager
FString
FStringIdManager
FThemeManager
FThemeMap
FToolBar
FToolBarButtonData
FToolBarButtonDataEx
FToolBarEx2
FToolBarEx3
FToolBarEx
FToolInfo
FToolTipCtrl
FTreeCtrl
FTreeCtrlEx2
FWaitCursor
FWebDataObjectAnalyzer
FWebDataSourceFactory
FWindowDC
FWnd
FXmlDocument
FXmlElement

61 ◆rCEzuNnL0g:2008/08/23(土) 18:07:37
$FDCT
というのがあるのだが、よくわからん・・・

62 ◆rCEzuNnL0g:2008/08/23(土) 18:08:49
取り敢えずメンバ関数も手動で列挙してみる。

63 ◆rCEzuNnL0g:2008/08/23(土) 18:18:40
?$FDCT::AboutDoc()
?$FDCT::AboutPath()
FToolTipCtrl::Activate()
FImageList::Add(,) (四つオーバーロードされている)
FCustomDialog::AddButtonInfo(,)
FCustomDialogEx::AddButtonInfo(,)
FXmlDocument::AddElement(,,,)
FSiSu::AddEntry(,,)
FCustomDialogEx::AddImageInfo(,,)
FSearchItemCombo::AddItem(,)
FSearchItemList::AddItem(,)
FIniProfile::AddKey(,,)
FCustomDialog::AddLink(,,)
FCustomDialogEx::AddLink(,,)
?$FDCT::AddMetaFileComment(,)
FOwnerDrawMenu::AddOwnerDrawSeparator(,,)
FOwnerDrawMenu::AddOwnerDrawSubMenu(,,,,)
FOwnerDrawMenu::AddOwnerDrawText(,,,)
FGuiManager::AddPreTransChain(,)
FActionData::AddRef()

体が持たないので、以下省略

64 ◆rCEzuNnL0g:2008/08/23(土) 18:22:17
一応__thiscallについて復習しておくと、
固定長の引数の場合は、スタックへ最後の引数から積み、thisポインタはecxレジスタへ。
可変長の引数の場合は、スタックへ最後の引数から積み、thisポインタは最後にスタックに積む。
で良いと思う。

65 ◆rCEzuNnL0g:2008/08/23(土) 18:22:37
マイクロソフトの資料から引用。
The __thiscall calling convention is used on member functions and is the default calling convention used by C++ member functions that do not use variable arguments. Under __thiscall, the callee cleans the stack, which is impossible for vararg functions. Arguments are pushed on the stack from right to left, with the this pointer being passed via register ECX, and not on the stack, on the x86 architecture.

66 ◆rCEzuNnL0g:2008/08/23(土) 18:26:07
variable:[形]可変の
via:[前]…を通って, …経由; …によって
さて、皆は翻訳できるかな?

67 ◆rCEzuNnL0g:2008/08/23(土) 18:28:30
convention:[名]集会, 会合, 会議, 大会; ((集合的)) (集会への)出席者[代表者]; 協定, 協約; (社会の)慣例[習], 因襲; (芸術上の)しきたり, 約束; 【コンピュータ】規約

The __thiscall calling convention is used on member functions and is the default calling convention used by C++ member functions that do not use variable arguments.
__thiscall呼び出し規約は、メンバー関数に利用され、可変長でない引数をとらないメンバー関数でデフォルトの呼び出し規約です。

68 ◆rCEzuNnL0g:2008/08/23(土) 18:32:24
Under __thiscall, the callee cleans the stack, which is impossible for vararg functions.
__thiscall呼び出し規約では、呼び出された側がスタックを片付けます、此れは引数をとる関数では重要なことです。

(なんだかwhich以下が訳しにくい。)

69 ◆rCEzuNnL0g:2008/08/23(土) 18:34:01
Arguments are pushed on the stack from right to left, with the this pointer being passed via register ECX, and not on the stack, on the x86 architecture.
x86互換機では、引数は右から左にスタックにプッシュし、thisポインタはスタックではなくECXレジスタを通して渡されます。

70 ◆rCEzuNnL0g:2008/08/23(土) 18:37:12
vararg member functions use the __cdecl calling convention.
可変長の引数をとるメンバ関数は__cdecl呼び出し規約を利用します。
All function arguments are pushed on the stack, with the this pointer placed on the stack last
全ての引数はスタックに積まれ、thisポインタは最後にスタックに詰まれます。
(訳注:__cdeclは呼び出し側がスタックを綺麗にする。引数は右から左へ積む。)

71 ◆rCEzuNnL0g:2008/08/23(土) 18:37:43
__thiscall (C++)
http://msdn.microsoft.com/ja-jp/library/ek8tkfbw(VS.80).aspx
---
詳しくはここへね。

72 ◆rCEzuNnL0g:2008/08/23(土) 19:03:36
あくまでも此れは、Microsoftのソフトだけの話。
他のコンパイラでは違う実装かもしれない。

73 ◆rCEzuNnL0g:2008/08/24(日) 09:13:13
(´・ω・`)ショボーン
昨日試したけれども、メンバー関数のアドレスが取得できない・・・
どんなに頑張っても__thiscallな関数はvoid *にすら型変換できない・・・

74 ◆rCEzuNnL0g:2008/08/24(日) 09:13:49
馬鹿野郎!

75 ◆rCEzuNnL0g:2008/08/24(日) 19:04:14
es3.1:es3.1_proposal_working_draft [ES4 Wiki]
http://wiki.ecmascript.org/doku.php?id=es3.1:es3.1_proposal_working_draft
---
後で読む。

76 ◆rCEzuNnL0g:2008/08/24(日) 19:39:16
エレメントの大きさと位置を測定する
http://msdn.microsoft.com/ja-jp/library/cc392317.aspx
---
適当なときに読む。

77 ◆rCEzuNnL0g:2008/08/25(月) 17:16:41
Firefox 3.1に搭載予定のJavaScriptエンジン「TraceMonkey」,数倍〜数十倍の高速化:ITpro
http://itpro.nikkeibp.co.jp/article/NEWS/20080825/313337/
----
Firefox 3.1 beta激しく期待。
ブランチ版は入れるのが心配なので敬遠気味。betaならば多分大丈夫。
プログラムフォルダを全て消される可能性は低いだろう(笑)。

78 ◆rCEzuNnL0g:2008/08/27(水) 12:48:28
開発者のFirefox 3:特集 - builder by ZDNet Japan
http://builder.japan.zdnet.com/sp/firefox-3-for-developer-2008/
Google,検索キーワードをリアルタイムで推測する「Google Suggest」を正式提供へ:ITpro
http://itpro.nikkeibp.co.jp/article/NEWS/20080827/313474/
---
すげーーーーー
入れてみようwwwwwwwwwwwwwwww
Canvasを頑張って練習しようwwwwwwwwwwwww
----
うpだて - みみず日記
http://d.hatena.ne.jp/sub_chon/20080827/1219808408
----
更新したよー。

79 ◆rCEzuNnL0g:2008/08/27(水) 12:56:30
Shiretoko(Firefox 3.1a)入れてみた。

80 ◆rCEzuNnL0g:2008/08/27(水) 13:12:14
どうでもいいけれども、
特権を持ったオブジェクトをWebページ側が取得できれば、いろいろなことが出来る。
まあ、此れは当たり前。
此れがISleipnirであったり、GM_XMLHttpRequestであったりするだけ。
根本は何も違わない。

81 ◆rCEzuNnL0g:2008/08/27(水) 13:17:33
JavaScriptエンジンがさらに高速化されたFirefox 3.1を一足早く試す方法 - おさんぽブログ
http://d.hatena.ne.jp/kokoromo/20080827/1219807601
を見て新しいの入れた。

82 ◆rCEzuNnL0g:2008/08/27(水) 15:28:47
Twitter / javascripter: function b_search(a,v)(func...
http://twitter.com/javascripter/statuses/899790598
---
function b_search(a,v)(function s(h,t,w)h>t?-1:(w=(h+t)>>1,v===a[w]?w:(v<a[w]?t=w-1:h=w+1,s(h,t))))(0,a.length-1)
---
よくこんなの書くなー

83 ◆rCEzuNnL0g:2008/08/27(水) 15:32:15
アクセスチャートを作ろう! Pathtraq ページチャート API と Google Chart API の合わせ技! - IT戦記
http://d.hatena.ne.jp/amachang/20080827/1219815788

84774さん:2008/08/27(水) 17:06:55
んな、馬鹿な。
なんかFenrirLib.fxを見ていたのだが、毎回ウィンドウズのバージョンを取得しているのだが。
んなもん、起動中にウィンドウズのバージョンが変わるはずが無いんだから、グローバル変数で取得しておいてキャッシュしておいた方が軽いと思うぞ。
なんか内部ではFStringというクラスを使っているっぽい。
普通にstd::stringを使ったほうが早いんじゃないの?
まあ、FirefoxとかOperaだったら独自のクラスを使っているっぽいと思うので、まあ良いか。
せっかくDLL化しているんだったら、DLLだけ更新すれば良いのにね。

85 ◆rCEzuNnL0g:2008/08/27(水) 17:09:09
OllyDbg2安定してるなあ。

間違えて上げちまった・・・

86 ◆rCEzuNnL0g:2008/08/27(水) 17:22:11
MinGW - Wikipedia
http://ja.wikipedia.org/wiki/MinGW
---
後で試す。

87 ◆rCEzuNnL0g:2008/08/27(水) 17:22:28
>>86
MinGW | Minimalist GNU for Windows
http://www.mingw.org/

88 ◆rCEzuNnL0g:2008/08/27(水) 19:28:45
Sleipnir Part203
http://pc11.2ch.net/test/read.cgi/win/1218261313/888
----
Sleipnir test3
リリース候補版。

89 ◆rCEzuNnL0g:2008/08/27(水) 21:25:52
モジラ、Firefoxプラグイン「Ubiquity」を公開--手軽なマッシュアップが可能に:ニュース - CNET Japan
http://japan.cnet.com/news/media/story/0,2000056023,20379387,00.htm?ref=rss

90 ◆rCEzuNnL0g:2008/08/27(水) 21:26:29
Twitter / javascripter
http://twitter.com/javascripter

91 ◆rCEzuNnL0g:2008/08/28(木) 17:18:40
「Winnyウイルスの被害を疑似体験」、ディアイティがツールを公開:ITpro
http://itpro.nikkeibp.co.jp/article/NEWS/20080828/313664/
外部JavaScriptの動的ロード - 0x集積蔵
http://d.hatena.ne.jp/os0x/20080827/1219815828
HTML5 の DOCTYPE 宣言って IE6 でも標準モードになるんですね - IT戦記
http://d.hatena.ne.jp/amachang/20080828/1219902321
動的ローディング雑感 - IT戦記
http://d.hatena.ne.jp/amachang/20080828/1219898838
【速報】IE8 Beta 2 で DOM オブジェクトに対して Getter / Setter を追加できるように! - IT戦記
http://d.hatena.ne.jp/amachang/20080828/1219888510

92 ◆rCEzuNnL0g:2008/08/29(金) 19:16:31
現在、FStringを研究中。
というか、コントラスタを見ればそのクラスの容量が分かるトラップwwwww
FWndは18bytesっぽい。

93 ◆rCEzuNnL0g:2008/08/29(金) 19:20:55
ん?
なんか一回実行するごとに10bytesメモリリークしていないか・・・?
俺はまだ、解析の基本が分かってません><

94 ◆rCEzuNnL0g:2008/08/29(金) 19:27:13
>>92
最初の四バイトは、virtual用かもしれないな。
アドレスが固定だから。
他の十四バイトは0で初期化されているようだ。

95 ◆rCEzuNnL0g:2008/08/29(金) 19:49:05
うわあああああああああああああああああああああああああああ
クリップボードが開きっぱなしになったああああああああああああああああああ
此れじゃあ、コピーも出来ないし、貼り付けも出来ないいいいいいいいいいい

96 ◆rCEzuNnL0g:2008/08/29(金) 19:50:21
どのウィンドウが悪い!
OllyDbg2.0を終了したら動いた!
やっぱりalpha版だけはあるなwwwwww
何がいけなかったんだろうか。

97 ◆rCEzuNnL0g:2008/08/29(金) 19:50:44
正確には、pre-alpha版だね!
早く新しいバージョンでないかな?

98 ◆rCEzuNnL0g:2008/08/29(金) 21:28:04
CPU Disasm
Address Hex dump Command Comments
41031210 /$ 56 PUSH ESI ; FenrirLib_fx.?GetText@FCmdUI@@UAGXPAPA_W@Z(guessed Arg1,Arg2)

99 ◆rCEzuNnL0g:2008/08/29(金) 21:30:03
此れを呼び出すと、アクションに渡された引数が得られるようだ。

100 ◆rCEzuNnL0g:2008/08/29(金) 21:31:55
どうでもいいけれども、なんだかクラック対策のために、DLLの出力がクラスになっている気がする。
それとも、此れは、namespaceなのかな?
(クラスだったら、呼び出しの前にecxにポインタ入れるからねえ。)

101 ◆rCEzuNnL0g:2008/08/29(金) 21:36:50
今、探しているのは、アクションを呼び出すルーチン。

102 ◆rCEzuNnL0g:2008/08/29(金) 21:38:27
48A018D0 |. FF15 3410A048 CALL DWORD PTR DS:[<&FenrirLib_fx.?FfxFree@@YGXPAX@Z>] ; \FenrirLib_fx.?FfxFree@@YGXPAX@Z
>>98で取得したら、
此れで返却しましょうね、っと。

103 ◆rCEzuNnL0g:2008/08/29(金) 21:39:35
CPU Disasm
Address Hex dump Command Comments
410127DB /$ FF7424 04 PUSH DWORD PTR SS:[ARG.1] ; FenrirLib_fx.?FfxAlloc@@YGPAXI@Z(guessed Arg1)
410127DF |. FF15 8C150041 CALL DWORD PTR DS:[<&MSVCR71.malloc>]
410127E5 |. 59 POP ECX
410127E6 \. C2 0400 RETN 4
410127E9 /$ FF7424 04 PUSH DWORD PTR SS:[ARG.1] ; FenrirLib_fx.?FfxFree@@YGXPAX@Z(guessed Arg1)
410127ED |. FF15 90150041 CALL DWORD PTR DS:[<&MSVCR71.free>]
410127F3 |. 59 POP ECX
410127F4 \. C2 0400 RETN 4

何という実装wwww

104 ◆rCEzuNnL0g:2008/08/29(金) 21:43:31
??1とかなっているのはコンストラクタっぽい(コントラスタと思っていた俺涙目www)

105 ◆rCEzuNnL0g:2008/08/29(金) 21:45:18
間違えた、デストラクタっぽい。

106 ◆rCEzuNnL0g:2008/08/29(金) 21:59:31
引数を持つアクションと、持たないアクションは別ルーチンで呼び出されるっぽい。

107 ◆rCEzuNnL0g:2008/08/29(金) 22:01:51
CPU Disasm
Address Hex dump Command Comments
4888FC40 /$ 83EC 18 SUB ESP,18 ; SagittariusDock_fx.4888FC40(guessed Arg1)
4888FC43 |. 57 PUSH EDI
4888FC44 |. 8B7C24 20 MOV EDI,DWORD PTR SS:[ARG.1]
4888FC48 |. 8A87 60010000 MOV AL,BYTE PTR DS:[EDI+160]
4888FC4E |. 84C0 TEST AL,AL
4888FC50 |. 0F85 49020000 JNE 4888FE9F
4888FC56 |. 8B4F 60 MOV ECX,DWORD PTR DS:[EDI+60]
4888FC59 |. 8B01 MOV EAX,DWORD PTR DS:[ECX]
4888FC5B |. 53 PUSH EBX
4888FC5C |. 55 PUSH EBP
4888FC5D |. 56 PUSH ESI
4888FC5E |. FF50 34 CALL DWORD PTR DS:[EAX+34]
4888FC61 |. 8B8F 5C010000 MOV ECX,DWORD PTR DS:[EDI+15C]
4888FC67 |. 8DAF 5C010000 LEA EBP,[EDI+15C]
4888FC6D |. 51 PUSH ECX ; /hWnd
4888FC6E |. 894424 1C MOV DWORD PTR SS:[ESP+1C],EAX ; |
4888FC72 |. FF15 58148848 CALL DWORD PTR DS:[<&USER32.IsWindowVisible>] ; \USER32.IsWindowVisible
4888FC78 |. 85C0 TEST EAX,EAX
4888FC7A |. 0F84 95000000 JE 4888FD15
4888FC80 |. 8B55 00 MOV EDX,DWORD PTR SS:[EBP]
4888FC83 |. 8B1D 88148848 MOV EBX,DWORD PTR DS:[<&USER32.SendMessageW>]
4888FC89 |. 6A 00 PUSH 0 ; /lParam = 0
4888FC8B |. 6A 00 PUSH 0 ; |wParam = 0
4888FC8D |. 68 88010000 PUSH 188 ; |Msg = LB_GETCURSEL
4888FC92 |. 52 PUSH EDX ; |hWnd
4888FC93 |. FFD3 CALL EBX ; \USER32.SendMessageW
4888FC95 |. 8BF0 MOV ESI,EAX
4888FC97 |. 83FE FF CMP ESI,-1
4888FC9A |. 74 79 JE SHORT 4888FD15
4888FC9C |. A1 C8708948 MOV EAX,DWORD PTR DS:[488970C8]
4888FCA1 |. B9 C8708948 MOV ECX,OFFSET SagittariusDock_fx.488970C8
4888FCA6 |. FF50 0C CALL DWORD PTR DS:[EAX+0C]
4888FCA9 |. 56 PUSH ESI ; /Arg2
4888FCAA |. 83C0 10 ADD EAX,10 ; |
4888FCAD |. 55 PUSH EBP ; |Arg1
4888FCAE |. 8D7C24 24 LEA EDI,[ESP+24] ; |
4888FCB2 |. 894424 24 MOV DWORD PTR SS:[ESP+24],EAX ; |
4888FCB6 |. E8 35230000 CALL 48891FF0 ; \SagittariusDock_fx.48891FF0

108 ◆rCEzuNnL0g:2008/08/29(金) 22:02:11
4888FCBB |. 8B7424 1C MOV ESI,DWORD PTR SS:[ESP+1C]
4888FCBF |. 8B46 F4 MOV EAX,DWORD PTR DS:[ESI-0C]
4888FCC2 |. 85C0 TEST EAX,EAX
4888FCC4 |. 74 31 JE SHORT 4888FCF7
4888FCC6 |. 8B4D 00 MOV ECX,DWORD PTR SS:[EBP]
4888FCC9 |. 6A 00 PUSH 0 ; /SHOW = SW_HIDE
4888FCCB |. 51 PUSH ECX ; |hWnd
4888FCCC |. FF15 60148848 CALL DWORD PTR DS:[<&USER32.ShowWindow>] ; \USER32.ShowWindow
4888FCD2 |. 8B7C24 18 MOV EDI,DWORD PTR SS:[ESP+18]
4888FCD6 |. 56 PUSH ESI ; /Text
4888FCD7 |. 57 PUSH EDI ; |hWnd
4888FCD8 |. FF15 8C148848 CALL DWORD PTR DS:[<&USER32.SetWindowTextW>] ; \USER32.SetWindowTextW
4888FCDE |. 8B46 F4 MOV EAX,DWORD PTR DS:[ESI-0C]
4888FCE1 |. 50 PUSH EAX
4888FCE2 |. 50 PUSH EAX
4888FCE3 |. 68 B1000000 PUSH 0B1
4888FCE8 |. 57 PUSH EDI
4888FCE9 |. FFD3 CALL EBX
4888FCEB |. 6A 00 PUSH 0
4888FCED |. 6A 00 PUSH 0
4888FCEF |. 68 B7000000 PUSH 0B7
4888FCF4 |. 57 PUSH EDI
4888FCF5 |. FFD3 CALL EBX
4888FCF7 |> 83C6 F0 ADD ESI,-10
4888FCFA |. 8D56 0C LEA EDX,[ESI+0C]
4888FCFD |. 83C8 FF OR EAX,FFFFFFFF
4888FD00 |. F0:0FC102 LOCK XADD DWORD PTR DS:[EDX],EAX
4888FD04 |. 48 DEC EAX
4888FD05 |. 85C0 TEST EAX,EAX
4888FD07 |. 7F 08 JG SHORT 4888FD11
4888FD09 |. 8B0E MOV ECX,DWORD PTR DS:[ESI]
4888FD0B |. 8B11 MOV EDX,DWORD PTR DS:[ECX]
4888FD0D |. 56 PUSH ESI
4888FD0E |. FF52 04 CALL DWORD PTR DS:[EDX+4]
4888FD11 |> 8B7C24 2C MOV EDI,DWORD PTR SS:[ESP+2C]
4888FD15 |> FF15 70148848 CALL DWORD PTR DS:[<&USER32.GetFocus>] ; [USER32.GetFocus
4888FD1B |. 394424 18 CMP DWORD PTR SS:[ESP+18],EAX
4888FD1F |. 75 0F JNE SHORT 4888FD30
4888FD21 |. FF15 70118848 CALL DWORD PTR DS:[<&FenrirLib_fx.?IsCtrlDown@FMisc@@SG_ ; [FenrirLib_fx.?IsCtrlDown@FMisc@@SG_NXZ
4888FD27 |. 84C0 TEST AL,AL

109 ◆rCEzuNnL0g:2008/08/29(金) 22:02:25
4888FD29 |. C64424 13 01 MOV BYTE PTR SS:[ESP+13],1
4888FD2E |. 75 05 JNE SHORT 4888FD35
4888FD30 |> C64424 13 00 MOV BYTE PTR SS:[ESP+13],0
4888FD35 |> 8B4F 60 MOV ECX,DWORD PTR DS:[EDI+60]
4888FD38 |. 8B01 MOV EAX,DWORD PTR DS:[ECX]
4888FD3A |. 8D5424 14 LEA EDX,[ESP+14]
4888FD3E |. 52 PUSH EDX
4888FD3F |. FF50 40 CALL DWORD PTR DS:[EAX+40]
4888FD42 |. 8B4424 14 MOV EAX,DWORD PTR SS:[LOCAL.5]
4888FD46 |. 8B48 08 MOV ECX,DWORD PTR DS:[EAX+8]
4888FD49 |. 85C9 TEST ECX,ECX
4888FD4B |. 0F84 35010000 JE 4888FE86
4888FD51 |. BF 0C000000 MOV EDI,0C
4888FD56 |. E8 D543FFFF CALL 48884130 ; [SagittariusDock_fx.48884130
4888FD5B |. 8BF0 MOV ESI,EAX
4888FD5D |. 8936 MOV DWORD PTR DS:[ESI],ESI
4888FD5F |. 8976 04 MOV DWORD PTR DS:[ESI+4],ESI
4888FD62 |. 8B4C24 14 MOV ECX,DWORD PTR SS:[LOCAL.5]
4888FD66 |. 8B41 0C MOV EAX,DWORD PTR DS:[ECX+0C]
4888FD69 |. 8D7C24 1C LEA EDI,[LOCAL.3]
4888FD6D |. 897424 24 MOV DWORD PTR SS:[LOCAL.1],ESI
4888FD71 |. E8 AA52FFFF CALL 48885020 ; [SagittariusDock_fx.48885020
4888FD76 |. 8B5C24 2C MOV EBX,DWORD PTR SS:[ARG.1]
4888FD7A |. 8BD7 MOV EDX,EDI
4888FD7C |. 52 PUSH EDX ; /Arg2
4888FD7D |. 8D4424 28 LEA EAX,[LOCAL.1] ; |
4888FD81 |. 50 PUSH EAX ; |Arg1
4888FD82 |. 8BC3 MOV EAX,EBX ; |
4888FD84 |. E8 F7DAFFFF CALL 4888D880 ; \SagittariusDock_fx.4888D880
4888FD89 |. 8B4424 1C MOV EAX,DWORD PTR SS:[LOCAL.3]
4888FD8D |. 83C0 F0 ADD EAX,-10
4888FD90 |. 8D48 0C LEA ECX,[EAX+0C]
4888FD93 |. 83CA FF OR EDX,FFFFFFFF
4888FD96 |. F0:0FC111 LOCK XADD DWORD PTR DS:[ECX],EDX
4888FD9A |. 4A DEC EDX
4888FD9B |. 85D2 TEST EDX,EDX
4888FD9D |. 7F 08 JG SHORT 4888FDA7
4888FD9F |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
4888FDA1 |. 8B11 MOV EDX,DWORD PTR DS:[ECX]
4888FDA3 |. 50 PUSH EAX

110 ◆rCEzuNnL0g:2008/08/29(金) 22:02:45
4888FDA4 |. FF52 04 CALL DWORD PTR DS:[EDX+4]
4888FDA7 |> 8B16 MOV EDX,DWORD PTR DS:[ESI]
4888FDA9 |. 8BC2 MOV EAX,EDX
4888FDAB |. 33C9 XOR ECX,ECX
4888FDAD |. 3BC6 CMP EAX,ESI
4888FDAF |. 74 38 JE SHORT 4888FDE9
4888FDB1 |> 8B00 /MOV EAX,DWORD PTR DS:[EAX]
4888FDB3 |. 41 |INC ECX
4888FDB4 |. 3BC6 |CMP EAX,ESI
4888FDB6 |.^ 75 F9 \JNE SHORT 4888FDB1
4888FDB8 |. 83F9 01 CMP ECX,1
4888FDBB |. 75 2C JNE SHORT 4888FDE9
4888FDBD |. 8B42 08 MOV EAX,DWORD PTR DS:[EDX+8]
4888FDC0 |. 8B78 0C MOV EDI,DWORD PTR DS:[EAX+0C]
4888FDC3 |. 57 PUSH EDI ; /Arg1
4888FDC4 |. 8D4C24 18 LEA ECX,[LOCAL.5] ; |
4888FDC8 |. FF15 4C118848 CALL DWORD PTR DS:[<&FenrirLib_fx.??8FString@@QAE_NPB_W@ ; \FenrirLib_fx.??8FString@@QAE_NPB_W@Z
4888FDCE |. 84C0 TEST AL,AL
4888FDD0 |. 75 17 JNE SHORT 4888FDE9
4888FDD2 |. 8B4C24 18 MOV ECX,DWORD PTR SS:[LOCAL.4]
4888FDD6 |. 57 PUSH EDI ; /Text
4888FDD7 |. 51 PUSH ECX ; |hWnd
4888FDD8 |. FF15 8C148848 CALL DWORD PTR DS:[<&USER32.SetWindowTextW>] ; \USER32.SetWindowTextW
4888FDDE |. 57 PUSH EDI ; /Arg1
4888FDDF |. 8D4C24 18 LEA ECX,[LOCAL.5] ; |
4888FDE3 |. FF15 38108848 CALL DWORD PTR DS:[<&FenrirLib_fx.??4FString@@QAEAAV0@PB ; \FenrirLib_fx.??4FString@@QAEAAV0@PB_W@Z
4888FDE9 |> 8D5424 14 LEA EDX,[LOCAL.5]
4888FDED |. 52 PUSH EDX ; /Arg2
4888FDEE |. 8D4424 24 LEA EAX,[LOCAL.2] ; |
4888FDF2 |. 50 PUSH EAX ; |Arg1
4888FDF3 |. E8 E8D7FFFF CALL 4888D5E0 ; \SagittariusDock_fx.4888D5E0
4888FDF8 |. 8D4C24 14 LEA ECX,[LOCAL.5]
4888FDFC |. 51 PUSH ECX ; /Arg1
4888FDFD |. 8BC3 MOV EAX,EBX ; |
4888FDFF |. E8 AC160000 CALL 488914B0 ; \SagittariusDock_fx.488914B0
4888FE04 |. 8B55 00 MOV EDX,DWORD PTR SS:[EBP]
4888FE07 |. 6A 00 PUSH 0 ; /SHOW = SW_HIDE
4888FE09 |. 52 PUSH EDX ; |hWnd
4888FE0A |. FF15 60148848 CALL DWORD PTR DS:[<&USER32.ShowWindow>] ; \USER32.ShowWindow
4888FE10 |. 8B4424 20 MOV EAX,DWORD PTR SS:[LOCAL.2]

111 ◆rCEzuNnL0g:2008/08/29(金) 22:02:57
4888FE14 |. 8B48 0C MOV ECX,DWORD PTR DS:[EAX+0C]
4888FE17 |. 8B5424 14 MOV EDX,DWORD PTR SS:[LOCAL.5]
4888FE1B |. 51 PUSH ECX ; /Arg2
4888FE1C |. 53 PUSH EBX ; |Arg1
4888FE1D |. 8B5A 0C MOV EBX,DWORD PTR DS:[EDX+0C] ; |
4888FE20 |. 33C0 XOR EAX,EAX ; |
4888FE22 |. E8 991C0000 CALL 48891AC0 ; \SagittariusDock_fx.48891AC0
4888FE27 |. 8A4424 13 MOV AL,BYTE PTR SS:[LOCAL.6+3]
4888FE2B |. 84C0 TEST AL,AL
4888FE2D |. 74 0B JE SHORT 4888FE3A
4888FE2F |. 8B4424 18 MOV EAX,DWORD PTR SS:[LOCAL.4]
4888FE33 |. 50 PUSH EAX ; /hWnd
4888FE34 |. FF15 D0138848 CALL DWORD PTR DS:[<&USER32.SetFocus>] ; \USER32.SetFocus
4888FE3A |> 8D4C24 20 LEA ECX,[LOCAL.2]
4888FE3E |. FF15 3C108848 CALL DWORD PTR DS:[<&FenrirLib_fx.??1FString@@QAE@XZ>] ; [FenrirLib_fx.??1FString@@QAE@XZ
4888FE44 |. 8D4424 24 LEA EAX,[LOCAL.1]
4888FE48 |. E8 F345FFFF CALL 48884440 ; [SagittariusDock_fx.48884440
4888FE4D |. 68 F4708948 PUSH OFFSET SagittariusDock_fx.488970F4 ; /Arg1 = SagittariusDock_fx.488970F4
4888FE52 |. E8 4943FFFF CALL 488841A0 ; \SagittariusDock_fx.488841A0
4888FE57 |. 8B0D FC708948 MOV ECX,DWORD PTR DS:[488970FC]
4888FE5D |. 890E MOV DWORD PTR DS:[ESI],ECX
4888FE5F |. 8935 FC708948 MOV DWORD PTR DS:[488970FC],ESI
4888FE65 |. 83C4 04 ADD ESP,4
4888FE68 |. 8D4C24 14 LEA ECX,[LOCAL.5]
4888FE6C |. C705 F4708948 MOV DWORD PTR DS:[488970F4],0
4888FE76 |. FF15 3C108848 CALL DWORD PTR DS:[<&FenrirLib_fx.??1FString@@QAE@XZ>] ; [FenrirLib_fx.??1FString@@QAE@XZ
4888FE7C |. 5E POP ESI
4888FE7D |. 5D POP EBP
4888FE7E |. 5B POP EBX
4888FE7F |. 5F POP EDI
4888FE80 |. 83C4 18 ADD ESP,18
4888FE83 |. C2 0400 RETN 4
4888FE86 |> 8B55 00 MOV EDX,DWORD PTR SS:[EBP]
4888FE89 |. 6A 00 PUSH 0 ; /SHOW = SW_HIDE
4888FE8B |. 52 PUSH EDX ; |hWnd
4888FE8C |. FF15 60148848 CALL DWORD PTR DS:[<&USER32.ShowWindow>] ; \USER32.ShowWindow
4888FE92 |. 8D4C24 14 LEA ECX,[LOCAL.5]
4888FE96 |. FF15 3C108848 CALL DWORD PTR DS:[<&FenrirLib_fx.??1FString@@QAE@XZ>] ; [FenrirLib_fx.??1FString@@QAE@XZ
4888FE9C |. 5E POP ESI
4888FE9D |. 5D POP EBP
4888FE9E |. 5B POP EBX
4888FE9F |> 5F POP EDI
4888FEA0 |. 83C4 18 ADD ESP,18
4888FEA3 \. C2 0400 RETN 4

112 ◆rCEzuNnL0g:2008/08/29(金) 22:04:19
http://jbbs.livedoor.jp/bbs/read.cgi/computer/38153/1218378495/107-111n
サジタリウスによるアクションの呼び出し?

113 ◆rCEzuNnL0g:2008/08/29(金) 22:08:45
ぐわああああああああああああああ
もう、逆アセンブリ読むの疲れた。
明日のために寝ます(`・ω・´) シャキーン

114 ◆rCEzuNnL0g:2008/08/29(金) 22:21:05
CPU Disasm
Address Hex dump Command Comments
0046854D |. 51 PUSH ECX
0046854E |. 50 PUSH EAX
0046854F |. FF52 30 CALL DWORD PTR DS:[EDX+30]
00468552 |. 8B47 18 MOV EAX,DWORD PTR DS:[EDI+18]
00468555 |. 8B0428 MOV EAX,DWORD PTR DS:[EBP+EAX]
00468558 |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
0046855A |. 50 PUSH EAX
0046855B |. FF51 1C CALL DWORD PTR DS:[ECX+1C] ←ここでアクション用の関数呼び出し(引数あり)
0046855E |. 8B57 18 MOV EDX,DWORD PTR DS:[EDI+18]
00468561 |. 8B042A MOV EAX,DWORD PTR DS:[EBP+EDX]
00468564 |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
00468566 |. 68 5CDD4100 PUSH Sleipnir.0041DD5C
0046856B |. 50 PUSH EAX
0046856C |. FF51 30 CALL DWORD PTR DS:[ECX+30]
0046856F |. EB 0C JMP SHORT 0046857D
00468571 |> 8B57 18 MOV EDX,DWORD PTR DS:[EDI+18] ←ここでアクション用の関数呼び出し(引数なし)
00468574 |. 8B042A MOV EAX,DWORD PTR DS:[EBP+EDX]
00468577 |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
00468579 |. 50 PUSH EAX
0046857A |. FF51 1C CALL DWORD PTR DS:[ECX+1C]
0046857D |> 897424 34 MOV DWORD PTR SS:[ESP+34],ESI
00468581 |. FF15 74104000 CALL DWORD PTR DS:[<&FenrirLib_fx.?FfxGetClient@@YGPAVFI

115 ◆rCEzuNnL0g:2008/08/29(金) 22:21:57
>>114は間違え
CPU Disasm
Address Hex dump Command Comments
0046854D |. 51 PUSH ECX
0046854E |. 50 PUSH EAX
0046854F |. FF52 30 CALL DWORD PTR DS:[EDX+30]
00468552 |. 8B47 18 MOV EAX,DWORD PTR DS:[EDI+18]
00468555 |. 8B0428 MOV EAX,DWORD PTR DS:[EBP+EAX]
00468558 |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
0046855A |. 50 PUSH EAX
0046855B |. FF51 1C CALL DWORD PTR DS:[ECX+1C] ←ここでアクション用の関数呼び出し(引数あり)
0046855E |. 8B57 18 MOV EDX,DWORD PTR DS:[EDI+18]
00468561 |. 8B042A MOV EAX,DWORD PTR DS:[EBP+EDX]
00468564 |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
00468566 |. 68 5CDD4100 PUSH Sleipnir.0041DD5C
0046856B |. 50 PUSH EAX
0046856C |. FF51 30 CALL DWORD PTR DS:[ECX+30]
0046856F |. EB 0C JMP SHORT 0046857D
00468571 |> 8B57 18 MOV EDX,DWORD PTR DS:[EDI+18]
00468574 |. 8B042A MOV EAX,DWORD PTR DS:[EBP+EDX]
00468577 |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
00468579 |. 50 PUSH EAX
0046857A |. FF51 1C CALL DWORD PTR DS:[ECX+1C] ←ここでアクション用の関数呼び出し(引数なし)
0046857D |> 897424 34 MOV DWORD PTR SS:[ESP+34],ESI
00468581 |. FF15 74104000 CALL DWORD PTR DS:[<&FenrirLib_fx.?FfxGetClient@@YGPAVFI

116 ◆rCEzuNnL0g:2008/08/29(金) 22:27:16
ECXが0の時が引数なしみたい。
さて、何処でECXが来るのか。

117 ◆rCEzuNnL0g:2008/08/29(金) 22:38:51
どうやら
Action(Param)
のActionとParamを切り分ける関数があるらしい。
で、その関数へポインタへのポインタを渡して、そこにAction名とParamへのポインタを代入して貰う。
そのときに、Paramが存在しないならば、ParamへのポインタはNULLになる。
よってECXはその値を持ってくるので(ry
ということである。
さて、またアセンブリを読んでしまった。

118 ◆rCEzuNnL0g:2008/08/29(金) 22:44:11
今度こそ本当に寝よう。
(`・ω・´) シャキーン

119 ◆rCEzuNnL0g:2008/08/30(土) 15:37:42
mapと__noSuchMethod__(失敗) - 素人がプログラミングを勉強するブログ
http://d.hatena.ne.jp/javascripter/20080830/1220071227
-----
__noSuchMethod__って凄いなあ。ソースに直接書いたものを文字列をして得られる。

120 ◆rCEzuNnL0g:2008/08/30(土) 16:31:12
??_7系はヴァーチャルポインタですかねえ。
取り敢えず、自分でdllをエクスポートしてみる。

121 ◆rCEzuNnL0g:2008/08/30(土) 17:03:26
main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: char const * __thiscall CSuper::GetStr(void)" (__imp_?GetStr@CSuper@@QAEPBDXZ) が関数 _main で参照されました。
main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: int __thiscall CSuper::GetLength(void)" (__imp_?GetLength@CSuper@@QAEHXZ) が関数 _main で参照されました。

122 ◆rCEzuNnL0g:2008/08/30(土) 17:05:29
main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: char * __thiscall CSuper::GetStr(void)" (__imp_?GetStr@CSuper@@QAEPADXZ) が関数 _main で参照されました。
main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: int __thiscall CSuper::GetLength(char *)" (__imp_?GetLength@CSuper@@QAEHPAD@Z) が関数 _main で参照されました。

123 ◆rCEzuNnL0g:2008/08/30(土) 17:08:41
const char *CSuper::GetStr()
-> __imp_?GetStr@CSuper@@QAEPBDXZ
char *CSuper::GetStr()
-> __imp_?GetStr@CSuper@@QAEPADXZ
-----
int CSuper::GetLength()
-> __imp_?GetLength@CSuper@@QAEHXZ
int CSuper::GetLength()
-> __imp_?GetLength@CSuper@@QAEHPAD@Z

124 ◆rCEzuNnL0g:2008/08/30(土) 17:20:06
__imp_?Get@CSuper@@QAEXXZ <- void void
__imp_?Get@CSuper@@QAEHXZ <- int void
__imp_?Get@CSuper@@QAEFXZ <- short void
__imp_?Get@CSuper@@QAEJXZ <- long void
__imp_?Get@CSuper@@QAEDXZ <- char void
__imp_?Get@CSuper@@QAEMXZ <- float void
__imp_?Get@CSuper@@QAENXZ <- double void
__imp_?Get@CSuper@@QAEOXZ <- long double void
__imp_?Get@CSuper@@QAEPAXXZ <- void* void
__imp_?Get@CSuper@@QAEPAHXZ <- int* void
__imp_?Get@CSuper@@QAEPADXZ <- char* void
__imp_?Get@CSuper@@QAEPAMXZ <- float* void
__imp_?Get@CSuper@@QAEPANXZ <- double* void
__imp_?Get@CSuper@@QAEPAOXZ <- long double* void

返却値については、規則性が見えるなあ。

125 ◆rCEzuNnL0g:2008/08/30(土) 17:24:15
__imp_?Get@CSuper@@QAEIXZ <- unsigned int void
__imp_?Get@CSuper@@QAEEXZ <- unsigned char void

此れやってて気づいたんだけれども、unsignedは実数系には付けれない。
此れ基本事項だよねwww

126 ◆rCEzuNnL0g:2008/08/30(土) 17:32:25
__imp_?Get@CSuper@@QAEXXZ <- void void
__imp_?Get@CSuper@@QAEHXZ <- int void
__imp_?Get@CSuper@@QAEFXZ <- short void
__imp_?Get@CSuper@@QAEJXZ <- long void
__imp_?Get@CSuper@@QAEDXZ <- char void
__imp_?Get@CSuper@@QAEMXZ <- float void
__imp_?Get@CSuper@@QAENXZ <- double void
__imp_?Get@CSuper@@QAEOXZ <- long double void
__imp_?Get@CSuper@@QAEPAXXZ <- void* void
__imp_?Get@CSuper@@QAEPAHXZ <- int* void
__imp_?Get@CSuper@@QAEPADXZ <- char* void
__imp_?Get@CSuper@@QAEPAMXZ <- float* void
__imp_?Get@CSuper@@QAEPANXZ <- double* void
__imp_?Get@CSuper@@QAEPAOXZ <- long double* void
__imp_?Get@CSuper@@QAEAAHXZ <- int& void
__imp_?Get@CSuper@@QAEAADXZ <- char& void
__imp_?Get@CSuper@@QAEAAMXZ <- float& void
__imp_?Get@CSuper@@QAEAANXZ <- double& void
__imp_?Get@CSuper@@QAEAAOXZ <- long double& void

__imp_?Get@CSuper@@QAEIXZ <- unsigned int void
__imp_?Get@CSuper@@QAEEXZ <- unsigned char void
__imp_?Get@CSuper@@QAEPAIXZ <- unsigned int* void
__imp_?Get@CSuper@@QAEPAEXZ <- unsigned char* void
__imp_?Get@CSuper@@QAEAAIXZ <- unsigned int& void
__imp_?Get@CSuper@@QAEAAEXZ <- unsigned char& void

__imp_?Get@CSuper@@QAE?AV1@XZ <- CSuper void
__imp_?Get@CSuper@@QAEPAV1@XZ <- CSuper* void
__imp_?Get@CSuper@@QAEAAV1@XZ <- CSuper& void

127 ◆rCEzuNnL0g:2008/08/30(土) 17:37:37
__imp_?Get@CSuper@@QAEXXZ <- void | void
__imp_?Get@CSuper@@QAEHXZ <- int | void
__imp_?Get@CSuper@@QAEFXZ <- short | void
__imp_?Get@CSuper@@QAEJXZ <- long | void
__imp_?Get@CSuper@@QAEDXZ <- char | void
__imp_?Get@CSuper@@QAEMXZ <- float | void
__imp_?Get@CSuper@@QAENXZ <- double | void
__imp_?Get@CSuper@@QAEOXZ <- long double | void
__imp_?Get@CSuper@@QAEPAXXZ <- void* | void
__imp_?Get@CSuper@@QAEPAHXZ <- int* | void
__imp_?Get@CSuper@@QAEPADXZ <- char* | void
__imp_?Get@CSuper@@QAEPAMXZ <- float* | void
__imp_?Get@CSuper@@QAEPANXZ <- double* | void
__imp_?Get@CSuper@@QAEPAOXZ <- long double* | void
__imp_?Get@CSuper@@QAEAAHXZ <- int& | void
__imp_?Get@CSuper@@QAEAADXZ <- char& | void
__imp_?Get@CSuper@@QAEAAMXZ <- float& | void
__imp_?Get@CSuper@@QAEAANXZ <- double& | void
__imp_?Get@CSuper@@QAEAAOXZ <- long double& | void

__imp_?Get@CSuper@@QAEIXZ <- unsigned int | void
__imp_?Get@CSuper@@QAEEXZ <- unsigned char | void
__imp_?Get@CSuper@@QAEPAIXZ <- unsigned int* | void
__imp_?Get@CSuper@@QAEPAEXZ <- unsigned char* | void
__imp_?Get@CSuper@@QAEAAIXZ <- unsigned int& | void
__imp_?Get@CSuper@@QAEAAEXZ <- unsigned char& | void

__imp_?Get@CSuper@@QAE?AV1@XZ <- CSuper | void
__imp_?Get@CSuper@@QAEPAV1@XZ <- CSuper* | void
__imp_?Get@CSuper@@QAEAAV1@XZ <- CSuper& | void

__imp_?Get@CSuper@@QAE?BHXZ <- const int | void
__imp_?Get@CSuper@@QAE?BDXZ <- const char | void
__imp_?Get@CSuper@@QAEPBHXZ <- const int* | void
__imp_?Get@CSuper@@QAEPBDXZ <- const char* | void
__imp_?Get@CSuper@@QAEQAHXZ <- int* const | void
__imp_?Get@CSuper@@QAEQADXZ <- char* const | void

128 ◆rCEzuNnL0g:2008/08/30(土) 17:40:46
__imp_?Get@CSuper@@QAEXXZ <- void | void
__imp_?Get@CSuper@@QAEHXZ <- int | void
__imp_?Get@CSuper@@QAEFXZ <- short | void
__imp_?Get@CSuper@@QAEJXZ <- long | void
__imp_?Get@CSuper@@QAEDXZ <- char | void
__imp_?Get@CSuper@@QAEMXZ <- float | void
__imp_?Get@CSuper@@QAENXZ <- double | void
__imp_?Get@CSuper@@QAEOXZ <- long double | void
__imp_?Get@CSuper@@QAEPAXXZ <- void* | void
__imp_?Get@CSuper@@QAEPAHXZ <- int* | void
__imp_?Get@CSuper@@QAEPADXZ <- char* | void
__imp_?Get@CSuper@@QAEPAMXZ <- float* | void
__imp_?Get@CSuper@@QAEPANXZ <- double* | void
__imp_?Get@CSuper@@QAEPAOXZ <- long double* | void
__imp_?Get@CSuper@@QAEAAHXZ <- int& | void
__imp_?Get@CSuper@@QAEAADXZ <- char& | void
__imp_?Get@CSuper@@QAEAAMXZ <- float& | void
__imp_?Get@CSuper@@QAEAANXZ <- double& | void
__imp_?Get@CSuper@@QAEAAOXZ <- long double& | void

__imp_?Get@CSuper@@QAEIXZ <- unsigned int | void
__imp_?Get@CSuper@@QAEEXZ <- unsigned char | void
__imp_?Get@CSuper@@QAEPAIXZ <- unsigned int* | void
__imp_?Get@CSuper@@QAEPAEXZ <- unsigned char* | void
__imp_?Get@CSuper@@QAEAAIXZ <- unsigned int& | void
__imp_?Get@CSuper@@QAEAAEXZ <- unsigned char& | void

__imp_?Get@CSuper@@QAE?AV1@XZ <- CSuper | void
__imp_?Get@CSuper@@QAEPAV1@XZ <- CSuper* | void
__imp_?Get@CSuper@@QAEAAV1@XZ <- CSuper& | void

__imp_?Get@CSuper@@QAE?BHXZ <- const int | void
__imp_?Get@CSuper@@QAE?BDXZ <- const char | void
__imp_?Get@CSuper@@QAEPBHXZ <- const int* | void
__imp_?Get@CSuper@@QAEPBDXZ <- const char* | void
__imp_?Get@CSuper@@QAEABHXZ <- const int& | void
__imp_?Get@CSuper@@QAEABDXZ <- const char& | void
__imp_?Get@CSuper@@QAEQAHXZ <- int* const | void
__imp_?Get@CSuper@@QAEQADXZ <- char* const | void
__imp_?Get@CSuper@@QAEQBHXZ <- const int* const | void
__imp_?Get@CSuper@@QAEQBDXZ <- const char* cont | void

129 ◆rCEzuNnL0g:2008/08/30(土) 17:47:16
__imp_?Get@CSuper@@QAEXXZ <- void | void
__imp_?Get@CSuper@@QAEHXZ <- int | void
__imp_?Get@CSuper@@QAEFXZ <- short | void
__imp_?Get@CSuper@@QAEJXZ <- long | void
__imp_?Get@CSuper@@QAEDXZ <- char | void
__imp_?Get@CSuper@@QAEMXZ <- float | void
__imp_?Get@CSuper@@QAENXZ <- double | void
__imp_?Get@CSuper@@QAEOXZ <- long double | void
__imp_?Get@CSuper@@QAEPAXXZ <- void* | void
__imp_?Get@CSuper@@QAEPAHXZ <- int* | void
__imp_?Get@CSuper@@QAEPADXZ <- char* | void
__imp_?Get@CSuper@@QAEPAMXZ <- float* | void
__imp_?Get@CSuper@@QAEPANXZ <- double* | void
__imp_?Get@CSuper@@QAEPAOXZ <- long double* | void
__imp_?Get@CSuper@@QAEAAHXZ <- int& | void
__imp_?Get@CSuper@@QAEAADXZ <- char& | void
__imp_?Get@CSuper@@QAEAAMXZ <- float& | void
__imp_?Get@CSuper@@QAEAANXZ <- double& | void
__imp_?Get@CSuper@@QAEAAOXZ <- long double& | void

__imp_?Get@CSuper@@QAEIXZ <- unsigned int | void
__imp_?Get@CSuper@@QAEEXZ <- unsigned char | void
__imp_?Get@CSuper@@QAEPAIXZ <- unsigned int* | void
__imp_?Get@CSuper@@QAEPAEXZ <- unsigned char* | void
__imp_?Get@CSuper@@QAEAAIXZ <- unsigned int& | void
__imp_?Get@CSuper@@QAEAAEXZ <- unsigned char& | void

__imp_?Get@CSuper@@QAE?AV1@XZ <- CSuper | void
__imp_?Get@CSuper@@QAEPAV1@XZ <- CSuper* | void
__imp_?Get@CSuper@@QAEAAV1@XZ <- CSuper& | void

__imp_?Get@CSuper@@QAE?BHXZ <- const int | void
__imp_?Get@CSuper@@QAE?BDXZ <- const char | void
__imp_?Get@CSuper@@QAEPBHXZ <- const int* | void
__imp_?Get@CSuper@@QAEPBDXZ <- const char* | void
__imp_?Get@CSuper@@QAEABHXZ <- const int& | void
__imp_?Get@CSuper@@QAEABDXZ <- const char& | void
__imp_?Get@CSuper@@QAEQAHXZ <- int* const | void
__imp_?Get@CSuper@@QAEQADXZ <- char* const | void
__imp_?Get@CSuper@@QAEQBHXZ <- const int* const | void
__imp_?Get@CSuper@@QAEQBDXZ <- const char* cont | void

__imp_?Get@CSuper@@QAEPAPADXZ <- char** | void
__imp_?Get@CSuper@@QAEPAPBDXZ <- const char** | void
__imp_?Get@CSuper@@QAEPBQADXZ <- char* const* | void
__imp_?Get@CSuper@@QAEQAPADXZ <- char** const | void
__imp_?Get@CSuper@@QAEPBQBDXZ <- const char* const* | void
__imp_?Get@CSuper@@QAEQAPBDXZ <- const char** const | void
__imp_?Get@CSuper@@QAEQBQADXZ <- char* const* const | void
__imp_?Get@CSuper@@QAEQBQBDXZ <- const char* const* const | void

130 ◆rCEzuNnL0g:2008/08/30(土) 17:53:12
__imp_?Get@CSuper@@QAEXXZ <- void | void
__imp_?Get@CSuper@@QAEHXZ <- int | void
__imp_?Get@CSuper@@QAEFXZ <- short | void
__imp_?Get@CSuper@@QAEJXZ <- long | void
__imp_?Get@CSuper@@QAEDXZ <- char | void
__imp_?Get@CSuper@@QAEMXZ <- float | void
__imp_?Get@CSuper@@QAENXZ <- double | void
__imp_?Get@CSuper@@QAEOXZ <- long double | void
__imp_?Get@CSuper@@QAEPAXXZ <- void* | void
__imp_?Get@CSuper@@QAEPAHXZ <- int* | void
__imp_?Get@CSuper@@QAEPADXZ <- char* | void
__imp_?Get@CSuper@@QAEPAMXZ <- float* | void
__imp_?Get@CSuper@@QAEPANXZ <- double* | void
__imp_?Get@CSuper@@QAEPAOXZ <- long double* | void
__imp_?Get@CSuper@@QAEAAHXZ <- int& | void
__imp_?Get@CSuper@@QAEAADXZ <- char& | void
__imp_?Get@CSuper@@QAEAAMXZ <- float& | void
__imp_?Get@CSuper@@QAEAANXZ <- double& | void
__imp_?Get@CSuper@@QAEAAOXZ <- long double& | void

__imp_?Get@CSuper@@QAEIXZ <- unsigned int | void
__imp_?Get@CSuper@@QAEEXZ <- unsigned char | void
__imp_?Get@CSuper@@QAEPAIXZ <- unsigned int* | void
__imp_?Get@CSuper@@QAEPAEXZ <- unsigned char* | void
__imp_?Get@CSuper@@QAEAAIXZ <- unsigned int& | void
__imp_?Get@CSuper@@QAEAAEXZ <- unsigned char& | void

__imp_?Get@CSuper@@QAE?AV1@XZ <- CSuper | void
__imp_?Get@CSuper@@QAEPAV1@XZ <- CSuper* | void
__imp_?Get@CSuper@@QAEAAV1@XZ <- CSuper& | void

__imp_?Get@CSuper@@QAE?BHXZ <- const int | void
__imp_?Get@CSuper@@QAE?BDXZ <- const char | void
__imp_?Get@CSuper@@QAEPBHXZ <- const int* | void
__imp_?Get@CSuper@@QAEPBDXZ <- const char* | void
__imp_?Get@CSuper@@QAEABHXZ <- const int& | void
__imp_?Get@CSuper@@QAEABDXZ <- const char& | void
__imp_?Get@CSuper@@QAEQAHXZ <- int* const | void
__imp_?Get@CSuper@@QAEQADXZ <- char* const | void
__imp_?Get@CSuper@@QAEQBHXZ <- const int* const | void
__imp_?Get@CSuper@@QAEQBDXZ <- const char* cont | void

__imp_?Get@CSuper@@QAEPAPADXZ <- char** | void
__imp_?Get@CSuper@@QAEPAPBDXZ <- const char** | void
__imp_?Get@CSuper@@QAEPBQADXZ <- char* const* | void
__imp_?Get@CSuper@@QAEQAPADXZ <- char** const | void
__imp_?Get@CSuper@@QAEPBQBDXZ <- const char* const* | void
__imp_?Get@CSuper@@QAEQAPBDXZ <- const char** const | void
__imp_?Get@CSuper@@QAEQBQADXZ <- char* const* const | void
__imp_?Get@CSuper@@QAEQBQBDXZ <- const char* const* const | void

__imp_?Get@CSuper@@QAEPAPAPADXZ <- char*** | void
__imp_?Get@CSuper@@QAEPAPAPAPADXZ <- char**** | void
__imp_?Get@CSuper@@QAEPAPAPAPAPADXZ <- char***** | void

__imp_?Get@CSuper@@QAEAAPADXZ <- char*& | void
__imp_?Get@CSuper@@QAEAAPBDXZ <- const char*& | void
__imp_?Get@CSuper@@QAEABQADXZ <- char* const& | void

__imp_?Get@CSuper@@QAEAAPAPADXZ <- char**& | void

131 ◆rCEzuNnL0g:2008/08/30(土) 17:55:01
後で詳しく調べる。
-----------------------------------------
__imp_?Get@CSuper@@QAEXXZ <- void | void
__imp_?Get@CSuper@@QAEHXZ <- int | void
__imp_?Get@CSuper@@QAEFXZ <- short | void
__imp_?Get@CSuper@@QAEJXZ <- long | void
__imp_?Get@CSuper@@QAEDXZ <- char | void
__imp_?Get@CSuper@@QAEMXZ <- float | void
__imp_?Get@CSuper@@QAENXZ <- double | void
__imp_?Get@CSuper@@QAEOXZ <- long double | void
__imp_?Get@CSuper@@QAEPAXXZ <- void* | void
__imp_?Get@CSuper@@QAEPAHXZ <- int* | void
__imp_?Get@CSuper@@QAEPADXZ <- char* | void
__imp_?Get@CSuper@@QAEPAMXZ <- float* | void
__imp_?Get@CSuper@@QAEPANXZ <- double* | void
__imp_?Get@CSuper@@QAEPAOXZ <- long double* | void
__imp_?Get@CSuper@@QAEAAHXZ <- int& | void
__imp_?Get@CSuper@@QAEAADXZ <- char& | void
__imp_?Get@CSuper@@QAEAAMXZ <- float& | void
__imp_?Get@CSuper@@QAEAANXZ <- double& | void
__imp_?Get@CSuper@@QAEAAOXZ <- long double& | void

__imp_?Get@CSuper@@QAEIXZ <- unsigned int | void
__imp_?Get@CSuper@@QAEEXZ <- unsigned char | void
__imp_?Get@CSuper@@QAEPAIXZ <- unsigned int* | void
__imp_?Get@CSuper@@QAEPAEXZ <- unsigned char* | void
__imp_?Get@CSuper@@QAEAAIXZ <- unsigned int& | void
__imp_?Get@CSuper@@QAEAAEXZ <- unsigned char& | void

__imp_?Get@CSuper@@QAE?AV1@XZ <- CSuper | void
__imp_?Get@CSuper@@QAEPAV1@XZ <- CSuper* | void
__imp_?Get@CSuper@@QAEAAV1@XZ <- CSuper& | void

__imp_?Get@CSuper@@QAE?BHXZ <- const int | void
__imp_?Get@CSuper@@QAE?BDXZ <- const char | void
__imp_?Get@CSuper@@QAEPBHXZ <- const int* | void
__imp_?Get@CSuper@@QAEPBDXZ <- const char* | void
__imp_?Get@CSuper@@QAEABHXZ <- const int& | void
__imp_?Get@CSuper@@QAEABDXZ <- const char& | void
__imp_?Get@CSuper@@QAEQAHXZ <- int* const | void
__imp_?Get@CSuper@@QAEQADXZ <- char* const | void
__imp_?Get@CSuper@@QAEQBHXZ <- const int* const | void
__imp_?Get@CSuper@@QAEQBDXZ <- const char* cont | void

__imp_?Get@CSuper@@QAEPAPADXZ <- char** | void
__imp_?Get@CSuper@@QAEPAPBDXZ <- const char** | void
__imp_?Get@CSuper@@QAEPBQADXZ <- char* const* | void
__imp_?Get@CSuper@@QAEQAPADXZ <- char** const | void
__imp_?Get@CSuper@@QAEPBQBDXZ <- const char* const* | void
__imp_?Get@CSuper@@QAEQAPBDXZ <- const char** const | void
__imp_?Get@CSuper@@QAEQBQADXZ <- char* const* const | void
__imp_?Get@CSuper@@QAEQBQBDXZ <- const char* const* const | void

__imp_?Get@CSuper@@QAEPAPAPADXZ <- char*** | void
__imp_?Get@CSuper@@QAEPAPAPAPADXZ <- char**** | void
__imp_?Get@CSuper@@QAEPAPAPAPAPADXZ <- char***** | void

__imp_?Get@CSuper@@QAEAAPADXZ <- char*& | void
__imp_?Get@CSuper@@QAEAAPBDXZ <- const char*& | void
__imp_?Get@CSuper@@QAEABQADXZ <- char* const& | void

__imp_?Get@CSuper@@QAEAAPAPADXZ <- char**& | void

132 ◆rCEzuNnL0g:2008/08/30(土) 18:07:58
void | const int == void | int

133 ◆rCEzuNnL0g:2008/08/30(土) 18:12:53
後で詳しく調べる。
-----------------------------------------
__imp_?Get@CSuper@@QAEXXZ <- void | void
__imp_?Get@CSuper@@QAEXH@Z <- void | int
__imp_?Get@CSuper@@QAEXF@Z <- void | short
__imp_?Get@CSuper@@QAEXJ@Z <- void | long
__imp_?Get@CSuper@@QAEXD@Z <- void | char
__imp_?Get@CSuper@@QAEXM@Z <- void | float
__imp_?Get@CSuper@@QAEXN@Z <- void | double
__imp_?Get@CSuper@@QAEXO@Z <- void | long double

__imp_?Get@CSuper@@QAEXI@Z <- void | unsigned int
__imp_?Get@CSuper@@QAEXE@Z <- void | unsigned char

__imp_?Get@CSuper@@QAEXPAX@Z <- void | void*
__imp_?Get@CSuper@@QAEXPAH@Z <- void | int*
__imp_?Get@CSuper@@QAEXPAD@Z <- void | char*
__imp_?Get@CSuper@@QAEXPAM@Z <- void | float*
__imp_?Get@CSuper@@QAEXPAN@Z <- void | double*
__imp_?Get@CSuper@@QAEXPAO@Z <- void | long double*

__imp_?Get@CSuper@@QAEXAAH@Z <- void | int&
__imp_?Get@CSuper@@QAEXAAD@Z <- void | char&

__imp_?Get@CSuper@@QAEXPBD@Z <- void | const char*
__imp_?Get@CSuper@@QAEXQAD@Z <- void | char* const
__imp_?Get@CSuper@@QAEXQBD@Z <- void | const char* const

__imp_?Get@CSuper@@QAEXPAPAD@Z <- void | char**

134 ◆rCEzuNnL0g:2008/08/30(土) 19:12:06
その他、適当
-----------------------------------------
__imp_?Get@CSuper@@QAEXXZ <- void | void
__imp_?Get@CSuper@@QAEP6AXXZXZ <- void (__cdecl *)() | void
__imp_?Get@CSuper@@QAEP6GXXZXZ <- void (__stdcall *)() | void
__imp_?Get@CSuper@@QAEP6IXXZXZ <- void (__fastcall *)() | void
__imp_?Get@CSuper@@QAEP6AHXZXZ <- int (__cdecl *)() | void
__imp_?Get@CSuper@@QAEP6ADXZXZ <- char (__cdecl *)() | void
__imp_?Get@CSuper@@QAEP6APAXXZXZ <- void* (__cdecl *)() | void
__imp_?Get@CSuper@@QAEP6APADXZXZ <- char* (__cdecl *)() | void

__imp_?Get@CSuper@@QAEP6AXH@ZXZ <- void (__cdecl *)(int) | void
__imp_?Get@CSuper@@QAEP6AXD@ZXZ <- void (__cdecl *)(char) | void
__imp_?Get@CSuper@@QAEP6AXPAD@ZXZ <- void (__cdecl *)(char*) | void

__imp_?Get@CSuper@@QAEP6AXPAX@Z0@Z <- void (__cedcl *)(void *) | void*
__imp_?Get@CSuper@@QAEP6AXPAX@ZH@Z <- void (__cedcl *)(void *) | int

__imp_?Get@CSuper@@QAEPAY00DXZ <- char (*)[1] | void
__imp_?Get@CSuper@@QAEPAY01DXZ <- char (*)[2] | void
__imp_?Get@CSuper@@QAEPAY09DXZ <- char (*)[10] | void
__imp_?Get@CSuper@@QAEPAY0L@DXZ <- char (*)[11] | void
__imp_?Get@CSuper@@QAEPAY0M@DXZ <- char (*)[12] | void
__imp_?Get@CSuper@@QAEPAY0N@DXZ <- char (*)[13] | void
__imp_?Get@CSuper@@QAEPAY0O@DXZ <- char (*)[14] | void
__imp_?Get@CSuper@@QAEPAY0P@DXZ <- char (*)[15] | void
__imp_?Get@CSuper@@QAEPAY0BA@DXZ <- char (*)[16] | void
__imp_?Get@CSuper@@QAEPAY0BP@DXZ <- char (*)[31] | void
__imp_?Get@CSuper@@QAEPAY0CA@DXZ <- char (*)[32] | void
__imp_?Get@CSuper@@QAEPAY00HXZ <- int (*)[1] | void
__imp_?Get@CSuper@@QAEPAY00PADXZ <- char *(*)[1] | void

135 ◆rCEzuNnL0g:2008/08/30(土) 19:35:42
__imp_?Get@CSuper@@QAEP6AP6AXXZXZXZ <- void (__cdecl *(__cdecl *)())() | void

__imp_?Get@CSuper@@QAEPAY09P6AXXZXZ <- void (__cdecl*(*)[10])() | void
__imp_?Get@CSuper@@QAEPAY09P6APAY09P6APAY09P6APAY09P6AXXZXZXZXZXZ <- void (__cdecl *(*(__cdecl *(*(__cdecl *(*(__cdecl *(*)[10])(void))[10])(void))[10])(void))[10])(void)

136 ◆rCEzuNnL0g:2008/08/30(土) 19:51:01
詳しく調べる
-----------------------------------------
__imp_?Get@CSuper@@QAEXXZ <- void | void
__imp_?Get@CSuper@@QAEXH@Z <- void | int
__imp_?Get@CSuper@@QAEXHH@Z <- void | int, int
__imp_?Get@CSuper@@QAEXHD@Z <- void | int, char
__imp_?Get@CSuper@@QAEXHPAHAAH@Z <- void | int, int*, int&
__imp_?Get@CSuper@@QAEXV1@PAV1@AAV1@@Z <- void | CSuper, CSuper*, CSuper&
__imp_?Get@CSub@@QAEXVCSuper@@PAV2@AAV2@@Z <- void | CSuper, CSuper*, CSuper&
__imp_?Get@CSub@@QAEXHVCSuper@@PAD@Z <- void | int, CSuper, char*

137 ◆rCEzuNnL0g:2008/08/30(土) 20:31:08
int Get();
__imp_?Get@@YAHXZ
namespace AA{
int Get()
}
__imp_?Get@AA@@YAHXZ

138 ◆rCEzuNnL0g:2008/08/30(土) 20:34:42
class CSuper{public: static int Get();};
__imp_?Get@CSuper@@SAHXZ

139 ◆rCEzuNnL0g:2008/08/30(土) 22:53:03
今までに分かっていること・・・
・??_7FButton@@6B@
 FButtonの為の`vftable'。(何処から継承しているかは不明、継承元は一つ)
・??_7FActionData@@6BFIActionData2@@@
・??_7FActionData@@6BFObject@@@
 FActionDataの為のFIActionData2の`vftable'。(継承元は二つ以上)
 FActionDataの為のFObjectの`vftable'。

140 ◆rCEzuNnL0g:2008/08/30(土) 22:55:37
>>139の上は継承していない場合もある。
つまり、継承していないか、一つから継承している。

141 ◆rCEzuNnL0g:2008/08/30(土) 22:58:28
__imp_??0CSub@@QAE@XZ <- コンストラクタ void
__imp_??0CSub@@QAE@PBD@Z <- コンストラクタ const char*

142 ◆rCEzuNnL0g:2008/08/30(土) 23:00:39
__imp_??0CSub@@QAE@ABV0@@Z <- コピーコンストラクタ

143 ◆rCEzuNnL0g:2008/08/30(土) 23:19:21
自前で、コンストラクタ、コピーコンストラクタ、デストラクタを実装してエクスポートした。
エクスポートしているものは以下。
??0CClass@@QAE@ABV0@@Z
??0CClass@@QAE@XZ <- コンストラクタ
??1CClass@@QAE@XZ <- デストラクタ
??4CClass@@QAEAAV0@ABV0@@Z <- コピーコンストラクタ
一番は何かなあ?
多分此れも、コピーコンストラクタだと思う。
何故かって言うと、
-----
CClass e;
CClass e1 = e; // コピーコンストラクタ!
-----
これはコピーコンストラクタだと分かる。
だから??4CClass@@QAEAAV0@ABV0@@Zを見に行く。
次に、
-----
CClass e;
CClass e1(e);
-----
の時。
此れはコピーコンストラクタが実際は呼び出されるのだが、恐らくコンパイラの扱いでは、
“const CClass &”が渡されるコンストラクタだと思うのだろう。だから
??0CClass@@QAE@ABV0@@Z
を見に行く。だから二つ必要。

144 ◆rCEzuNnL0g:2008/08/30(土) 23:21:18
因みに、OllyDbgでエクスポート一覧を見ると、三つしか出ない。
多分、同じアドレスを指す奴が見つかったら後からの奴を採用するのだろう。

145 ◆rCEzuNnL0g:2008/08/30(土) 23:24:06
つまり、
??0********ABV0@@Z // コピーコンストラクタ!
??4*************** // コピーコンストラクタ!
??0*************** // コンストラクタ!
??1*************** // デストラクタ!
って言うことだ。
??4があると??0(ryもあるということ。

146 ◆rCEzuNnL0g:2008/08/30(土) 23:33:05
?Get@CSub@@UAEHXZ
のように、@UAEとなっているのは、仮想関数のようである。
純仮想関数はエクスポートされない。

147 ◆rCEzuNnL0g:2008/08/30(土) 23:33:48
@QAE <- 通常

@UAE <- virtual
だからAEの意味は分からない。

148 ◆rCEzuNnL0g:2008/08/30(土) 23:34:26
コピーコンストラクタは自動的に作られるっぽい。
まあ、元の仕様がそうだから、当たり前か。

149 ◆rCEzuNnL0g:2008/08/30(土) 23:36:37
class CSuper{public: virtual int Get() = 0;};
class CSub : public CSuper{private: int i; public: CSub(int v){i = v;} ~CSub{} virtual int Get(){return i}};

をエクスポートした結果。
-----
序数: 0001 名前: ??0CSub@@QAE@ABV0@@Z
序数: 0002 名前: ??0CSub@@QAE@H@Z
序数: 0003 名前: ??0CSuper@@QAE@ABV0@@Z
序数: 0004 名前: ??0CSuper@@QAE@XZ
序数: 0005 名前: ??1CSub@@UAE@XZ
序数: 0006 名前: ??1CSuper@@QAE@XZ
序数: 0007 名前: ??4CSub@@QAEAAV0@ABV0@@Z
序数: 0008 名前: ??4CSuper@@QAEAAV0@ABV0@@Z
序数: 0009 名前: ??_7CSub@@6B@
序数: 000A 名前: ??_7CSuper@@6B@
序数: 000B 名前: ?Get@CSub@@UAEHXZ

150 ◆rCEzuNnL0g:2008/08/30(土) 23:39:12
まだ、??7とか??8とか??9とか??Bとか??Yは分からん。
operator系の関数?

151 ◆rCEzuNnL0g:2008/08/30(土) 23:49:39
コピーコンストラスタは自動生成されるが
コンストラクタと、デストラクタは自動生成されない。
何故ならば、処理が無いならば何もしなくて良いから。
ただ、virtualな関数を持つクラスを継承したらどうなるのだろうか。
まあ、一個上のデストラクタを呼び出さないけないな。
多分、virtualな関数が無くても、継承していればその二つは自動生成されるのだろう。

152 ◆rCEzuNnL0g:2008/08/30(土) 23:52:05
??Bはoperatorっぽい。
int, char, short, long, float, double, long double
void*, int*, char*, short*, long*, float*, double*, long double*
をエクスポートしたけど無駄だった。じゃあ、後はoperator+=とかだけか。
序数: 0002 名前: ??BCSuper@@QAEDXZ
序数: 0003 名前: ??BCSuper@@QAEFXZ
序数: 0004 名前: ??BCSuper@@QAEHXZ
序数: 0005 名前: ??BCSuper@@QAEJXZ
序数: 0006 名前: ??BCSuper@@QAEMXZ
序数: 0007 名前: ??BCSuper@@QAENXZ
序数: 0008 名前: ??BCSuper@@QAEOXZ
序数: 0009 名前: ??BCSuper@@QAEPADXZ
序数: 000A 名前: ??BCSuper@@QAEPAFXZ
序数: 000B 名前: ??BCSuper@@QAEPAHXZ
序数: 000C 名前: ??BCSuper@@QAEPAJXZ
序数: 000D 名前: ??BCSuper@@QAEPAMXZ
序数: 000E 名前: ??BCSuper@@QAEPANXZ
序数: 000F 名前: ??BCSuper@@QAEPAOXZ
序数: 0010 名前: ??BCSuper@@QAEPAXXZ

153 ◆rCEzuNnL0g:2008/08/30(土) 23:53:26
後は??7,8,9,Yだけ。

154 ◆rCEzuNnL0g:2008/08/30(土) 23:58:21
??Yはoperator+=。

155 ◆rCEzuNnL0g:2008/08/31(日) 00:00:28
??Hはoperator+。
だけれども
??7,8,9は分からんなあ。

156 ◆rCEzuNnL0g:2008/08/31(日) 00:09:13
__imp_?Get@SClass@@QAEPA_WXZ <- wchar_t* | void
__imp_?Get@SClass@@QAE_JXZ <- long long int | void
__imp_?Get@SClass@@QAE_JXZ <- __int64 | void //上と同じ
__imp_?Get@SClass@@QAE_KXZ <- unsigned __int64 | void
__imp_?Get@SClass@@QAEPA_KXZ <- unsigned __int64* | void

157 ◆rCEzuNnL0g:2008/08/31(日) 07:54:18
__imp_??2CClass@@SAPAXI@Z <- operator new

158 ◆rCEzuNnL0g:2008/08/31(日) 18:08:51
サクラエディタである文字列を含まない行を消し去る正規表現
------
^(?!.*{対象文字列}).+[\r\n][\r\n]?$
------
{対象文字列}を置き換える。

159 ◆rCEzuNnL0g:2008/08/31(日) 19:09:24
MASMインラインアセンブラ
http://7ujm.net/C++/asm1.html
-----
インラインアセンブラメモ。

160 ◆rCEzuNnL0g:2008/08/31(日) 21:26:22
liveなquerySelectorAll - 素人がプログラミングを勉強するブログ
http://d.hatena.ne.jp/javascripter/20080831/1220184849

161 ◆rCEzuNnL0g:2008/08/31(日) 22:18:55
DLLをエクスポートするときにこんなのでも・・・
------------------------------------
#ifdef __cplusplus
# define CDLLExport extern "C" __declspec(dllexport)
#else
# define CDLLExport __declspec(dllexport)
#endif

#define DLLExport __declspec(dllexport)

162 ◆rCEzuNnL0g:2008/08/31(日) 23:19:29
無理やりfxプラグインを作ってやろうと思ったが、
関数ポインタ多すぎてやる気が起きないwwwwwwwwwwww
もう諦めよう。
だから、直接アクションを呼び出す方法だけを探そう!
早く、プラグインの作成の奴が出ないかなあ。

163 ◆rCEzuNnL0g:2008/08/31(日) 23:41:13
■ Takahashi's Web ■
http://www.nscripter.com/
-----
ひぐらし、うみねこはNScripterで作っている。

164 ◆rCEzuNnL0g:2008/08/31(日) 23:43:09
うpだて - みみず日記
http://d.hatena.ne.jp/sub_chon/20080827/1219808408#c
-----
VC++ 2008でコンパイルしないほうが良い件について。

165 ◆rCEzuNnL0g:2008/09/01(月) 00:07:08
CodeZine:プログラミングに役立つソースコードが満載な開発者のための実装系Webマガジン
http://codezine.jp/
-----
CodeZine!CodeZine!CodeZine!CodeZine!

166 ◆rCEzuNnL0g:2008/09/01(月) 00:36:17
MemoPanelの検索にBoostのRegexとか、正規表現のライブラリを使いたいけれども、
内部の文字列の持ち方が、Shift-JISなのでUnicodeに変換しなければいけない。
かなり、負荷が高そう。

167 ◆rCEzuNnL0g:2008/09/01(月) 00:40:01
 シンボリックリンクでアレコレ - Kei_9 なげやりにっき
http://d.hatena.ne.jp/Kei_9/20080831/1220195251
-----
後で読む。

168 ◆rCEzuNnL0g:2008/09/01(月) 17:54:05
>>167関連。
-----
リンク/ジャンクション作成ツール
http://homepage1.nifty.com/emk/symlink.html

169 ◆rCEzuNnL0g:2008/09/01(月) 18:59:53
Win32プログラミングノート
http://hp.vector.co.jp/authors/VA000092/win32/index.html

170 ◆rCEzuNnL0g:2008/09/01(月) 19:59:52
ntdll.dllの書き換えとCRCチェックの回避 - KENJI’S BLOG
http://d.hatena.ne.jp/kenjiaiko/20080817/1218980643
----
上手く利用すれば、PC(Windows XP以降?)が二度と起動できなくなるプログラムが作れるよー
作っても誰のパソコンを実験台にするかだなあ。
半年筆のパソコンにするかな?
ウィルス対策ソフトには引っかからない、素晴らしいウィルスになるんじゃない?
もう、誰かが作ってそうだけれども。

171 ◆rCEzuNnL0g:2008/09/02(火) 15:06:40
Lispのひび
http://d.hatena.ne.jp/tazant/
-----
Lispは面白いよね。全然理解できてないけれども。
因みにこの人中2だそうです。(1994年12月生まれ。)
すげー。
俺もLispが作れるか試してみよう! <- 嘘
但し整数だけだお。

172774さん:2008/09/02(火) 15:25:05
Lispを実行する環境はあるので試してみる。

173 ◆rCEzuNnL0g:2008/09/02(火) 15:31:43
上げちゃった・・・

まあ、基本を押さえているだけあってちゃんと分かっていた。

(setq x 1)
=> 1
(print x)
=> 1
面倒。

174 ◆rCEzuNnL0g:2008/09/02(火) 15:34:59
(defun double (x) (* x x))
=> double
(double 2)
=> 4

175 ◆rCEzuNnL0g:2008/09/02(火) 15:37:21
((lambda (x) (* x x)) 12)
=> 144
ね?簡単でしょ?(ボブ風に)
まあ、こんなもん、基本の基本。
というか、本当のLispなんて何も垣間見せていない。
まあ、詳しくはWikipediaでいいんじゃね?

176 ◆rCEzuNnL0g:2008/09/02(火) 15:46:12
悔しい悔しい悔しい悔しい悔しい悔しい悔しい悔しい悔しい悔しい

177 ◆rCEzuNnL0g:2008/09/02(火) 15:46:44
Sleipnir + Lispなんてどう?
まあ、出来ないけれども。

178 ◆rCEzuNnL0g:2008/09/02(火) 16:03:17
Lispは引数をちゃんとチェックするみたいだなあ。
ということは、引数の情報は(ry

まあ、ね。本当に凄い凄い、凄い凄い(ry

T216がとても気になる。

179 ◆rCEzuNnL0g:2008/09/02(火) 16:47:38
情報オリンピックおもすれー。
出たい出たい!

180 ◆rCEzuNnL0g:2008/09/02(火) 16:49:43
他のを上げて、此れはちゃんと下げるようにしないと・・・
強制sageを使おう!

181 ◆rCEzuNnL0g:2008/09/02(火) 16:52:04
これで、上げても大丈夫・・・

182 ◆rCEzuNnL0g:2008/09/02(火) 17:00:01
JOI2008-2009開催予定
http://www.ioi-jp.org/joi/2008/announce.html
-----
マジで出ようかなあ。

183 ◆rCEzuNnL0g:2008/09/02(火) 17:01:04
俺が出れるのは今年で最後っぽいし・・・

184 ◆rCEzuNnL0g:2008/09/02(火) 17:11:25
>>予選合格者の氏名・学校名・学年・性別は情報オリンピック日本委員会のウェブサイト他で公表されることがあります。また、予選合格者の氏名は在学している学校へ通知され、賞状(Aランク者のみ)は学校から本人へ渡していただきます。予めこれらのことを了承のうえで予選に参加してください。
予選合格しないから関係ないなwwwww

185 ◆rCEzuNnL0g:2008/09/02(火) 17:15:52
つまり、勝手に出ようかなということです。
勉強のためにCygwinを入れている。

186 ◆rCEzuNnL0g:2008/09/02(火) 17:17:49
まあいい、デバッガさえ使わなければVC++も他の環境と同じである。
どうせ、ブロックインデントはサクラエディタと一緒の設定にしているからな。

187 ◆rCEzuNnL0g:2008/09/02(火) 17:18:23
VC++で予選に出ても良いと思う。

188 ◆rCEzuNnL0g:2008/09/02(火) 17:31:04
日本予選の一番最近の奴の一問目の基本アルゴリズムは此れで良いとおも。
m が入力された値。
numが出力する値。
-----
int o = 1000 - m;

int num = 0;
while(o / 500){
num++;
o -= 500;
}
while(o / 100){
num++;
o -= 100;
}
while(o / 50){
num++;
o -= 50;
}
while(o / 10){
num++;
o -= 10;
}
while(o / 5){
num++;
o -= 5;
}
while(o / 1){
num++;
o -= 1;
}

189 ◆rCEzuNnL0g:2008/09/02(火) 17:35:48
オラが作ったプログラム、.cだとコンパイルできない><
.cppだとコンパイルできる。何故だ!

190 ◆rCEzuNnL0g:2008/09/02(火) 17:36:28
分かった!
変数を一番最初に列挙して宣言していないからだ!

191 ◆rCEzuNnL0g:2008/09/02(火) 17:52:42
Cで書いた。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){
FILE *in = fopen("input.txt", "r");
FILE *out = fopen("output.txt", "w");
char buff[1024];
int m; //出題元の値
int b; //バッファ
int c; //釣り
int num = 0; //枚数

if(!in || !out) return -1;

fgets(buff, sizeof(buff), in);
m = atoi(buff);
c = 1000 - m;

if(b = c / 500){
num += b;
c = c - b * 500;
}
if(b = c / 100){
num += b;
c = c - b * 100;
}
if(b = c / 50){
num += b;
c = c - b * 50;
}
if(b = c / 10){
num += b;
c = c - b * 10;
}
if(b = c / 5){
num += b;
c = c - b * 5;
}
if(b = c / 1){
num += b;
c = c - b * 1;
}

fprintf(out, "%d", num);

return 0;
}

192 ◆rCEzuNnL0g:2008/09/02(火) 18:03:56
二問目出来た。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){
FILE *in = fopen("input.txt", "r");
FILE *out = fopen("output.txt", "w");
char *buff = NULL;

int joi = 0, ioi = 0;


buff = calloc(10002, sizeof(char));
if(!in || !out || !buff) return -1;
fgets(buff, 10002, in);

while(*buff){
if(*buff == 'J' && *(buff + 1) == 'O' && *(buff + 2) == 'I'){
joi++;
}
if(*buff == 'I' && *(buff + 1) == 'O' && *(buff + 2) == 'I'){
ioi++;
}
buff++;
}

fprintf(out, "%d\r\n%d", joi, ioi);

return 0;
}

193 ◆rCEzuNnL0g:2008/09/02(火) 18:05:01
あ、メモリ開放するの忘れたwwww
よって、free(buff);をreturnの前へ。

194 ◆rCEzuNnL0g:2008/09/02(火) 19:00:52
飯を食っていたが、三問目も出来た。
-----
#include <stdio.h>
#include <stdlib.h>

struct data{
int num; //カード番号
int disable; //利用済みか 1:済
};

int cmp(const void *a, const void *b){
return ((struct data *)a)->num - ((struct data *)b)->num;
}

int main(int argc, char **argv){
FILE *in = fopen("input.txt", "r");
FILE *out = fopen("output.txt", "w");
char buff[32];
int length; //カードの量(n)
struct data *taro, *hanako; //太郎、花子
int taro_num, hanako_num;

int latest = -1; //今場に出ているカード
int next = 0; //次 0:太郎 1:花子

int i, j, k;

if(!in || !out) return -1;

fgets(buff, sizeof(buff), in);
length = atoi(buff);

taro = calloc(length + 1, sizeof(taro[0]));
hanako = calloc(length + 1, sizeof(hanako[0]));

if(!taro || !hanako) return -2;

for(i = 0; i < length; i++){
fgets(buff, sizeof(buff), in);
taro[i].num = atoi(buff);
}

qsort(taro, length, sizeof(taro[0]), cmp);


for(i = 1, j = 0, k = 0; i <= length * 2; i++){
if(i != taro[j].num){
hanako[k++].num = i;
}else{
j++;
}
}
taro_num = hanako_num = length;

//初期化終

while(taro_num != 0 && hanako_num != 0){
if(next == 0){ //太郎の番
for(i = 0; i < length; i++){
if(!taro[i].disable && latest < taro[i].num){
latest = taro[i].num;
taro[i].disable = 1;
taro_num--;
goto end1;
}
}

latest = -1;

end1:
next = 1;
}else{ //花子の番
for(i = 0; i < length; i++){
if(!hanako[i].disable && latest < hanako[i].num){
latest = hanako[i].num;
hanako[i].disable = 1;
hanako_num--;
goto end2;
}
}

latest = -1;

end2:
next = 0;
}
}

fprintf(out, "%d\r\n%d", hanako_num, taro_num);

free(taro);
free(hanako);

return 0;
}

195 ◆rCEzuNnL0g:2008/09/02(火) 19:02:38
今思えばファイルもクローズしていないなwww

196 ◆rCEzuNnL0g:2008/09/02(火) 19:44:11
此れを作るのに時間かかりすぎ。
四問目。
-----
#include <stdio.h>
#include <stdlib.h>

struct point{
int x;
int y;
};

int main(int argc, char **argv){
FILE *in = fopen("input.txt", "r");
FILE *out = fopen("output.txt", "w");
char buff[32];
int base_len, data_len; /*base : 探すの data: 星一杯*/
struct point *base, *data;
int def_x, def_y;

int i, j, k, l;

if(!in || !out) return -1;

fgets(buff, sizeof(buff), in);
base_len = atoi(buff);

base = calloc(base_len, sizeof(base[0]));

if(!base) return -2;

for(i = 0; i < base_len; i++){
fgets(buff, sizeof(buff), in);
sscanf(buff, "%d %d", &base[i].x, &base[i].y);
}

fgets(buff, sizeof(buff), in);
data_len = atoi(buff);

data = calloc(data_len, sizeof(data[0]));

if(!data) return -3;

for(i = 0; i < data_len; i++){
fgets(buff, sizeof(buff), in);
sscanf(buff, "%d %d", &data[i].x, &data[i].y);
}


for(i = 0; i < data_len; i++){
def_x = data[i].x - base[0].x;
def_y = data[i].y - base[0].y;
l = 0;

for(j = 1; j < base_len; j++){
for(k = 0; k < data_len; k++){
if(base[j].x + def_x == data[k].x && base[j].y + def_y == data[k].y) //見つかった
break;
}
if(k == data_len) //見つからなかった
break;
}
if(j == base_len) //見つかった
break;
}

fprintf(out, "%d %d", def_x, def_y);


return 0;
}

197 ◆rCEzuNnL0g:2008/09/02(火) 19:53:03
実は>>196二問正しい答えが出なかった。
頑張って直したのだ。

198 ◆rCEzuNnL0g:2008/09/02(火) 20:01:16
ちょwwwwwww
atoi関数でエラーが出たwwww

199 ◆rCEzuNnL0g:2008/09/02(火) 21:31:34
>>198
俺が馬鹿だっただけだ。

四問目が漸く出来た。
絶対三時間以内に出来ない。
-----
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct point{
int x;
int y;
};

int main(int argc, char **argv){
FILE *in = fopen("input.txt", "r");
FILE *out = fopen("output.txt", "w");
char buff[32];
int height, width;
char **mat;
char **c_mat;
int ret;

int i, j, k;

fgets(buff, sizeof(buff), in);
sscanf(buff, "%d %d", &height, &width);


mat = calloc(height, sizeof(mat[0]));
if(!mat) return -1;

for(i = 0; i < height; i++){
mat[i] = calloc(width, sizeof(mat[0][0]));
if(!mat[i]) return -2;
}

c_mat = calloc(height, sizeof(c_mat[0]));
if(!c_mat) return -3;

for(i = 0; i < height; i++){
c_mat[i] = calloc(width, sizeof(c_mat[0][0]));
if(!c_mat[i]) return -4;
}

for(i = 0; i < height; i++){
for(j = 0; j < width; j++){
mat[i][j] = fgetc(in) - '0' ? ~0 : 0;
fgetc(in);
}
}

//初期化終わり

//出来るだけ0へ

ret = -1;
for(i = 0; i < (1 << height); i++){
int carrent_max = 0;

for(j = 0; j < height; j++){
if((i >> j) & 1){
for(k = 0; k < width; k++){
c_mat[j][k] = ~mat[j][k];
}
}else{
for(k = 0; k < width; k++){
c_mat[j][k] = mat[j][k];
}
}
}

//第二初期化完了
for(j = 0; j < width; j++){
int count = 0;

for(k = 0; k < height; k++){
if(c_mat[k][j] == 0){
count++;
}
}

carrent_max += max(count, height - count);
}

ret = max(ret, carrent_max);
}

fprintf(out, "%d", ret);


return 0;
}

200 ◆rCEzuNnL0g:2008/09/02(火) 21:32:21
structいらないね。

201 ◆rCEzuNnL0g:2008/09/02(火) 21:38:05
というか解説読んでこんなに時間がかかっているんだから(ry
一時間四十五分かかっているのは、三十分ぐらい風呂かな。
多分もうちょっと少ないだろうが。

滅茶苦茶むずいじゃん。

202 ◆rCEzuNnL0g:2008/09/02(火) 21:38:44
今度は解説を読まずにやろう!
時間もちゃんと計ってね。

203 ◆rCEzuNnL0g:2008/09/02(火) 23:05:39
2007年度の俺の答え
1:>>191
2:>>192
3:>>194
4:>>196
5:まだ無い

204 ◆rCEzuNnL0g:2008/09/02(火) 23:08:00
4:は解説を見た
5:も解説を見てやろう。

205 ◆rCEzuNnL0g:2008/09/02(火) 23:19:46
C言語入門
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
で、ファイルの操作について詳しく勉強する。
C++のファイル操作もkwskやりたい。

206 ◆rCEzuNnL0g:2008/09/02(火) 23:21:47
FrontPage - プログラミングTipsWiki - livedoor Wiki(ウィキ)
http://wiki.livedoor.jp/eruvasu/d/FrontPage

207 ◆rCEzuNnL0g:2008/09/02(火) 23:28:42
C++で一行ずつ文字列を取得する方法。他にもある?
------
stl_fstream - プログラミングTipsWiki - livedoor Wiki(ウィキ)
http://wiki.livedoor.jp/eruvasu/d/stl_fstream?wiki_id=62368

208 ◆rCEzuNnL0g:2008/09/03(水) 00:56:15
という事で、基本を押さえよう。std::名前空間。
因みに2007ねんのもんだいはおもいつけばなんとかなるとおもった。

まあ、1%の閃きと99%の努力だからなあ。
1%の閃きが重要なんだよな。
現実は厳しい。

209 ◆rCEzuNnL0g:2008/09/03(水) 18:26:03
Google Chrome入れた。
やっぱり軽い。
JavaScriptのコンソールも良い感じ。
だけれども常用には耐えかねる。

210 ◆rCEzuNnL0g:2008/09/03(水) 18:29:23
こんな風にしたら、ちゃんとインライン展開された!

#include <iostream>

template<unsigned int c>
void Call(void (__cdecl pf)(int)){
Call<c - 1>(pf);
pf(c);
}

template<>
void Call<0>(void (__cdecl pf)(int)){
return;
}

void test(int c){
__asm{
push eax
pop eax
}
}

int main(int argc, char **argv){
Call<10>(test);
}

211 ◆rCEzuNnL0g:2008/09/03(水) 18:31:14
これは展開されない!
testは同じね。
-----
int main(int argc, char **argv){
for(int i = 0; i < 10; ++i)
test(i);
}

212 ◆rCEzuNnL0g:2008/09/03(水) 18:33:22
まあ、使えるのは10までっぽい。

213 ◆rCEzuNnL0g:2008/09/03(水) 18:55:52
まあ、十三ぐらいまではいけると思うけれども、あんまり宜しくないかも。

10.765/11.281/11.063/10.422 <-インライン展開
11.063/10.531/9.719/11.078 <-通常

ん?
インライン展開されて、比較の回数が減っているはずなのに遅いぜwww

-----
#include <iostream>
#include <ctime>

template<unsigned int c>
void Call(void (__cdecl pf)(int)){
Call<c - 1>(pf);
pf(c);
}

template<>
void Call<0>(void (__cdecl pf)(int)){
return;
}

void test(int c){
std::cout << c << std::endl;
}

int main(int argc, char **argv){
clock_t s = clock();

for(int i = 0; i < 10000; i++){
Call<10>(test);
/*
for(int i = 1; i <= 10; i++){
test(i);
}
*/
}

clock_t e = clock();

std::cout << (double)(e - s) / CLOCKS_PER_SEC << std::endl;
}

214 ◆rCEzuNnL0g:2008/09/03(水) 22:15:44
恐らくだけれどもCPUのキャッシュの問題だと思う。
第一次キャッシュがそんなにも大きくないのだろう。

215 ◆rCEzuNnL0g:2008/09/03(水) 22:30:23
本選第三問はオーバーフローに対する問題であろう。
つまり、大体は総当りでやればいいのだが、その時にどのように比較するかというのが重要である。
つまり
今まで足したの+今回足すの>規定の値
でやっていたら、左の値がオーバーフローしたら駄目である。
よって条件を、
今まで足したの>規定の値−今回足すの

今回足すの>規定の値−今まで足したの
にしなければならない。
まあ、与えられた値を降順(昇順)に並び替えるのも重要だよね。
降順だったら、一番大きいのを足して、次にまた足して、また足してを繰り返して、
規定の値を越えることとなったら、段々と小さい値を足していく。
そしてそれが終わったら、一個分戻って次に小さい値を試してその値から順番に小さい値を試していく。
そして、規定の値を超えない奴があったら、それと前回の奴を比較して大きいほうを取ると。
まあ、それの繰り返しで良いと思う。
Nの値は十分に小さいから、スタックは足りるはず。

216 ◆rCEzuNnL0g:2008/09/03(水) 22:32:33
多分解けるね。
再帰的呼び出しの問題だな、っと。

217 ◆rCEzuNnL0g:2008/09/03(水) 22:38:54
"やらにゃーか" 倉庫 - Google 検索
http://www.google.co.jp/search?hl=ja&amp;q=%22%E3%82%84%E3%82%89%E3%81%AB%E3%82%83%E3%83%BC%E3%81%8B%22+%E5%80%89%E5%BA%AB&amp;lr=
---
一件だけww

218 ◆rCEzuNnL0g:2008/09/03(水) 22:49:07
これ間違ってます。
これ間違ってます。

一問目について。
必要な変数は、いま連続している色、連続している個数、現在のインデックス、変更できるか、白の個数。
まず一個目は、
いま連続している色=今見ている色
連続している個数=1
現在のインデックス=1
変更できるか=出来ない
白の個数=現在の色が白なら1じゃないなら0
を代入する。
以下ループ
現在のインデックスをインクリメント
現在のインデックスが奇数の時
 現在見ている色と今の色が同じの時連続している個数をインクリメント
 違うとき今見ている色を変えて連続している個数=1。変更できるかが出来ないときは出来るを代入
現在のインデックスが偶数の時
 現在見ている色と今の色が同じの時連続している個数をインクリメント
 違うときがちょっと複雑
  変更できるかが出来ないとき現在見ている色を変えて連続している個数=1。変更できるかを変更できるへ。
  変更できるかが出来るとき
   今見ている色が黒の時白の個数

219 ◆rCEzuNnL0g:2008/09/03(水) 22:58:26
>>218
普通にメモリが確保できた件について。
まあ、実際に採点が行われるパソコンで確保できるかは疑問だが。
というか、一番最初から違うのが出るまでは読み飛ばして良いと思う。
なぜかというとひっくり返しようが無いから。
0000001となっていたら、初めの六つの0は絶対ひっくり返らない。
だから
00000だけは読み飛ばして、
01
に色々とくっつけて考える。
0を白とするならば、その数だけ覚えておけばいい。これでは5.

220 ◆rCEzuNnL0g:2008/09/03(水) 22:59:40
で、次に最初に来る色と、今見ているインデックス(最初に読み飛ばしたのも入れて)、今見ている色が分かれば良い。

221 ◆rCEzuNnL0g:2008/09/03(水) 23:01:08
ああ、やっぱり場合分けが面倒だなあ。全部動的にメモリ確保してやったほうが早くね?

222 ◆rCEzuNnL0g:2008/09/03(水) 23:04:06
まあ、実際にはそんなに時間は無いのだが、良く考えてみよう。
寝る。

223 ◆rCEzuNnL0g:2008/09/04(木) 19:28:42
T216のソースが出たので取り敢えず落とす。
大体五百行ぐらいかなあ?
まあ多くても千行位なので頑張って読めば(ry

224 ◆rCEzuNnL0g:2008/09/04(木) 20:13:11
DbgHelp
http://msdn.microsoft.com/ja-jp/library/cc428915.aspx

225 ◆rCEzuNnL0g:2008/09/04(木) 20:14:08
>>223
こういうの見ていると、Lispを動かせるように何か書きたくなる。
いや、マジで。
書かないけれども。
取り敢えず時間があるときに研究だ!

226 ◆rCEzuNnL0g:2008/09/04(木) 20:35:42
知りたいこと
・GCの実装
・構文解析
・実行の方法

227 ◆rCEzuNnL0g:2008/09/04(木) 20:39:45
ダイナミックObjective-C | コラム | エンタープライズ | マイコミジャーナル
http://journal.mycom.co.jp/column/objc/
---
Objective-C

228 ◆rCEzuNnL0g:2008/09/04(木) 22:28:44
Google Chrome の JavaScript エンジン V8 を試す - IT戦記
http://d.hatena.ne.jp/amachang/20080903/1220405193
-----
V8で何か書く?

229 ◆rCEzuNnL0g:2008/09/04(木) 22:29:20
Standard ECMA-262
http://www.ecma-international.org/publications/standards/Ecma-262.htm
----
ECMA-262仕様書。

230 ◆rCEzuNnL0g:2008/09/04(木) 22:31:33
>>229
どんな感じでスクリプトエンジンを作ればいいかが、わかるかもしれない。

231 ◆rCEzuNnL0g:2008/09/04(木) 22:40:03
SafariとGoogle Chromeとで表示が異なる。
フォントは明らかだが、エレメントの角を丸めたときに周りが黒くなる。
エレメントに影を付けていることかなあ。

232 ◆rCEzuNnL0g:2008/09/05(金) 00:55:43
>>231
エレメントに影を付けていることかなあ。
-> エレメントに影を付けているからかなあ。

233 ◆rCEzuNnL0g:2008/09/05(金) 01:09:01
>>223
今の僕には理解できないww

234 ◆rCEzuNnL0g:2008/09/05(金) 01:09:32
あれ・・・
ただのCなのにな。
なんだか目眩が・・・

235 ◆rCEzuNnL0g:2008/09/05(金) 01:10:04
そういえば、Sleipnirの新バージョンが出たよー。
特に新しくなっていないから、いれなくてもいいんじゃね?

236 ◆rCEzuNnL0g:2008/09/05(金) 19:50:51
SunSpider JavaScript Benchmark Results
http://www2.webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B563,437,453,438,438%5D,%223d-morph%22:%5B516,532,516,438,469%5D,%223d-raytrace%22:%5B532,578,594,562,562%5D,%22access-binary-trees%22:%5B672,1281,1391,1406,1203%5D,%22access-fannkuch%22:%5B907,906,906,922,906%5D,%22access-nbody%22:%5B625,594,640,656,641%5D,%22access-nsieve%22:%5B453,438,359,375,422%5D,%22bitops-3bit-bits-in-byte%22:%5B406,312,390,391,390%5D,%22bitops-bits-in-byte%22:%5B437,391,422,407,407%5D,%22bitops-bitwise-and%22:%5B704,687,687,703,718%5D,%22bitops-nsieve-bits%22:%5B531,515,531,500,500%5D,%22controlflow-recursive%22:%5B344,359,391,421,391%5D,%22crypto-aes%22:%5B547,531,469,594,516%5D,%22crypto-md5%22:%5B203,344,329,204,188%5D,%22crypto-sha1%22:%5B281,297,343,359,375%5D,%22date-format-tofte%22:%5B844,1859,2000,1969,1968%5D,%22date-format-xparb%22:%5B453,453,469,484,469%5D,%22math-cordic%22:%5B485,500,562,484,485%5D,%22math-partial-sums%22:%5B469,437,469,453,469%5D,%22math-spectral-norm%22:%5B406,422,438,422,391%5D,%22regexp-dna%22:%5B500,609,500,500,485%5D,%22string-base64%22:%5B1688,1781,1687,1735,1766%5D,%22string-fasta%22:%5B438,422,422,438,437%5D,%22string-tagcloud%22:%5B344,484,344,343,343%5D,%22string-unpack-code%22:%5B344,344,328,454,343%5D,%22string-validate-input%22:%5B531,484,469,500,500%5D%7D

237 ◆rCEzuNnL0g:2008/09/05(金) 21:42:41
CPUのセグメントについて勉強したい。

238 ◆rCEzuNnL0g:2008/09/06(土) 13:27:50
Cygwinについて勉強するよー
Linuxのコマンドについても知りたいしねw

兄者にC入門以前の本を貸していただきたいものである。
つまりCUIを勉強したいなあと。

239 ◆rCEzuNnL0g:2008/09/06(土) 18:56:31
Linux(Unix)には一ページ出力したら、出力を一時停めるコマンドは無いのか?

240 ◆rCEzuNnL0g:2008/09/06(土) 18:56:50
Windowsならmoreで出来るのだが。

241 ◆rCEzuNnL0g:2008/09/06(土) 21:12:36
C++で、文字列を一行分取得するのは普通に
std::istream::getlineで出来るじゃんと。
-----
char p[100];
std::cin.getline(p, sizeof(p));
-----

242 ◆rCEzuNnL0g:2008/09/06(土) 21:12:52
ファイルストリームもこれまた同様。

243 ◆rCEzuNnL0g:2008/09/06(土) 21:13:39
std::stringだったら
---
std::string str;
std::cin >> str;
でいいんだけれども。空白文字列とか、そこらへんの扱いが良く分からん。

244 ◆rCEzuNnL0g:2008/09/06(土) 22:14:39
typename は何故必要か
http://ray.sakura.ne.jp/template/typename.html
----
クソッ。このサイトに騙された。
typedef typename T type;
とか書かないといけないのに、typedefを省略するな。死んでしまえ!
という事で、忘れないように。

245 ◆rCEzuNnL0g:2008/09/06(土) 22:19:06
テンプレートメタプログラミングで多次元配列を返す関数を実装したい。
という事で、取り敢えず返却する型を返すプログラムを書いた。
---
template<typename t>
struct Pointer{
template<size_t i>
struct _{
typedef typename Pointer<t>::_<i - 1>::type *type;
};

template<>
struct _<0>{
typedef typename t type;
};
};

246 ◆rCEzuNnL0g:2008/09/06(土) 22:22:10
Pointer<char>::_<100>::type p;
とかすると“p”の型が
char型へのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへの
ポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへの
ポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへの
ポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへの
ポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへの
ポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへの
ポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへの
ポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへの
ポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへの
ポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタ
になる。

247 ◆rCEzuNnL0g:2008/09/06(土) 22:22:50
まあ、正直意味が無いんだけれどもね。
多次元配列には使える。

248 ◆rCEzuNnL0g:2008/09/06(土) 22:50:07
template名前空間なんて無い?
まあ、ただのclassと言ってしまえば(ry

249 ◆rCEzuNnL0g:2008/09/06(土) 22:50:53
こんな特殊化は出来ないのか!
----
template<typename t, size_t i>
typename Pointer<t>::_<i>::type Vec(va_list arg){
typename Pointer<t>::_<i>::type p;
size_t size = va_arg(arg, size_t);
p = new typename Pointer<t>::_<i - 1>[size];
for(int i = 0; i < size; ++i){
p[i] = Vec<t, i - 1>(arg);
}
return p;
}

template<typename t>
typename Pointer<t>::_<1>::type Vec<t, 1>(va_list arg){
return NULL;
}

250 ◆rCEzuNnL0g:2008/09/06(土) 23:16:26
何行目のエラーだよwww
------

------ すべてのリビルド開始: プロジェクト: test_test, 構成: Debug Win32 ------
プロジェクト 'test_test'、構成 'Debug|Win32' の中間出力ファイルを削除しています。
コンパイルしています...
main.cpp
プロジェクト : error PRJ0002 : エラーの結果 -1073741819 が 'C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.exe' より返されました。
ビルドログは "file://c:\Documents and Settings\*********\My Documents\Visual Studio 2008\Projects\test_test\test_test\Debug\BuildLog.htm" に保存されました。
test_test - エラー 1、警告 0
========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========

251 ◆rCEzuNnL0g:2008/09/06(土) 23:25:43
>>250
-----
#include <iostream>
#include <cstdarg>

template<typename t>
struct Pointer{
template<size_t i>
struct _{
typedef typename Pointer<t>::_<i - 1>::type *type;
};

template<>
struct _<0>{
typedef typename t type;
};
};

template<typename t>
struct _Vec{
template<size_t i>
static
typename Pointer<t>::_<i>::type fnc(va_list arg){
typename Pointer<t>::_<i>::type p;
size_t size = va_arg(arg, size_t);
p = new typename Pointer<t>::_<i - 1>[size];
for(size_t i = 0; i < size; ++i){
p[i] = Vec<t, i - 1>(arg);
}
return p;
}

template<>
static
typename Pointer<t>::_<1>::type fnc<1>(va_list arg){
size_t size = va_arg(arg, size_t)
return new typename Pointer<t>::_<0>::type[size];
}
};

template<typename t, size_t i>
typename Pointer<t>::_<i>::type Vec(size_t size, ...){
va_list arg;
va_start(arg, size);
typename Pointer<t>::_<i>::type p;
p = new typename Pointer<t>::_<i - 1>::type[size];
for(size_t j = 0; j < size; ++j){
p[j] = _Vec<t>::fnc<i - 1>(arg);
}
va_end(arg);

return p;
}

int main(){
Pointer<char>::_<1>::type p = Vec<char, 1>(10, 20);
}

252 ◆rCEzuNnL0g:2008/09/06(土) 23:35:07
出来たー
但しVec<>()のテンプレートの第二引数に1以下の値を渡すとコンパイラが暴走するよ。
----
#include <iostream>
#include <cstdarg>

template<typename t>
struct Pointer{
template<size_t i>
struct _{
typedef typename Pointer<t>::_<i - 1>::type *type;
};

template<>
struct _<0>{
typedef typename t type;
};
};

template<typename t>
struct _Vec{
template<size_t i>
static
typename Pointer<t>::_<i>::type fnc(va_list arg){
typename Pointer<t>::_<i>::type p;
size_t size = va_arg(arg, size_t);
p = new typename Pointer<t>::_<i - 1>::type[size];
for(size_t j = 0; j < size; ++j){
p[j] = fnc<i - 1>(arg);
}
return p;
}

template<>
static
typename Pointer<t>::_<1>::type fnc<1>(va_list arg){
size_t size = va_arg(arg, size_t);
return new typename Pointer<t>::_<0>::type[size];
}
};

template<typename t, size_t i>
typename Pointer<t>::_<i>::type Vec(size_t size, ...){
va_list arg;
va_start(arg, size);
typename Pointer<t>::_<i>::type p;
p = new typename Pointer<t>::_<i - 1>::type[size];
for(size_t j = 0; j < size; ++j){
p[j] = _Vec<t>::fnc<i - 1>(arg);
}
va_end(arg);

return p;
}

int main(){
Pointer<char>::_<10>::type p = Vec<char, 10>(2, 2, 2, 2, 2, 2, 2, 2, 2, 2);
}

253 ◆rCEzuNnL0g:2008/09/06(土) 23:45:19
ぎゃー。
char型の百次元配列を作ろうとしたら止まったwww

254 ◆rCEzuNnL0g:2008/09/06(土) 23:45:48
それに、関係ないブラウザまで落ちたwwww

255 ◆rCEzuNnL0g:2008/09/06(土) 23:47:32
アセンブリの出力のためにコンパイルだけしよう。
実行して落とすしかなくなったら困るし。

256 ◆rCEzuNnL0g:2008/09/06(土) 23:51:00
これはwwww
----
call ??$Vec@D$0GE@@@YAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPADIZZ ; Vec<char,100>

257 ◆rCEzuNnL0g:2008/09/07(日) 00:22:18
テンプレートウマー

258 ◆rCEzuNnL0g:2008/09/07(日) 01:12:29
ジャンケンゲーム - 素人がプログラミングを勉強するブログ
http://d.hatena.ne.jp/javascripter/20080906/1220714829
------
この判別の発想は無いわ。

259 ◆rCEzuNnL0g:2008/09/07(日) 01:20:54
sin,cos,tanとかCの標準関数って、ntdll.dllから提供されているんだなあと。

260 ◆rCEzuNnL0g:2008/09/07(日) 10:36:10
C++で、どのようにして多態性を実現しているのかが分からない。
という事で、アセンブリで眺めているのだが良く分からん。
うわあああ
どっかに解説しているサイトないかなあ。

261 ◆rCEzuNnL0g:2008/09/07(日) 10:41:23
つまり関数ポインタの配列へのポインタを持っているんだよな。
それは分かる。問題は何処に持っているかである。

ん?もしかして、関数ポインタへの配列へのポインタ配列へのポインタを持っているのか?

262 ◆rCEzuNnL0g:2008/09/07(日) 11:14:13
p = &c1;
0041160C lea eax,[ebp-18h]
0041160F mov dword ptr [ebp-34h],eax
p->Set(100);
00411612 mov esi,esp
00411614 push 64h
00411616 mov eax,dword ptr [ebp-34h]
00411619 mov edx,dword ptr [eax]
0041161B mov ecx,dword ptr [ebp-34h]
0041161E mov eax,dword ptr [edx+4]
00411621 call eax
00411623 cmp esi,esp
00411625 call @ILT+500(__RTC_CheckEsp) (4111F9h)

263 ◆rCEzuNnL0g:2008/09/07(日) 11:20:07
ポインタへの代入はただ単に代入しているだけだよなあ。
“ebp-34h”がオブジェクトへのポインタへ。
で、
00411621 call eax
とやっているから、この時点でeaxには関数へのポインタが入っていると。
ということは重要なのは
-----
00411616 mov eax,dword ptr [ebp-34h]
00411619 mov edx,dword ptr [eax]
0041161E mov eax,dword ptr [edx+4]
00411621 call eax
-----
だけか。

264 ◆rCEzuNnL0g:2008/09/07(日) 11:28:20
やっぱり単一継承の時は、クラスの一番アドレスの低いところに関数ポインタの配列へのポインタが入っているっぽい。

265 ◆rCEzuNnL0g:2008/09/07(日) 11:40:37
┌────────┐     ┌────────┐
│CSub1::`vftable'│────→│ 関数ポインタ │
├────────┤     ├────────┤
│  メンバ変数  │     │ 関数ポインタ │
└────────┘     ├────────┤
               │ 関数ポインタ │
               └────────┘

266 ◆rCEzuNnL0g:2008/09/07(日) 11:41:15
予想以上にずれたなあ。
メモ帳にコピーすれば綺麗に見えますよ。

267 ◆rCEzuNnL0g:2008/09/07(日) 11:42:21
結論。
単純継承の場合は何処から継承しているかは分からない。

268 ◆rCEzuNnL0g:2008/09/07(日) 11:52:53
多重継承の場合はそんなに単純ではない。
適当にペンと消しゴムのようなクラスを実装して、
ペンと消しゴムが一緒になったクラスを継承で定義してみる。
-----
CPenWithEraser c;
004115CD lea ecx,[ebp-18h]
004115D0 call CPenWithEraser::CPenWithEraser (411019h)
004115D5 mov dword ptr [ebp-4],0
IPen *pp = &c;
004115DC lea eax,[ebp-18h]
004115DF mov dword ptr [ebp-24h],eax
IEraser *pe = &c;
004115E2 lea eax,[ebp-18h]
004115E5 test eax,eax
004115E7 je main+67h (4115F7h)
004115E9 lea ecx,[ebp-18h]
004115EC add ecx,4
004115EF mov dword ptr [ebp-104h],ecx
004115F5 jmp main+71h (411601h)
004115F7 mov dword ptr [ebp-104h],0
00411601 mov edx,dword ptr [ebp-104h]
00411607 mov dword ptr [ebp-30h],edx
pp->Write("書き書き");
0041160A sub esp,20h
0041160D mov ecx,esp
0041160F mov dword ptr [ebp-0FCh],esp
00411615 mov esi,esp
00411617 push offset string "\x8f\x91\x82\xab\x8f\x91\x82\xab" (417800h)
0041161C call dword ptr [__imp_std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> > (41B344h)]
00411622 cmp esi,esp
00411624 call @ILT+495(__RTC_CheckEsp) (4111F4h)
00411629 mov dword ptr [ebp-104h],eax
0041162F mov eax,dword ptr [ebp-24h]
00411632 mov edx,dword ptr [eax]
00411634 mov ecx,dword ptr [ebp-24h]
00411637 mov eax,dword ptr [edx]
00411639 call eax
pe->Erase();
0041163B mov eax,dword ptr [ebp-30h]
0041163E mov edx,dword ptr [eax]
00411640 mov esi,esp
00411642 mov ecx,dword ptr [ebp-30h]
00411645 mov eax,dword ptr [edx]
00411647 call eax
00411649 cmp esi,esp
0041164B call @ILT+495(__RTC_CheckEsp) (4111F4h)
-----

269 ◆rCEzuNnL0g:2008/09/07(日) 11:54:19
IPen*へのダウンキャストは、ただ単にポインタを代入しているだけだが、
IEraser*へのダウンキャストは、ちょっと複雑なようだ。
そこらへんをピックアップ。

270 ◆rCEzuNnL0g:2008/09/07(日) 11:55:03
IEraser *pe = &c;
004115E2 lea eax,[ebp-18h]
004115E5 test eax,eax
004115E7 je main+67h (4115F7h)
004115E9 lea ecx,[ebp-18h]
004115EC add ecx,4
004115EF mov dword ptr [ebp-104h],ecx
004115F5 jmp main+71h (411601h)
004115F7 mov dword ptr [ebp-104h],0
00411601 mov edx,dword ptr [ebp-104h]
00411607 mov dword ptr [ebp-30h],edx

271 ◆rCEzuNnL0g:2008/09/07(日) 12:12:49
ebp-104hが良く分からないが、大体構造は以下のようである。
┌─────────────┐
│CPenWithEraser::`vftable' │←IPenの関数ポインタ配列へのポインタ
├─────────────┤
│CPenWithEraser::`vftable' │←IEraserの関数ポインタ配列へのポインタ
└─────────────┘

272 ◆rCEzuNnL0g:2008/09/07(日) 12:20:31
もしもIPenやIEraserがメンバ変数を持っている場合は以下のようになる。
┌─────────────┐
│CPenWithEraser::`vftable' │←IPenの関数ポインタ配列へのポインタ
├─────────────┤
│  IPenのメンバ変数   │
├─────────────┤
│CPenWithEraser::`vftable' │←IEraserの関数ポインタ配列へのポインタ
├─────────────┤
│  IEraserのメンバ変数   │
├─────────────┤
│CPenWithEraserのメンバ変数│
└─────────────┘

273 ◆rCEzuNnL0g:2008/09/07(日) 12:22:59
つまりCPenWithEraserからIEraserへキャストするときは、
IPen用のvftableとメンバ変数分の大きさをポインタに足せばいい。
これは三つから継承しても、四つから継承しても同じ。

274 ◆rCEzuNnL0g:2008/09/07(日) 12:28:34
つまり、多重継承しているときは、ポインタを代入した積もりでも、
ポインタの値は異なっているということである。
上の例では厳密には&c != peである。
ただ、実際に
if(&c == pe){std::cout << "等しい!" << std::endl;}
とやると、&cが(IEraserに)ダウンキャストされてから比較が行われるので、
等しい!と表示される。
という事で、多重継承は遅くなる原因なので必要最低限に留めた方が良いかと。

275 ◆rCEzuNnL0g:2008/09/07(日) 12:30:24
まあ、そんなこと言ったらC++は遅いので使わないほうが良いよ、と言っているようなものだがw

276 ◆rCEzuNnL0g:2008/09/07(日) 12:38:51
これは
IHuman *ph = &c;
でIHumanがISwimmerかIClimberのどちらかが分からないからコンパイルが出来ない。
---
#include <iostream>
#include <string>

class IHuman{
public:
virtual
void
Breath() = 0;
};

class ISwimmer : public IHuman{
public:
virtual
void
Swim() = 0;
};

class IClimber : public IHuman{
public:
virtual
void
Climb() = 0;
};

class CBaka : public ISwimmer, public IClimber{
public:
virtual
void
Breath(){
std::cout << "スースー" << std::endl;
}
virtual
void
Swim(){
std::cout << "ぶくぶくぶく" << std::endl;
}
virtual
void
Climb(){
std::cout << "どっこいしょ" << std::endl;
}
};

int main(int argc, char **argv){
CBaka c;
IHuman *ph = &c;
ph->Breath();
}

277 ◆rCEzuNnL0g:2008/09/07(日) 12:40:46
このように書けばコンパイルが出来る。
があんまり意味がない気がする。
---
#include <iostream>
#include <string>

class IHuman{
public:
virtual
void
Breath() = 0;
};

class ISwimmer : public IHuman{
public:
virtual
void
Swim() = 0;
};

class IClimber : public IHuman{
public:
virtual
void
Climb() = 0;
};

class CBaka : public ISwimmer, public IClimber{
public:
virtual
void
Breath(){
std::cout << "スースー" << std::endl;
}
virtual
void
Swim(){
std::cout << "ぶくぶくぶく" << std::endl;
}
virtual
void
Climb(){
std::cout << "どっこいしょ" << std::endl;
}
};

int main(int argc, char **argv){
CBaka c;
IHuman *ph1 = (ISwimmer *)&c;
IHuman *ph2 = (IClimber *)&c;
ph1->Breath();
ph2->Breath();
}

278 ◆rCEzuNnL0g:2008/09/07(日) 12:46:14
という事で、このようなときのために仮想継承というものがある。
これで良い感じ。
-----
#include <iostream>
#include <string>

class IHuman{
public:
virtual
void
Breath() = 0;
};

class ISwimmer : public virtual IHuman{
public:
virtual
void
Swim() = 0;
};

class IClimber : public virtual IHuman{
public:
virtual
void
Climb() = 0;
};

class CBaka : public ISwimmer, public IClimber{
public:
virtual
void
Breath(){
std::cout << "スースー" << std::endl;
}
virtual
void
Swim(){
std::cout << "ぶくぶくぶく" << std::endl;
}
virtual
void
Climb(){
std::cout << "どっこいしょ" << std::endl;
}
};

int main(int argc, char **argv){
CBaka c;
IHuman *ph = &c;
}

279 ◆rCEzuNnL0g:2008/09/07(日) 12:47:42
因みに、クラス名がCBakaとなっているのは、良い名前が思いつかなかったから。
ただそれだけ。

280 ◆rCEzuNnL0g:2008/09/07(日) 12:50:14
仮想継承するとなんだか更にアセンブリコードが複雑になるなあ。
-----
CBaka c;
0041156E push 1
00411570 lea ecx,[c]
00411573 call CBaka::CBaka (4111EAh)
IHuman *ph = &c;
00411578 lea eax,[c]
0041157B test eax,eax
0041157D jne main+3Bh (41158Bh)
0041157F mov dword ptr [ebp-0ECh],0
00411589 jmp main+4Bh (41159Bh)
0041158B mov ecx,dword ptr [ebp-14h]
0041158E mov edx,dword ptr [ecx+4]
00411591 lea eax,[ebp+edx-14h]
00411595 mov dword ptr [ebp-0ECh],eax
0041159B mov ecx,dword ptr [ebp-0ECh]
004115A1 mov dword ptr [ph],ecx

281 ◆rCEzuNnL0g:2008/09/07(日) 12:52:01
因みにリリース版でビルドするとこんな感じ
-----
int main(int argc, char **argv){
00401090 sub esp,14h
CBaka c;
IHuman *ph = &c;
ph->Breath();
00401093 lea ecx,[esp+10h]
00401097 mov dword ptr [esp+4],offset CBaka::`vbtable' (402180h)
0040109F mov dword ptr [esp+0Ch],offset CBaka::`vbtable' (402188h)
004010A7 mov dword ptr [esp],offset CBaka::`vftable' (40216Ch)
004010AE mov dword ptr [esp+8],offset CBaka::`vftable' (402174h)
004010B6 mov dword ptr [esp+10h],offset CBaka::`vftable' (40217Ch)
004010BE call dword ptr [CBaka::`vftable' (40217Ch)]
}
004010C4 xor eax,eax
004010C6 add esp,14h
004010C9 ret

282 ◆rCEzuNnL0g:2008/09/07(日) 12:55:01
ん!
vbtableってなんだ?vftableなら分かるが・・・

283 ◆rCEzuNnL0g:2008/09/07(日) 13:35:43
仮想継承のコードは複雑すぎて分からない。
が結局のところ、普通の継承と同じような感じだと思っている。
眠たくなってきた。

284 ◆rCEzuNnL0g:2008/09/07(日) 13:58:06
仮想継承で意味があるのはこんなのではない。
本当に意味があるのは、この例ではIHumanにメンバ変数がある時である。
そのときにCBaka*をISwimmer*やIClimber*にダウンキャストして、
ISwimmer::メンバ変数やIClimber::メンバ変数を変更すると、両方に適用されると。
ということは、両方とも同じメンバ変数を参照するためには、色々となんか良く分からないことをやる必要がある。
まあ、実際にやってみたのだが、その補正用の値がvbtableに格納されていると思われる。
恐らくこんな感じのメモリの使われ方ではなかろうか。
+00:CBaka::`vftable' <- ISwimmer
+04:CBaka::`vbtable' <- ISwimmerのIHumanメンバ変数参照用
+08:CBaka::`vftable' <- IClimber
+0C:CBaka::`vbtable' <- IClimberのIHumanメンバ変数参照用
+10:CBaka::`vftable' <- IHuman

285 ◆rCEzuNnL0g:2008/09/07(日) 13:59:11
ISwimmerやIClimberにメンバ変数が入った場合は、
普通にvbtableの後にそれぞれ場所をとれば大丈夫である。
本当に最初に此れを考えた奴は天才だなあ。

286 ◆rCEzuNnL0g:2008/09/07(日) 14:01:46
CBakaのメンバ変数はIHumanのメンバ変数の後に追加すればよい。
IHumanのメンバ変数はvftableの後に追加すればよい。
こうすればIHumanを仮想継承していないクラスがあったとしても、
IHumanのメンバ関数は通常通りに読み出せる。

vbtableはISwimmer*からIHumanやIClimberからIHumanへのキャストへも使われる予感。

287 ◆rCEzuNnL0g:2008/09/07(日) 14:06:16
仮想継承をしたら、仮想継承したクラスはvbtableを持たねばなるまい。
例えそのクラスを他のクラスに継承しなくても、仮想継承汁!とソースに書かれている以上、用意はせねばいかん。
という事で、必要な時意外は、遅くなる仮想継承は止めましょうということです。

288 ◆rCEzuNnL0g:2008/09/07(日) 14:16:54
そういえば、コンストラクタが返す値は
自分自身の参照。
何故ならば
std::string("Yahoo!!").c_str();
という書き方が出来るから。
ポインタだと->演算しだし、参照じゃないと無駄が多い。
という事で参照。

289 ◆rCEzuNnL0g:2008/09/07(日) 14:29:22
某所でキャストの仕方について次のような奴があった。
type(...)
つまり
char c = '3';
std::cout << int(c) << std::endl;
の後の奴を型キャストとか言っている訳だ。
うん実際に試せば分かるが此れは“51”と出力される。普通に出力すると“3”である。
ただ、此れは厳密にはキャストではなくて、int型のコンストラクタが呼ばれているだけである。
つまり、int型やchar型云々にもデフォルトでコンストラクタがあるということである。
実際に以下のコードを試すと“0”と出力される。
---
std::cout << int() << std::endl;
---
勿論char()にすれば何も表示されない(何故ならば、NULL文字だから)。
試していないが、その他unsigned int()とかwchar_t()とかでも同様であろう。
つまりこれらは0で初期化される。

290 ◆rCEzuNnL0g:2008/09/07(日) 14:30:37
int *p1 = new int, *p2 = new int();
とすると
*p1は不定*p2は0である。
括弧を付けるか付けないかで此れだけ違います。

291 ◆rCEzuNnL0g:2008/09/07(日) 14:34:53
こんな風にするとウマー?
----
#include <iostream>
#include <string>

struct POINT{
int x, y;
POINT()
: x(), y()
{}
friend
std::ostream &operator<<(std::ostream &, POINT &);
};

std::ostream &operator<<(std::ostream &os, POINT &p){
return os << p.x << "," << p.y;
}

int main(int argc, char **argv){
std::cout << POINT() << std::endl;
}

292 ◆rCEzuNnL0g:2008/09/07(日) 14:37:04
中身が分からない関数の呼び出しは最適化のしようがない。
何故ならば内部で副作用があるかもしれないからである。
staticな変数があってそれが変更されて、後からの動作に影響が出るかもしれないからである。
という事で、関数の呼び出しの最適化はあまり期待しないほうがいいかもしれない。
まあ、全部そのプロジェクトから分かる範囲の関数ならばインライン化してくれるかもしれない。
JITコンパイラ的な奴を自分で組み込むのもありかもしれない。

293 ◆rCEzuNnL0g:2008/09/07(日) 14:40:19
JITコンパイラ的な奴を組み込むとなると、多分初期化に時間がかかる。
やるならば逆アセンブリして解析して、メモリ確保してコピーして埋め込んで、コピーして、
絶対アドレスがあったら修正して云々しなければならないと思う。
まあ、それをやったのが、Firefox3.1に搭載予定の、なんかよく分からん名前のやつであろう。

294 ◆rCEzuNnL0g:2008/09/07(日) 14:42:43
結構、その初期化にかかる時間は長いので、
有名ライブラリの奴をコンパイルしておけばいいと思う。
で、CRCで同じハッシュの奴はコンパイルした奴を使うと。
まあ、こういうのにGoogleが出てくるといいね。
全てのライブラリ使用者がGoogleとかからダイレクトにjQueryとかを利用すれば、
URLを見ただけで態々ダウンロードしてCRCを確かめなくてもキャッシュを利用することが出来る。
まあ、少しぐらいしか早くならない気もするけれども。

295 ◆rCEzuNnL0g:2008/09/07(日) 17:15:42
うーん
三度目ぐらいにC++0xのWikipediaの解説を読んだのだが、複雑すぎで今の僕には理解できません><

296 ◆rCEzuNnL0g:2008/09/07(日) 17:42:11
取り敢えずラムダ関数が使えるようになれば良いねえと。
[](int x, int y){return x + y}
とかうまー

297 ◆rCEzuNnL0g:2008/09/08(月) 18:59:31
プラグイン3種アップデート+SuperView を活用できる便利なスクリプトの紹介 (フェンリル | デベロッパーズブログ)
http://www.fenrir.co.jp/blog/2008/09/superview.html
---
>この FaviconCleaner プラグインは NTFS のアクセス日時を取得する API を使用している関係で Unicode 版のみの配布であり、NTFS 上にキャッシュが保存されている環境に対応します。NTFS ではない場合には何も起こりません。
------
うーん。自分はFAT32上にSleipnirを構築しているので困るなあ。
アクセス日時だったら、FATでもあるんだぜ?
Wikipediaによると
>作成(精度は10ミリ秒), 修正(精度は2秒), アクセス(精度は1日)
>(長いファイル名がサポートされている時のみ、作成時間とアクセス日付が更新できる)
と書かれている。
別に一日という精度だったら問題ないと思うんだけれどもねえ。
ちょっと頑張ってほしい。

298 ◆rCEzuNnL0g:2008/09/08(月) 19:02:37
因みにNTFSだと100ナノ秒単位で記録できるらしい。

299 ◆rCEzuNnL0g:2008/09/08(月) 19:23:59
“Hatena Bookmarker 1.1.3”の修正点について。
>タブ上でホイール回転をおこなうと常時通信が走っていた問題を修正した。(t.o)
確かに直ってますね。多分実装としては、
「選択が変わった or ページが移動した時」にスレッド生成!だけれども動かさない。
また「選択が変わった or ページが移動した時」に前のスレッドがあったらそれを殺す。
で、またスレッド生成をする。
暫く待ったら通信して結果を表示!

という感じだと思う。だから普通に変えただけでは通信までに時間がかかる。
だからキャッシュを利用すれば良いものを・・・。駄目な理由があるんですかね。
Delphiは良く分からんけれども、C++ならばstd::vector<int>とかで簡単に出来そうなんだけれども。

300 ◆rCEzuNnL0g:2008/09/08(月) 19:29:33
Black Hat Japan 2008:ブラックハットジャパン2008
http://www.blackhat.com/html/bh-japan-08/bh-jp-08-main.html
----
こんなのがあるんだ。
到底俺のいけるレベルではない。

301 ◆rCEzuNnL0g:2008/09/08(月) 20:23:52
>>299
どうやら違うっぽい。
という事で、嘘です。
まあ、通信までに時間がかかるのは本当だけれども。

302 ◆rCEzuNnL0g:2008/09/08(月) 20:37:53
プロクソミトロンでリファラーをそのページ自身に変更するのは止めたほうが良い。
リファラーの関係で色々と不味い。

303 ◆rCEzuNnL0g:2008/09/08(月) 20:41:10
スクリプトで外部サイトに不正に書き込まれる可能性が非常に高い。
つまり、ほにゃほにゃを殺すとか言う書き込みを自分の意図によらず書き込むかもしれないということ。

304 ◆rCEzuNnL0g:2008/09/08(月) 21:33:47
由々識の気まぐれ日記 SuperDrag Extension 1.0.3 Beta2a 公開
http://yuyushiki.8.dtiblog.com/blog-entry-149.html
---
>これはもう、「@Referer:」,「@Cookie:」,「@UserAgent:」を新たに追加した上で、
>Sleipnir 本体に実装しても良いのではないでしょうか。
-----
危険すぎるwwwww
「@post:」自体だけでも十分危険なのに「@Referer:」とか、「@Cookie:」までつけたら、Sleipnir死亡www
これをつけたら、リンクをクリックをしただけで2chに犯罪予告を行ってしまうリンクが書けるwww
というか、リンクをドラッグアンドドロップで持っていくと@post:で実行できるのも速攻止めるべきである。
実際に掲示板に書き込めるかは今から試してみる。

305 ◆rCEzuNnL0g:2008/09/08(月) 21:37:02
http://jbbs.livedoor.jp/computer/38153/bbs/write.cgi/computer/38153/1218378495/@post:DIR=computer&amp;BBS=38153&amp;KEY=1218378495&amp;TIME=1220877228&amp;NAME=&amp;MAIL=sage&amp;MESSAGE=test

306 ◆rCEzuNnL0g:2008/09/08(月) 21:38:20
http://jbbs.livedoor.jp/bbs/write.cgi/computer/38153/1189595822/@post:DIR=computer&amp;BBS=38153&amp;KEY=1218378495&amp;TIME=1220877228&amp;NAME=&amp;MAIL=sage&amp;MESSAGE=test

307あぼーん:あぼーん
あぼーん

308 ◆rCEzuNnL0g:2008/09/08(月) 21:42:39
という事で、出来た。
>>306をドラッグアンドドロップすればこのスレッドにtestという書き込みがなされる。
----
※書き込むと自分の記録に貴方のIPアドレスが記録されます。
 犯罪予告では有りませんが、そこらへん嫌だなあと思う方は自分の掲示板で試されることをお勧めします。
----
これがクリック一発で発動したらどうでしょうか。本文の内容を犯罪予告に変えれば一発です。
ただ、2chはクッキーとリファラーによってチェックしているので問題ないですが、もし上記のものが実装されたら、それこそひとたまりもありません。
という事で、リンクのD&Dで発動するのはセキュリティー的に不味いので止めていただきたいです。
ただ、スクリプトからの実行は良いと思うし、リンクを選択してD&Dをしたときの実行はありのほうがいいかもしれません。
ただ、此れもデフォルトoffでuser.iniで書き換えのみが一番良いと思います。

309あぼーん:あぼーん
あぼーん

310 ◆rCEzuNnL0g:2008/09/08(月) 21:49:27
http://jbbs.livedoor.jp/bbs/write.cgi/computer/38153/1189595822/#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@post:DIR=computer&BBS=38153&KEY=1218378495&TIME=1220877228&NAME=&MAIL=sage&MESSAGE=test

#を利用してリンクを長くすることが有効化のテスト。

311あぼーん:あぼーん
あぼーん

312あぼーん:あぼーん
あぼーん

313 ◆rCEzuNnL0g:2008/09/08(月) 21:59:40
有効みたいだなあ。

314 ◆rCEzuNnL0g:2008/09/08(月) 22:05:31
自分の書き込みが邪魔だから消しておこうwww

315 ◆rCEzuNnL0g:2008/09/08(月) 22:10:10
という事で、普通の人ならば分かるだろうけれども、
一応postメソッドの危険性についてブログで述べておくこととする。
-----
SuperDrag Extension 1.0.3の「@post:」について - みみず日記
http://d.hatena.ne.jp/sub_chon/20080908/1220878846
-----

316 ◆rCEzuNnL0g:2008/09/08(月) 23:05:10
まあ、こういういたずらが出来ちゃうから、掲示板はPOSTで書き込みを行うんですね。
で、XMLHttpRequestも他のドメインにアクセスできないし、リファラーも変えられないんです。
という事で、このセキュリティーの方針の逆をいくSleipnirには関心が出来ないわけである。
別にセキュリティー専門家って言うわけでもないんだけれども。

317 ◆rCEzuNnL0g:2008/09/08(月) 23:08:11
例のリンクをドラッグアンドドロップされると、俺の掲示板に書き込みが増えてうまー。
って言うわけでもない。
まあ、正直testっていう書き込みは邪魔だよね。
だけれども、セキュリティーというものは体感して初めて分かるものであると勝手に思っている。
というか、実証できないと全く意味が無いので。

318 ◆rCEzuNnL0g:2008/09/08(月) 23:10:09
つまり、机上の空論では全くの意味が無い。
こんなプログラミングが書ける、と頭の中で思っていても意味が無い。
実際に書いて書けるかが重要である。

319 ◆rCEzuNnL0g:2008/09/09(火) 19:26:01
あれれ・・・
まだ書き込めるなあ。
やっぱりリンクを開くときには「@post:」を無視するべきだと思うんだけれどもなあ。
まあ、「次のような内容を送信しようとしています」とか出たほうが良いと思うんだけれどもなあ。
選択した文字列を開くときと、スクリプトから開くは表示する必要性は無いと思うけれども。

320 ◆rCEzuNnL0g:2008/09/09(火) 21:12:32
やっぱりまだ書き込める。
ま、ドラッグしたアンカーのURLを確認しないユーザーの自己責任といえば、自己責任だよなあ。
ただ、ブラウザでページを開こうとする動作、ということになっているので、さすがに無視できないと思う。

321 ◆rCEzuNnL0g:2008/09/10(水) 18:20:19
うーん。
ページ移動中に検索バーに検索文字列を入力することがあるのだが、
そのときに、HTMLのページにフォーカスを移動させる命令があると、勝手にそっちに移動してしまう。
URLバーとか検索バーにフォーカスがあるときは移動させて欲しくないなあ。
特に入力中は絶対に止めてほしい。

322 ◆rCEzuNnL0g:2008/09/10(水) 18:21:13
やっぱり、人が着てないと思うと、書き込みやすいね。
アクセス解析を入れたけれども、全然きていないのが、良くわかる。
これからも色々と解析していきたいと思う。

323 ◆rCEzuNnL0g:2008/09/10(水) 18:41:47
逆アセンブリって、仕様によって全然書きたかが違う。
mov A, B
とか書いても
A->BかB->Aかは違ったりする。

324 ◆rCEzuNnL0g:2008/09/10(水) 20:01:16
やっぱり、仮想継承で生成されるアセンブリが解読できないのは悔しいので、
今解読中・・・

325 ◆rCEzuNnL0g:2008/09/10(水) 20:07:05
仮想継承をすると、一つ引数をプッシュするようである。何故か
CSub<-ISub1<-ISuper
└<---ISub2<---┘
上のように継承しているとか仮定する。

326 ◆rCEzuNnL0g:2008/09/10(水) 20:09:43
ISub1を実体化するときに、
ISuperのコンストラクタはISub1が呼ばねばならない。
ISub2を実体化するときに、
ISuperのコンストラクタはISub2が呼ばねばならない。
CSubを実体化するときに、
ISub1とISub2のコンストラクタはCSubを呼ばねばならない。
が、そのISub1,2のコンストラクタでISuperのコンストラクタは呼んではならない。
よってそのためのフラグである。

327 ◆rCEzuNnL0g:2008/09/10(水) 20:11:09
つまり、仮想継承元を実体化しなくてはならないときには、
最後の引数にtrue(1)を、
実体化しなくてもよいときは、
最後の引数にfalse(0)を、
置くということである。

328 ◆rCEzuNnL0g:2008/09/10(水) 20:20:20
大体予想通りのメモリ配置だなあ。

+00:offset CSub::`vftable'
+04:offset CSub::`vbtable' -> offset ISub1::`vbtable'
+08:m_v1
+0C:offset ISub2::`vftable' -> offset CSub::`vftable'
+10:offset CSub::`vbtable'
+14:offset ISub2::`vftable'
+18:offset IClass::`vftable'
+1C:m_v2
+20:offset CSub::`vftable'
+24:offset ISub1::`vftable'
+28:m_1
+2C:m_2
+30:m_3

329 ◆rCEzuNnL0g:2008/09/10(水) 20:23:53
という事で、これでunequalとなります。
----------
if((void*)pcs == (void*)(ISuper*)pcs){
std::cout << "equal" << std::endl;
}else{
std::cout << "unequal" << std::endl;
}

330 ◆rCEzuNnL0g:2008/09/10(水) 20:36:39
+00:offset ISub1::`vftable' -> offset CSub::`vftable'
+04:offset CSub::`vbtable'
+08:m_v1
+0C:offset ISub2::`vftable' -> offset CSub::`vftable'
+10:offset CSub::`vbtable'
+14:m_v2
+18:offset IClass::`vftable' -> offset ISub2::`vftable'
+1C:
+20:
+24:offset ISub1::`vftable' -> offset CSub::`vftable'
+28:m_1
+2C:m_2
+30:m_3

331 ◆rCEzuNnL0g:2008/09/10(水) 20:49:39
>>328,330
は両方とも間違えだと思う。
なんだか面倒になってきた。
やっぱり仮想継承は考えないこととするか。

332 ◆rCEzuNnL0g:2008/09/10(水) 20:53:29
まあ、補正用にvbtableが入るのは間違いない。
検証用に用意した、適当なソースコードでも貼っておく。
-----

#include <iostream>
#include <string>

class IClass{
public:
virtual
~IClass(){}

virtual
int Get() = 0;

int m_1;
int m_2;
int m_3;
};

class ISub1 : virtual public IClass{
public:
virtual
~ISub1(){}

int m_v1;

virtual
int Get1() = 0;
};

class ISub2 : virtual public IClass{
public:
virtual
~ISub2(){}

int m_v2;

virtual
int Get2() = 0;
};

class CSub : public ISub1, public ISub2{
public:
virtual
int Get1(){
return m_v1;
}
virtual
int Get2(){
return m_v2;
}
virtual
int Get(){
return m_1;
}
};

int main(int argc, char **argv){
CSub cs;
CSub *pcs = &cs;

pcs->m_1 = 0;
pcs->m_2 = 0;
pcs->m_3 = 0;
pcs->m_v1 = 0;
pcs->m_v2 = 0;

if((void*)pcs == (void*)(IClass*)pcs){
std::cout << "equal" << std::endl;
}else{
std::cout << "unequal" << std::endl;
}

/*
ISub1 *pi1 = &cs;
ISub2 *pi2 = &cs;
IClass *pic = &cs;

pcs->m_1 = pi1->m_1 = pi2->m_1 = pic->m_1 = -1;
*/
};

333 ◆rCEzuNnL0g:2008/09/10(水) 20:55:00
デザインパターン編 第22章 Visitorパターン
http://www.geocities.jp/ky_webid/design_pattern/022.html
-----
Visitorパターンは物凄く使えると思う。

334 ◆rCEzuNnL0g:2008/09/10(水) 20:58:35
つまりLispを実装しようと思ったら、
全てのCellとかAtomとかをILispObjとかにして、
そっから全てのObjectを継承して、
ILispObj::Eval(IVisiter);
とかやって、
IVisiter::Printとかやったればいいんじゃね?とか妄想している。
正直上手くいきそうに無いwwwww

335 ◆rCEzuNnL0g:2008/09/10(水) 21:32:19
寝るか「、¥

336 ◆rCEzuNnL0g:2008/09/10(水) 22:48:01
仮称継承して出力してみた。
-----
序数: 0001 名前: ??0CSub1@@QAE@ABV0@@Z
序数: 0002 名前: ??0CSub1@@QAE@XZ
序数: 0003 名前: ??0CSub2@@QAE@ABV0@@Z
序数: 0004 名前: ??0CSub2@@QAE@XZ
序数: 0005 名前: ??0CSub@@QAE@ABV0@@Z
序数: 0006 名前: ??0CSub@@QAE@XZ
序数: 0007 名前: ??0CSuper@@QAE@ABV0@@Z
序数: 0008 名前: ??0CSuper@@QAE@XZ
序数: 0009 名前: ??1CSub1@@UAE@XZ
序数: 000A 名前: ??1CSub2@@UAE@XZ
序数: 000B 名前: ??1CSub@@UAE@XZ
序数: 000C 名前: ??1CSuper@@UAE@XZ
序数: 000D 名前: ??4CSub1@@QAEAAV0@ABV0@@Z
序数: 000E 名前: ??4CSub2@@QAEAAV0@ABV0@@Z
序数: 000F 名前: ??4CSub@@QAEAAV0@ABV0@@Z
序数: 0010 名前: ??4CSuper@@QAEAAV0@ABV0@@Z
序数: 0011 名前: ??_7CSub1@@6B@
序数: 0012 名前: ??_7CSub2@@6B@
序数: 0013 名前: ??_7CSub@@6B@
序数: 0014 名前: ??_7CSuper@@6B@
序数: 0015 名前: ??_8CSub1@@7B@
序数: 0016 名前: ??_8CSub2@@7B@
序数: 0017 名前: ??_8CSub@@7BCSub1@@@
序数: 0018 名前: ??_8CSub@@7BCSub2@@@
序数: 0019 名前: ??_DCSub1@@QAEXXZ
序数: 001A 名前: ??_DCSub2@@QAEXXZ
序数: 001B 名前: ??_DCSub@@QAEXXZ
序数: 001C 名前: ?Print@CSub1@@UAEXXZ
序数: 001D 名前: ?Print@CSub2@@UAEXXZ
序数: 001E 名前: ?Print@CSub@@UAEXXZ
序数: 001F 名前: ?Print@CSuper@@UAEXXZ

337 ◆rCEzuNnL0g:2008/09/10(水) 23:06:42
メンバ変数にメンバ関数へのポインタを置いておいて、状態によってその呼び出す関数を変えたい。
で、こんな書き方しか出来ないのだろうか?
---
#include <iostream>
#include <string>

class CClass{
public:
void (CClass::*pFunc)();
std::string str;

CClass()
: pFunc(NULL)
, str("")
{}

void Print1(){
std::cout << str << std::endl;
}
void Print2(){
std::cout << "|" << str << "|" << std::endl;
}

void Set(std::string _str){
str = _str;
}
};

int main(int, char**){
CClass e;
e.pFunc = &CClass::Print1;
(e.*(e.pFunc))();
}

338 ◆rCEzuNnL0g:2008/09/10(水) 23:07:59
(e.*(e.pFunc))();
とか正直何がしたいのか分からない。というかeを二回書いている時点でスマートじゃない。

339 ◆rCEzuNnL0g:2008/09/10(水) 23:10:09
メンバ関数内ならば、
(this->*pFunc)();
と書けるか・・・

340 ◆rCEzuNnL0g:2008/09/10(水) 23:11:42
まあ、此れで現状のC++については勉強しつくした感がある。

341 ◆rCEzuNnL0g:2008/09/10(水) 23:16:37
いや、まだ、メンバ関数ポインタについては勉強できていないな。

342 ◆rCEzuNnL0g:2008/09/10(水) 23:28:49
どうやらメンバ関数ポインタ用に新たな関数を生成するらしい。
-----
IClass::`vcall'{0}':
00412330 mov eax,dword ptr [ecx]
00412332 jmp dword ptr [eax]
-----

343 ◆rCEzuNnL0g:2008/09/10(水) 23:32:27
つまり、メンバ関数ポインタを使うと動作が遅くなるということ。

344 ◆rCEzuNnL0g:2008/09/10(水) 23:42:01
virtualな関数を持つクラスを多重継承したときに、ずれたポインタでthisを渡さなければいけないときは、
ちゃんとずらして渡しているんだなあと。

345 ◆rCEzuNnL0g:2008/09/10(水) 23:42:32
本当にコンパイラは、勝手に色々なことをしてくれますねえ。

346 ◆rCEzuNnL0g:2008/09/11(木) 00:45:59
東方とかデバッグどうしているんだろうね。
クリアーできないステージとか作っちゃわないのかなあ。

347 ◆rCEzuNnL0g:2008/09/11(木) 01:29:32
東方の弾って、基本撃ったらまっすぐ飛んでいるよね?
敵の弾の話だけれども。

348 ◆rCEzuNnL0g:2008/09/11(木) 02:52:14
Firebug Lite
http://getfirebug.com/lite.html
----
こんなのがあったんだ。

349 ◆rCEzuNnL0g:2008/09/11(木) 20:18:44
Sleipnirは
MFC + COM

350 ◆rCEzuNnL0g:2008/09/12(金) 19:09:17
PEInfo: PE Structure information

( base data )
entrypointaddress.: 0x1000a127
timedatestamp.....: 0x48b4c771 (Wed Aug 27 03:18:09 2008)
machinetype.......: 0x14c (I386)

( 5 sections )
name viradd virsiz rawdsiz ntrpy md5
.text 0x1000 0x9bc5 0xa000 6.08 33b42c7206c4f31e757a883ec2547f8c
.rdata 0xb000 0x30c6 0x4000 4.16 43c0b6753432e49b0bf939cf053250ad
.data 0xf000 0x778 0x1000 1.28 495ef169b5b15996b1839f1a943b45b0
.rsrc 0x10000 0x1ac 0x1000 3.46 7fda13786a06da6ad8e043a471a7124c
.reloc 0x11000 0xcba 0x1000 5.90 ea947a48fd3e02547711ad6622936bd6

351 ◆rCEzuNnL0g:2008/09/12(金) 19:21:41
処理時間の取得方法
http://www14.big.or.jp/~ken1/tech/tech19.html

352 ◆rCEzuNnL0g:2008/09/12(金) 19:28:28
(新)APIから知るWindowsの仕組み---目次:ITpro
http://www.itproexpo.jp/article/COLUMN/20070129/259838/

353 ◆rCEzuNnL0g:2008/09/12(金) 19:51:40
EncodePointer Function (Windows)
DecodePointer Function (Windows)

354 ◆rCEzuNnL0g:2008/09/12(金) 20:00:50
?QueryInterface@FActionData@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FByteArrayInputStream@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FByteArrayOutputStream@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FCmdUI@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FFileInputStream@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FFileOutputStream@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FGZip@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FHistoryData@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FOptionDialogData@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FSearchEngine@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FSearchItemCombo@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FSearchItemList@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FStatusBarItemData@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FToolBarButtonData@@UAGJABU_GUID@@PAPAX@Z
?QueryInterface@FToolBarButtonDataEx@@UAGJABU_GUID@@PAPAX@Z

355 ◆rCEzuNnL0g:2008/09/12(金) 20:03:29
沈黙を破ったホリエモン,ITを語る:ITpro
http://itpro.nikkeibp.co.jp/article/Interview/20080910/314505/

356 ◆rCEzuNnL0g:2008/09/12(金) 20:47:27
暇だったからCOMっぽいものを実装した。
まあ、あんまり意味が無いから削除。

357 ◆rCEzuNnL0g:2008/09/12(金) 20:47:47
あんまり完成しても感動しなかった。

358 ◆rCEzuNnL0g:2008/09/12(金) 21:15:11
DLLは・・・
エクスポートしたい全ての関数を持つ純仮想関数を持つクラスを宣言する。
でそれを継承した奴で中身のクラスを実装する。
中身のクラスをnewして純仮想関数を持つクラスにキャストして渡す関数をエクスポートする。
それをDeleteする関数をエクスポートする。

EXEは・・・
中身(中略)関数を呼び出す。
それで普通に->で関数を呼び出す。
要らなくなったら、それを(中略)関数で消す。

此れだと、出力したいClassのサイズが分からなくても大丈夫なので、絶対安心。
だからCOMとかは、バージョンが上がって新しいclassが一杯出るわけである、と某所で書いてあった。
まあ、詳しくは自分で調べてくだせう。

359 ◆rCEzuNnL0g:2008/09/12(金) 21:41:30
COM総合研究所 - COM研究室
http://www5.plala.or.jp/atata/com/
---
という事で実際のCOMの実装でも見てみるか。

360 ◆rCEzuNnL0g:2008/09/12(金) 21:56:08
え・・・
クラスのメンバー関数が__stdcallってどういうこと・・・?

361 ◆rCEzuNnL0g:2008/09/12(金) 22:04:42
結局今の僕には理解できませんでした。

362 ◆rCEzuNnL0g:2008/09/12(金) 22:06:27
取り敢えず、基礎は触ったのでアセンブリを読んでみる。

363 ◆rCEzuNnL0g:2008/09/12(金) 22:09:26
QueryInterfaceはメンバ関数なんだろ?
じゃあ、どこでそのメンバを実体化する?
CoInitializeのタイミング? <-これは無いね><
まあ、それは実装によるのだろう。

364 ◆rCEzuNnL0g:2008/09/12(金) 22:15:05
COMが利用されているとすると色々と厄介だなあ。
関数ポインタが多いのも頷ける。

365 ◆rCEzuNnL0g:2008/09/12(金) 22:19:03
COMキモイ><

366 ◆rCEzuNnL0g:2008/09/12(金) 22:21:45
あ、別にメンバ関数のQueryInterfaceから取得する必要は無いか。
適当なグローバルな関数(若しくはclassのstaticな関数)でQueryInterface的なことをやれば良いか。
どちらにせよ色々面倒だ。

367 ◆rCEzuNnL0g:2008/09/12(金) 22:32:46
コンパイラ実装とか出来ません><
VM実装とか出来ません><
という事で、もうプログラミングなんて出来ません><
まあ、趣味で(ry

368 ◆rCEzuNnL0g:2008/09/12(金) 22:35:49
という事で、Lispでも作ってみる?
某所でスキームの実装の話を見たので読み返してみるか。

369 ◆rCEzuNnL0g:2008/09/12(金) 23:05:41
なるほど。
数値じゃなくて、エスケープ関連の文字じゃなかったらatomに決まってますね。
すげー。頭良い。

To たつひろ

370 ◆rCEzuNnL0g:2008/09/12(金) 23:07:14
atom以前のatomがあったらそれを流す、無いならば作る。
まあ、当たり前か。


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板