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

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

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

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があったらそれを流す、無いならば作る。
まあ、当たり前か。

371 ◆rCEzuNnL0g:2008/09/12(金) 23:08:28
うーん。
やっぱりC++的に言えばダウンキャストしているなあ。
やっぱりそうするしかないよなあ。

372 ◆rCEzuNnL0g:2008/09/12(金) 23:09:39
>>1-370まではアップキャストとダウンキャストを間違えて覚えていた。
まあ、今脳内修正したから良いや。

373 ◆rCEzuNnL0g:2008/09/12(金) 23:14:34
アップキャストは安全、
ダウンキャストは危険、ということ。意味分からんねwwww

374 ◆rCEzuNnL0g:2008/09/12(金) 23:14:53
暇だし、atoi関数でも実装してみる。

375 ◆rCEzuNnL0g:2008/09/12(金) 23:16:03
int atoi(char *str){
int b = 0;
while(*str){
b = b * 10 + (*str - '0');
}
return b;
}

376 ◆rCEzuNnL0g:2008/09/12(金) 23:16:18
一分十秒か・・・

377 ◆rCEzuNnL0g:2008/09/12(金) 23:18:11
まあ、此れだと符号が考慮に入っていないので、本気でやるならば

int atoi(char *str){
int f = 0, b = 0;
if(*str = '-') f = 1
while(*str){
b = b * 10 + (*str - '0')
}
return f ? -b : b;
}

378 ◆rCEzuNnL0g:2008/09/12(金) 23:19:46
コロンが二箇所ほど抜けてますね。
はい。
しかし本当はatoiは空白を読み飛ばさないといけないので、

int atoi(char *str){
int f = 0, b = 0;
whlie(*str++ == ' ');
if(*str = '-') f = 1;
while(*str){
b = b * 10 + (*str - '0');
}
return f ? -b : b;
}

379 ◆rCEzuNnL0g:2008/09/12(金) 23:27:07
しかし10進数しか変換できないのも変な話だ。どうせならば二進数とか十六進数とか八進数とか三進数とか五進数とか、良く分からない変数も変換したい。
まあ、C標準関数に含まれているがそれも自分で実装しよう。
関数名が分からないので、適当にkでいいや。

int k(char *str, int b){
int f = 0, r = 0
while(*str++ == '');
if(*str == '-') f = 1;
whlie(*str){
if('0' <= *str && *str <= '9')
r = r * b + (*str - '0');
else if('A' <= *str && *str <= 'Z')
r = r * b + (*str - 'A' + 10);
else if('a' <= *str && *str <= 'z')
r = r * b + (*str - 'a' + 10);
else
return NULL;
}
return f ? -b : b;
}

380 ◆rCEzuNnL0g:2008/09/12(金) 23:27:30
return f ? -r : r;
じゃんねえ

381 ◆rCEzuNnL0g:2008/09/12(金) 23:28:40
ということは、
int atoi(char *str){
return k(str, 10);
}
でおk。

382 ◆rCEzuNnL0g:2008/09/12(金) 23:51:58
FPI_CreateInstanceとか見るとCOMの初期化のようだ(笑)
本当に、早くPDK公開しないかなあ。

383 ◆rCEzuNnL0g:2008/09/13(土) 00:11:06
WinMainからmainでいうargc,argvを利用したいときの話。
__argc,__argvを利用すれば良い。
その実体は(*__p___argc())であり
extern int *__p___argc(void);である。
また__wargvも存在する。

384 ◆rCEzuNnL0g:2008/09/13(土) 00:14:39
やっぱりネイティブAPIあたりを弄くらないと面白くないのかなあ。

385 ◆rCEzuNnL0g:2008/09/13(土) 11:43:36
#define _CRTIMP __declspec(dllimport)


#if defined(_DLL) && defined(_M_IX86)

_CRTIMP int * __cdecl __p___argc(void);
_CRTIMP char *** __cdecl __p___argv(void);
_CRTIMP wchar_t *** __cdecl __p___wargv(void);
_CRTIMP char *** __cdecl __p__environ(void);
_CRTIMP wchar_t *** __cdecl __p__wenviron(void);
_CRTIMP char ** __cdecl __p__pgmptr(void);
_CRTIMP wchar_t ** __cdecl __p__wpgmptr(void);


#endif /* _M_IX86 && _DLL */

#if !defined(_M_CEE_PURE)
_CRTIMP extern int __argc; /* count of cmd line args */
_CRTIMP extern char ** __argv; /* pointer to table of cmd line args */
_CRTIMP extern wchar_t ** __wargv; /* pointer to table of wide cmd line args */
#else
_CRTIMP int* __cdecl __p___argc();
_CRTIMP char*** __cdecl __p___argv();
_CRTIMP wchar_t*** __cdecl __p___wargv();
#define __argv (*__p___argv())
#define __argc (*__p___argc())
#define __wargv (*__p___wargv())
#endif

386 ◆rCEzuNnL0g:2008/09/13(土) 12:04:34
継承の実装も分かった。
仮想継承の実装も分かった。
では、例外の実装は?

387 ◆rCEzuNnL0g:2008/09/13(土) 12:34:44
OllyDbgでアタッチしながらプログラム動かしたら例外の部分でおかしくなった。
という事でまあいいや。

388 ◆rCEzuNnL0g:2008/09/13(土) 12:37:04
SPX_IdleProcで一秒毎に来ると思ったら、メッセージで実現しているようだ。
で、そのメッセージの関連付けはSPX_Initnaze(?)の返したウィンドウである。
で、タイマーIDは12345なので、それをタイマーIDでSPXで使われていたが、ダブってしまうというw
駄目実装だなwwww

389 ◆rCEzuNnL0g:2008/09/13(土) 13:04:37
なんだか、プラグインの実装がCOMっぽい。COM勉強して良かった。
ということは、第一引数はIUnknown**?

390 ◆rCEzuNnL0g:2008/09/13(土) 13:05:12
それともFIObject**?


新着レスの表示


名前: E-mail(省略可)

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

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

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

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