
あなたは、人目の訪問者です。
| リンク |
DCOM のセキュリティ関連
|
| ATL でのオブジェクトのメソッドのオプショナル | |
メソッドの引数に
オプショナルの引数の型が VARIANT 型の場合で値の指定がなかった場合は(VT_ERROR という)エラー値 DISP_E_PARAMNOTFOUND が与えられる。 こんがらがっちゃうからね |
| 引数のオプショナルのデフォルト値 | |
上記のオプショナルでデフォルト値を用いたい場合
|
| 引数の数をよりダイナミックに... | |
引数の最後に VARIANT の SAFEARRAY メソッドを、非オプショナルで設定する
|
| DLL の作り方 |
|
「新規作成」-> Win32 Dynamic-Link Library -> 「シンボルをエクスポートする DLL」 多分、DLL のクラスができているさ。 |
| COM(ATL 利用) の作り方 |
|
「新規作成」-> Win32 Dynamic-Link Library -> ATL COM AppWizard -> 「挿入」->「ATL オブジェクトの新規作成」->(「オブジェクト」-「シンプルオブジェクト」) -> 「C++ ショートネーム」に文字列代入 -> 一番上の インターフェイス上で、メソッドの追加。 ここでも、その COM から呼び出されるクラスができているかな。 |
| リリースモードとデバグモード |
|
「リビルド」時に、「デバグモード」と「リリースモード」がある。 デバグも終了して、ソフトウェアが完成したら「リリースモード」で「リビルド」すると、コードも最適化されるし、デバグ情報も実行ファイル(exe,dll)に入らないので、そうしよう。 |
| メモリの再割り当て | |
|
| realloc() 時の注意 | |||
連続領域を確保できなければ、別のメモリの位置に移動して、確保するからだ。 また、確保できなかったことも考えて
再確保できなければ、NULL が返ってくる。そうなると、最初のメモリがどこかに行ってしまう(メモリリーク!?)。 必ず
(入れ替え時に、元の pin で確保したメモリは{realloc() が成功していると}良きに計らって解放してくれているらしい) |
| malloc() よりも realloc() | |
こうすれば、ほとんど malloc() 関数 |
| malloc() と calloc() の違い |
|
| 確保したメモリサイズ | |
|
| ポインタのポインタ | |
|
win32 では、ポインタは 32bit(4byte) p = (char **)calloc(5,sizeof(char *)); ってな感じ。
|
| ポインタのポインタ 2 |
|
| ポインタを参照渡しする | |
これ便利!!!! ポインタ利用の真骨頂!!!って感じぃ〜(女子高生風で半疑問系!?) 関数に渡すのは、未確保の配列のポインタのアドレスだけ。 関数内部で、必要なメモリを確保して、返してくれる。 関数を呼び出す側で、メモリサイズがどうの....と苦労する必要がない。 (まるで、VB の文字列処理のような事ができる) (当然、関数呼び出す側は free() を忘れてはいけない!!!!) 関数呼び出しも一回で済む!!!! だけど、VC++6.0 SP6 の デバグモードでコンパイルすると、これをエラーだと判断して実行できない場合がある。 ウザすぎ〜 Win32API では、文字列のポインタを指定するだけ....サイズが足りなければ、エラーを返して、別の引数(DWORD のポインタが多い)に、必要なサイズを返す。 ってパターンが多い。 → つまり、2回もアクセスしなきゃいけないって事だ。→ 面倒だと感じた事はないですか!!! 上記な方法で、関数を実装してくれれば、関数利用者には一回の呼び出しで済むってもんだ!!! Win32API の場合で注意するべきは、サイズを取得するためにワザとエラーを発生させるための最初の呼び出しの時、文字列ポインタに NULL を入れてもいい場合と、駄目な場合(別のエラーとして返してきて、サイズが取得できない)がある。 つまり、文字列ポインタがヌルであれば、サイズの引数に必要なサイズを返しますよ。って場合と、 文字列ポインタがヌルだと、別のエラーを吐くので、文字列ポインタには適当なサイズで確保したメモリのポインタを当てておかないと、サイズの引数に必要なサイズを返しませんよ。って場合があるって事 前者/後者は、サイズ取得→データ取得 と二回 API を呼び出す面倒臭さがあり、 後者では加えて malloc → realloc と二回も alloc 系を呼び出すという面倒臭さがある。 |
| \n と 0x0d 0x0a | ||||||
|
Widnows の C 言語中の「\n」は「0x0a」ですよ。 システムが、実行時に「\n」->「0x0d 0x0a」にする。
|
| スレッド | |||||||||||||||||||||||||||
スレッドは、以下のような関数として作る。
呼び出しは、
失敗した場合は、NULL が返る。
|
|||||||||||||||||||||||||||
| スレッドの終了 | |||||||||
|
スレッドは、スレッド関数内の「return」で自動的に終了する。 強制終了させる場合は、
|
|||||||||
| スレッド・クラス |
|
参考書「極める VisualC++」(吉田弘一郎著 技術評論社)のスレッド・クラスの真似っす。 自分用で、自分が必要な機能だけをクラス化した。 CmyThread.cpp |
| コールバック関数と、クラス | ||||||
|
クラスのメソッドをコールバック関数にはできない。 だが、static にしたメソッドはコールバック関数にできる。 ですが、クラスのメンバ変数にはアクセスできない。 こういう場合は、クラスのアドレス自体をコールバック関数に渡してやればよい。
詳細は以下のリンク |
| winsock.h |
|
この include 文は、ヘッダ・ファイル(*.h)で指定しないといけないようだ。 コンパイル・エラーをしている場合は、ヘッダ・ファイルに移してみよう。 これは、「windows.h より先にインクルード」と関係しているのかな? |
| メモリ解放 | ||
free() したからといって、NULL にはならない。
二重解放の防止
|
| COM ATL のアパートメントの概念 | ||||||||||||||||||
|
アパートメントとは、COM オブジェクトの保護単位のようなもの。(かなりいい加減です) COM をコールする時に「マーシャリング」が必要ない領域を指す。 つまり、STA にしておければ、内部コードはスレッド対応にしなくてもよい。
|
||||||||||||||||||
| COM ATL のイベント |
|
かなり、うる覚え... コネクタブル・オブジェクトという外向きなインターフェイスを使う。 VC++6.0 の ATL COM ウィザードの場合、作成時にチェックボックスをチェックするだけ。 そして、「ATL オブジェクト」を作成すれば、xxxxxEvents という外向きなインターフェイスも一緒に生成される。 その外向きなインターフェイスにメソッドを追加する(このメソッドがイベントになる) ひとまず、ビルド そして、通常の(内向き)なクラスから、「接続ポイントの作成」をする。 IProvideClassInfo2Impl インターフェイスを継承させる。 最後にビルド という感じ... |
| ATL COM イベントとスレッド |
|
上記のように、ATL COM イベントは、インターフェイスと強い結びつきがある。 インターフェイスは、アパートと呼ばれる制限(スレッド/プロセス)がある。 ということで、外部のスレッドから、そのインターフェイスを直接呼び出す事は COM のルールとして禁止されている。 基本的には、自分で生成した別スレッドから、イベント処理はしない方がいい。 なぜなら、それを実現するためには「手動マーシャリング」という非常に面倒な手続きを実装しなければならない。 まぁ、私のようなヘタレなプログラマが手を出してはいけない領域のようだ。 インターネット上にも、COM の書籍にもあまり詳しく書かれていないし.... |
|
ATL COM イベントとスレッド2 ウィドウハンドル |
|
手動マーシャリングなど、非常に煩雑...というか、未だに私は理解できない。 大体、呼び出し元(VisualBASIC や VBScript)はマルチスレッド対応ではない。 という事で、逃げのひとつの考え方として、COM のメインスレッドにウィンドウ・ハンドルを持たせて、別スレッドからそのウィンドウ・ハンドル(つまり COM 内部のメインスレッド)へメッセージを送る事でイベント処理をさせる。 詳細は MS 社の KB 196026「PRB: Firing Event in Second Thread Causes IPF or GPF」 というより、そっちのページを見て。(サンプルコードも載っているし...) |
| 時間経過 |
| zlib | |||||||||||||||||||||||||||||||
|
ここが参考になる。 (というか、参考サイトの方が詳細に書かれているよ) 本家はここ 参考になるサイトによると、 zlib.dll,zlib.lib,zlib.h,zconf.h が必要。
解凍は、deflate が inflate になるだけで、基本的には変わらない。 |
| zlib の COM ラッパー |
|
ここ |
| Release バージョンでのビルド・エラーについて(ATL etc) |
|
この方のページ を見よう。 頻繁に 「LIBCMT.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です。ReleaseMinDependency/XXXXX.dll : fatal error LNK1120: 外部参照 1 が未解決です。link.exe の実行エラー」 だったんですけど C の標準ランタイムが Release モードでは、リンク対象から外されるのが原因らしい。 「プロジェクト」→「設定」→「C/C++」→「プリプロセッサの定義」で「_ATL_MIN_CRT」を削除すればいいらしい。 |
| オブジェクト・コンストラクタ文字列 | |||||||||||
概要(はじめに)
ということで、COM+ がロードされたときに初期化される「オブジェクト・コンストラクタ文字列」に記録するのはどうだろうか。 管理者が設定するので、バイナリに機密情報がハードコーディングされない。 スクリプトにも機密情報が保存されない。 (Microsoft 「プログラマのためのセキュリティ対策テクニック」 P375) オブジェクト・コンストラクタ文字列とは、
オブジェクト・コンストラクタ文字列とは、
VisualBASIC6.0 SP6 でのオブジェクト・コンストラクタ文字列
うまくいかない場合もあるよ (うまくいかない場合は、CreateObject に渡す文字列 "プロジェクト名.クラス名" とか、全部最初から作り直すと良いでしょう) VisualC++6.0 SP6 でのオブジェクト・コンストラクタ文字列
オブジェクト・コンストラクタ文字列の保存先 どこでしょう? 要調査 |
| Java の COM ラッパー |
|
JAVA VM と COM のブリッジを作っておられる方を発見しましたので、リンク http://sourceforge.net/projects/jcom |