<   2006年 12月 ( 12 )   > この月の画像一覧

e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

足りなかったもの

最近、仕事が手に付かず、毎日のように風邪をもらい、
なんだか病弱になってしまったような日が続いていました。

これはビタミン不足だ!と決め込み、
ビタミン入りののど飴や、DHCのマルチビタミンを取っていたのですが、
やっと不足しているものがわかりました。

睡眠でした。。。(^^;)

毎日4時に寝て7時半に起き、7時40分に自宅を出る生活をしていたのが災いしていたようです。。。

ここのところ、12時前に寝るように心がけています。

今までのダメさ加減が嘘のように、今までの10倍のスピードで仕事が片づくようになりました。
なにより、スッキリしているのがすばらしい!
神様ありがとう!
[PR]
by isoq | 2006-12-28 11:10 | 日記
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

DLL内部で作成したスレッドのスタックが終了時に解体されない

DLLを作成しました。
本体プログラムが終了するときには、DLLも終了します。
このDLLの中で、COMを使用しようと思ったのですが、意外と難しい。

DLLがプロセスやスレッドにアタッチされるとき(DLLが読み込まれたときや解放されたとき)、DllMain() 関数がコールされます。
DllMain()関数の引数に、何故DllMain()関数が呼び出されたのかという情報がシステムによって渡されて来ます。


BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // DLL モジュールのハンドル
DWORD fdwReason, // 関数を呼び出す理由
LPVOID lpvReserved // 予約済み
);


ここでいう fdwReason がその呼び出し理由です。

理由は4種類。

プロセスにアタッチされた。(DLL_PROCESS_ATTACH)
プロセスからデタッチされた。(DLL_PROCESS_DETACH)
スレッドにアタッチされた。(DLL_THREAD_ATTACH)
スレッドからデタッチされた。(DLL_THREAD_DETACH)


ここで問題その1は、スレッドのアタッチとデタッチ。
プロセス内の全てのスレッドに対してこのコールが発生する訳ではありません。

DLL_THREAD_ATTACH の場合、あくまでも新しく作成されたスレッドの中から、そのスレッドの処理を開始する前に DllMain() が呼び出されます。
もちろんDLLをアタッチした(ロードした)スレッドからは呼び出されません。

DLL_THREAD_DETACH の場合、DLLがアンロード(デタッチ)される前に終了したスレッドからのみDllMain() が呼び出されます。

このような仕様のため、使いにくいです。


DLL_PROCESS_ATTACH や、DLL_THREAD_DETACH の場合にも問題があります。
これらは、DLL_PROCESS_ATTACH は、DLLをロードしたスレッドから呼び出されますが、DLL_THREAD_DETACH は、それと同じスレッドから呼び出されるとは限りません。

これらは、COMの仕様である CoInitialize()/CoUninitialize() の呼び出しに影響します。

COMでは COMを使用するスレッド毎に CoInitialize()/CoUninitialize() の呼び出しが必要になります。
そのため、DLLを呼び出すスレッド全てにおいて、CoInitialize()/CoUninitialize() を正しく呼び出したいのですが、うまくいきません。

よくよく見ると、MSDNの CoInitialzie() の説明の最後に、
Because there is no way to control the order in which in-process servers are loaded or unloaded, do not call CoInitialize, CoInitializeEx, or CoUninitialize from the DllMain function.

などと、注意書きが。。。



そこで、DLLの中にスレッドを作成して、その1つのスレッドの中だけでCOM関連の処理を行う方法を考えました。
DLLの中でスレッドを作成、COM初期化、そして、COMを使用。

成功したかに見えましたが、DLLをロードしているプロセスが終了したときに、有無を言わせずにスレッドが停止してしまう事が判明しました。
スレッドのスタックの解体も行われないまま、、、
そのため、CoUninitialize() を呼び出す暇も、COMオブジェクトを解放する暇もありません。
最後の DllMain() が呼び出されたときには、跡形もなく破棄されてしまっています。

ひどい。
ひどすぎだ。

というわけで、DLL内でCOMを使うのは難しいという結論に至りました。

※ここで難しいのは、DLLを呼び出す側のアプリケーションは、自分で作成したものではないところです。
自分で作成したのなら、スレッドの開始や停止を制御できますので、全く問題なくCOMをつかえると思います。
今回は、あるプログラムの使用しているDLLと同じインターフェースのDLLを作って、処理を一部変更してしまおう!プロジェクトのため、こんな面倒な事になっています。

。。。不可能だ!

DLLだけでは不可能!

こうなったら、COMを使用する外部プログラムでも作って、共有メモリでも使ってデータを受け渡すしかないか。。。
[PR]
by isoq | 2006-12-26 11:04 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

原因不明のリンクエラー

リンクエラーがどうしても取れませんでした。

ReadTestDlg.obj : error LNK2019: 未解決の外部シンボル "void __cdecl SetFDA(unsigned int,void *)" (?SetFDA@@YAXIPAX@Z) が関数 "public: void __thiscall CReadTestDlg::OnBnClickedButtonMemoryRead(void)" (?OnBnClickedButtonMemoryRead@CReadTestDlg@@QAEXXZ) で参照されました。
Debug/ReadTest.exe : fatal error LNK1120: 外部参照 1 が未解決です。


悩んで、悩んで、、、

いろいろ試してダメだったので、簡単な関数をかいてみた。

void Test(int a){printf("%d",a);}


これを、

void Test(int a);


でプロトタイプ宣言して使用してもリンクエラー。。。

これは、呼び出し規約か名前装飾規約っぽい。

よーくよーく考えたら、ファイルの拡張子が .c でした。

そうそう、cとc++は似て非なるもの。

そう、装飾されたシンボル名が違っていたのです。

extern "C" void Test(int a);


のように extern "C" をプロトタイプ宣言の前に付ける事で、装飾規約をC言語互換とすることで、無事にリンクエラーが解消した訳です。

ふぅ、、、面倒な事をしてくれる。
[PR]
by isoq | 2006-12-21 11:13 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

Visual Studio 2005 Service Pack 1

やっとでました。
SP1

先日、インストールしてみました。
今日使ってみました。

とりあえず、第一印象は、早くなったな~~~~

ということ。

いままでもたついていた、起動やプロパティの参照、クラスビューなどが、サラッと表示されるようになりました。

だいたい、今までが遅すぎたのですが。

それほどまだ使い込んでいないので、第二印象はまた今度。
[PR]
by isoq | 2006-12-20 10:29 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

午後。

金沢駅前イオンのゲーセンで並んでコインゲームに励むサラリーマン2人。



1時間ちょっとの空き時間があったので魚を網で捕まえるコインゲームを始めた。

それが出るわ出るわ。

時間が無くなってきたので早くコインを使いきろうともがけばもがくほど出る。
2000枚近く残ってしまった。

使いきれないし、お店にチャージしておいても1月で無くなるし。

そうだ!お子さまにあげよう!

が、しかし、こんな時に限って、見渡す限りおこちゃまがいない。

しょうがないので、近くにいた中学生位の少年2人組にあげてきた。


自宅近くで子供とやってもこんなに出ることは無いのにな~
ちょっと残念。
[PR]
by isoq | 2006-12-19 19:11 | 携帯からの投稿
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

携帯に対応してるじゃん

エキブロがスキン無視で携帯専用表示に対応してるよ~

いつの間に!?

このブログのアドレスは
http://mblog.excite.co.jp/user/isobe/

同じアドレスで自動切り替えではないみたいです。
[PR]
by isoq | 2006-12-19 10:34 | 携帯からの投稿
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

金沢出張

北陸に出張。

飛行機に乗り遅れた。
電車の中で航空券のキャンセルと次の便の予約をした。
今では携帯から何でもできる。
べんりだわ。

特割が効かなくなるは、キャンセル料とられるは、高く付いてしまった。

羽田からの出発は遅れたけど、到着は定刻より早かった。
離陸してウトウトしていたら、コーヒーが出てきた、と思ったら着陸だ。
近いな~
飛ばしたのかな(^_^;)
空ではスピード制限は無いんだろうな~
小松に着くと、着陸後3分もしないうちに、あわただしく自衛隊?の戦闘機が轟音をたてて次々と発射されていた。
基地と空港で滑走路を共有しているんだね。
あまり見る機会がないので新鮮でした。
戦闘機の轟音は緊張感を漂わせますね。
頑張って日本海の平和と安全を守っていただきたいです。
[PR]
by isoq | 2006-12-19 10:21 | 携帯からの投稿
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

[MSDN Flash 2006/12/12]のアンケートにモノモーッス

[MSDN Flash 2006/12/12]のアンケート。


マイクロソフトからのお知らせ
Amazon ギフト券が当たる ! Visual Studio に関するアンケート
12/28 (木) まで 「Visual Studio」 に関するアンケートを実施中です。抽選で Amazon ギフト券のプレゼントのチャンスあり ! 是非ご協力ください。


抽選でAmazonギフト券500円分が200名に当たるというので、
このアンケートに回答したんですわ。

それはそれはながーいアンケートで、途中で諦めかけること数回。。。
こんな長いアンケートは、応募者全員に1000円の商品券を配るべきだ。

なんとか最後まで答えて、
最後に、

年齢、性別、都道府県

を入力してアンケート終了!

。。。

おい!こら!

どうやって抽選するねん!!!

当選結果をどうやって教えてくれるわけ???

はぁ~~~~~無駄な時間過ごした~~~~~
[PR]
by isoq | 2006-12-13 22:00 | 開発日記
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

イベントの追加、削除

ただのメモです。


PostPassWord.TextChanged -= new EventHandler(PostExec_Click);
PostExec.Click += new EventHandler(PostExec_Click);

[PR]
by isoq | 2006-12-09 21:13 | Web
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

vi練習中

Linux で しかも最小構成に近いサーバーだと、
エディタも vi しか入ってない。

なので、仕方なく vi を練習中です。

仕方なくでも無いんですけどね。

この間、会社の地下倉庫の棚から viの入門書を発見しました。
しかも、新品同様で誰も読んでいなかったみたい。
電車の中でざっと読んで、だいたい使い方は覚えたから、
レッツトライ!って感じです。

昔ちょこっとかじったことはあったんだけど、
この間、久しぶりにやってみたら全く使えなくなっていて、
なぜかタスクを切り替えてしまって、何度 kill -9 xxx したことか。

本を読んだらかなり思い出してきて、保存の仕方と終了の仕方がわかりました (^^;)
[PR]
by isoq | 2006-12-09 02:18 | コンピュータ
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇