WMP11と中百舌鳥ぼや騒ぎ。

どうも~。こんばんは。

さてさて、Windows Media Player 11のBeta版がリリースされてたんですが、

早速入れてみました。

ずいぶんガラッと変わった感じですね~。

決しては悪くは無いです。

寧ろ気に入ってます。

いい。

いいよ。

ライブラリもぜんぜん変わってる。

音がよくなったっていうか、変わった気がします。

気のせいかな?

まぁとりあえず、

いい。

いいよ。

MSいいよMS。

正直WMPが好きです。

まぁ皆さんもお気に入りのプレーや見つけてくださいね。

別件ですが、

本日中百舌鳥駅付近にてぼや騒ぎ(?)がおきてました。

いつものように仕事を終えて、

帰り支度をしてたら、火災警報器の音が・・・・。

隣の館かなぁ。誤報かなぁと思ってたら、同じセンターの人とばったり。

「なんかなってませんか?」

「なってますねぇ」

とやり取りした結果、やはり隣の館から聞こえるという結論に。

ということで、警備会社に電話し、帰りますか~。

ところが、

センターを離れれば離れるほど音が大きくなっていき、

どうやら道路挟んで向かい側のマンションから聞こえるとの結論。

あわてて、警備会社に出動要請取り消しの電話(笑)

結構な野次馬がいたので、ついでに野次馬。

「どこですかね~?」
「もうずいぶんなってますよ~」

うわ・・・。俺も野次馬する年頃になったかぁ。

などと思ってたらあれよあれよという間に消防車が6台ほど到着。

さらに救急車も到着。

だれがどうみても大災害。

が、煙はおろか、火の気配すらない。

やはり誤報だったのかなぁ。

結局結末を見る前に終電がきそうだったのでそのまま帰ったんですが。

いったいなんだったんでしょうね?

しかも消防車の台数からしてもやたら物々しい。

うーん。

明日のニュースにでも乗るかな??

ちょっと気になってます。

ではでは。皆さんも火事には気をつけてくださいね。

WinPcapではじめるネットワークプログラミング – 2 –

やってしまいました。

ついつい夢中になって気づけばこんな時間。。。

とりあえずサンプル見つつ、自分で書き換えつつ、

パケットひろうところまでは暫定的に理解。

サンプルで非推薦の古い関数が使われていたのでいろいろと置き換え。

新しい関数への置き換え作業のおかげで、だいぶ理解が深まりましたね。

ただし、今は拾うことしか出来ないので、これからIPヘッダやらなんやらの解析の実装が待ってます。

それと拾う部分をうまくスケルトン化したい。

まぁ何が一番困ったかって、

*つけんの?&つけんの?

ってポインタかよ!もっと真面目にCやっとけばよかったなぁ。みたいな。

まぁそれはそれで。VCのおかげで、&つけて型が違うといわれりゃ*にかえちゃえ。みたいな感じで。

はい。ちゃんともっかい勉強します。

それと、サンプルをアップするつもりでしたが、不覚にも眠いので、

また今度にします。

今日感じた一番大きなこと。

MS厨(VB[:ハート:])ですが、

CもたのC!!

あ、はい。寒いですかそうですか。

とりあえずCでうまくサンプルできれば、うまいことC++っぽくOOP化して、

DLL化してVBから呼び出して使う!

最後にゃCOMだよCOM。

COMにしてAccess/Excelから引っ掛けて自動レポーティングでウマー。

月別、日別、プロトコル別あて先別とかでレポートとかだしちゃったりして、

さらにウマー。

うひょひょひょ。

やりたいこと山積み。

後はパケット出す側もほしいなぁ。

というわけで寝ます。

ではでは。又の機会に。

WinPcapではじめるネットワークプログラミング

どうも~。こんにちは。

さてさて、今C++パケットキャプチャの開発を考えています。

半分は授業(C++)の課題制作なんですが。

んで、window用のライブラリwinPcapを使ってみることにします。

お約束:
以下の手順を実行した上でのいかなる損害も補償しません。
自己責任でどうぞ。

~winPcapのサンプルが動くまで~

OS:Windows XP SP2
IDE:Visual Studio.NET 2003
Language:Visual C++
Lib:winPcap 3.1

手順1:winPcapのインストール

http://www.winpcap.org/

↑のサイトから「Get WinPcap」へ進む。

今回winPcapのバージョンは資料やサンプルが豊富なので3.1を使います。

WinPcap auto-installerをダウンロードしてインストール。

これをインストールしないとwinPcapを使用したアプリは動きません。

手順2:開発キットをダウンロードする

先ほどのページから「Development」へ進み、

「WinPcap 3.1 Developer’s Pack」

をダウンロードして解凍。

手順3:Visual Studio .NET 2003 にライブラリの追加

手順2で解凍したフォルダの中のIncludeとLibフォルダの中身を

C:¥Program Files¥Microsoft Visual Studio .NET 2003¥Vc7

のInclude,Libにそれぞれコピー。

正直これはやらなくていいかも知れないですが、ここでコピーしておくと、

間違ってヘッダファイルなどを消してしまう心配がないかと思います。

(VS自体アンインストールしてしまうといみないですが・・・)

ここでコピーしておけば

#include

のように”<>“を使ってincludeできます。

手順3:サンプルのビルドと実行

では実際にビルドしてみましょう。

Visual Studio .NET 2003を起動して、

「新しいプロジェクト」
「Visual C++ プロジェクト」
「Win32」
と進み
「Win32コンソール プロジェクト」

プロジェクト名を入力してOK。

Win32アプリケーションウィザードが表示されるので

「アプリケーションの設定」

で「空のプロジェクト」にチェックを入れて完了。

出来たら、ソースファイルに「sample.c」を追加し、

下記のサンプルコードを入力してみましょう。

/*
#include “pcap.h”
↑手順2でヘッダファイルなどコピーしなかった場合
この場合はしっかりヘッダなど追加して下さい。
(こっちでは試してません。)
*/
#include

/* prototype of the packet handler */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);

main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];

/* Retrieve the device list */
if(pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,”Error in pcap_findalldevs: %s¥n”, errbuf);
exit(1);
}

/* Print the list */
for(d=alldevs; d; d=d->next)
{
printf(“%d. %s”, ++i, d->name);
if (d->description)
printf(” (%s)¥n”, d->description);
else
printf(” (No description available)¥n”);
}

if(i==0)
{
printf(“¥nNo interfaces found! Make sure WinPcap is installed.¥n”);
return -1;
}

printf(“Enter the interface number (1-%d):”,i);
scanf(“%d”, &inum);

if(inum < 1 || inum > i)
{
printf(“¥nInterface number out of range.¥n”);
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

/* Jump to the selected adapter */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

/* Open the device */
/* Open the adapter */
if ((adhandle= pcap_open_live(d->name, // name of the device
65536, // portion of the packet to capture.
// 65536 grants that the whole packet will be captured on all the MACs.
1, // promiscuous mode (nonzero means promiscuous)
1000, // read timeout
errbuf // error buffer
)) == NULL)
{
fprintf(stderr,”¥nUnable to open the adapter. %s is not supported by WinPcap¥n”, d->name);
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

printf(“¥nlistening on %s…¥n”, d->description);

/* At this point, we don’t need any more the device list. Free it */
pcap_freealldevs(alldevs);

/* start the capture */
pcap_loop(adhandle, 0, packet_handler, NULL);

pcap_close(adhandle);
return 0;
}

/* Callback function invoked by libpcap for every incoming packet */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
struct tm *ltime;
char timestr[16];

/* convert the timestamp to readable format */
ltime=localtime(&header->ts.tv_sec);
strftime( timestr, sizeof timestr, “%H:%M:%S”, ltime);

printf(“%s,%.6d len:%d¥n”, timestr, header->ts.tv_usec, header->len);

}

入力し終わったらビルド!

おおおおおおおおおお。

うごかねーーーーーーー。

正直なやみました。

いろいろ調べたところ、wpcap.libをリンカに関連付けしないといけない模様。

というわけで、

1.メニューバーから「プロジェクト」
2.[プロジェクト名]のプロパティ
3.構成プロパティ
4.リンカ
5.入力
6.追加の依存ファイルにwpcap.libと入力。
7.OKを押して再度ビルド

これで動くと思います。

で、このプログラムは何をしてるかというと、

PCにインストールされているネットワークカードを検出し、

そのネットワークカードに流れてきたパケットを拾っているようです。

あ、そうそう。

言い忘れてました。

僕C/C++最高に苦手なんで。

一応コンソールでそれなりのものは作れますが、

やさしいCレベルなんで(^^;;

まぁこれから勉強していきたいと思います。

参考・資料にさせていただいたサイト

WinPcapを使ったプログラミング

ひげぽん OSとか作っちゃうかMona- – WinPcapを試す

そしてwinPcapの日本語ドキュメント

WinPcap Documentation

↑3.0用ですが、かなりありがたいです。
この解説資料を元にいろいろ作っていく感じになります。

参考にさせていただいたサイト様ありがとうございました。

それとスペシャルサンクス

くだすれVisual C++(超初心者用)スレのの550さん

僕と全く同じエラー出てました。

落ちてますのでキャッシュを貼らせていただきます。
こちら

久々のおい森。

どうも~。こんばんは。

今日は久々においでよどうぶつの森をやったんですが・・・。

久々すぎて村は雑草だらけ。

家にはゴキブリが3匹ほど住み着いている始末・・・。

廃村と化してました。

これからまた少しずつ家の借金返済していきたいと思います。
(なかなか時間が無いのもまた現実ですが。。。)

それとせっかくなので友達コード公開しますね。

地味に一回もwi-fiで通信したことないし・・・。

【名前】とも@ 
【村名】なかむら
【コード】3436-6680-7982
【果物】さくらんぼ、梨(少々)、ヤシ(ちょびっと)
【禁止事項】特にありませんが、一般的な荒らし行為は禁止します。
【開門時間】午後11時~翌2時ごろまで。

通信したい人がいましたら一声かけてください。

ではでは。

またの機会に。

ZOXY DOLL?

どうも~こんばんは。

先ほど、エンタの神様にまた新キャラ出てました・・・。

ZOXY DOLL(ゾクシードール)だそうな。

一見メイドっぽい格好。

とりあえず、小梅っぽいネタで、

世の中の不満をぶつけるらしい。

最初はぶりっこっぽくしゃべって、そのうち、ロックが流れ出して・・・

きめ台詞は↓

不満だぁ—!

あぁ、最近はこういうのが受けるのかな。

とりあえずいろいろ探してたらこんなの出てきた。

http://ip.tosp.co.jp/i.asp?i=lolitazoku

まぁ、なんとも。

ではでは。
またの機会に。

睡魔

どうも~。こんばんは。

彗星落ちなかったですね・・・

というか、日本時間では明日午前6じだとか。

因みに今日は、久々にヒヤッとしました。

仕事にきりが付いたのが、23:20分。

当然終電に間に合う予定でしたが、

今日に限ってPCがなかなか終了しない。

な?

なななな?

シャットダウンに5分もかかる始末。

どうなってんねん!

と思いつつ、帰り支度と、戸締りをしていたら、23:30分。

とりあえず駅までだーっしゅ!

いつもの信号にいつものように引っかかる!

とりあえず、時計も見ずにダッシュ!

おかげでなんとか終電1分前に着きましたが・・・。

やはり時間に少し余裕も持った行動を取りたいですね。

まぁそれはさておき。

最近すごく眠いです。

以前は、寝つきの悪いほうでしたが、

最近はすぐに寝付けます。

おかげで、今まで以上に自分の時間が減っています。

といいつつも、学校も、仕事も好きでやってるわけですから、

一日中自分の時間なんですが(笑)

はやくWi-FiControllerの続きを完成させたいです。

ではでは。

個人的には明日地球に彗星落下の予定ですので。

万が一地球が無事なら、またの機会に。

Good Luck!b

自己診断

abebeの日記からぱくってきました。

自己診断だそうな。

状況判断力
[69点] 情報が多ければ正しい判断ができるけれど・・・・・。

あなたの状況判断力は、かなりハイレベルといえます。特に情報の分析に関しては、かなり優れた能力を持っているようです。正しい情報をある程度集めることさえできれば、現状がどうなのか、そして今後どうなっていくのか、正しい結論を導き出すことができるはず。その意味では、コンピュータ的な知性の持ち主といえるでしょう。
ただし、その反面、情報が少ないとせっかくの状況判断力も活用されないまま終わりそう。恋愛にたとえると、近くにいる相手の気持ちはしっかり把握することができるけれど、遠距離恋愛になると相手が普段何をし、何を考えているのかまるでわからなくなってしまう・・・・といった感じかもしれません。
その意味では、日ごろの情報収集があなたの判断能力のカギを握るといってもいいでしょう。

感情制御力
[60点] 楽しい気分のときに感情がコントロール不能に

あなたはなかなか強い感情制御力をもっているようです。特にあなたの場合、悲しみや怒りをコントロールする能力に優れています。腹が立つことをいわれたからといって上司とケンカしたり・・・・・なんてことは、あなたに限っては考えられないでしょう。また失恋をしたからといって大泣きして友だちに迷惑をかけたりした経験もほとんどないはず。
ただしあなたの場合、うれしい時にだけは感情制御力の働きが鈍りやすい傾向があるようです。たとえば恋人ができらからといって友達の前でのろけ話をしたり、給料の高い会社に転職が決まったからと自慢話をしたり・・・・・。これではみんなに妬まれ、敵を増やす結果になるだけです。
うれしいことがあったときや物事が順調に進んでいるときこそ注意が必要。感情をうまくコントロールして、はしゃぎすぎたり浮かれすぎたりしないようにしましょう。そうすることで悪評を招いたりする危険性も、グンと少なくなるはずです。

意志実行力
[34点] 楽しいと思えることはがんばれるけどガマンが苦手

あなたの意志行動力は、まずまず平均的なレベルといえます。特にあなたの場合、恋愛や趣味の修得など途中のプロセスがある程度「楽しい」と感じられるものなら、軽いフットワークで計画をすぐさま実行に移すことができるでしょう。
ただし、ダイエットや資格取得のための勉強、家を買うための貯金など「明日から始めよう」などと計画をつい一日延ばしにして、結局何一つ実現できない・・・・・ということになりやすいのです。その結果、趣味や恋愛体験はやたらと増えるけれど、生産的なことは何も身につかない危険性もあります。
ある程度つらい状況を乗り越えて努力することで、人間は成長できるものです。また、時間は私たちが考えている以上に早く過ぎ去ってしまうものです。やるべきことを一日伸ばしにしたりせずに、しっかり計画を立て少しずつでも着実にがんばるようにしましょう。

対人共感力
[74点] 思いやりはあるけれどおせっかい癖には気をつけて

あなたは、かなりハイレベルな対人共感力の持ち主。特にあなたの場合、思いやりの気持ちが他の人と比べてものすごく強いようです。ですから少し浮かない顔をしている人がいれば、「どうしたの?」と相談に乗ってあげようとするし、雑用なども自分から手伝ってあげます。
周囲の人気もそこそこに高いあなたですが、唯一の問題点はそうしたあなたの優しさがときとしておしつけがましいものになってしまうこと。みんなに親切にするのは決して悪いことではありませんが「おせっかい」という評判が広まることにもなりかねません。
あなたの場合、あまり見境なく対人共感力を発揮するのは考え物。相手に本当に感謝されると思える時にだけ周囲の人に親切に振舞ったほうが、あなたのおもいやりの価値も高まるはずです。

総合診断

[タイプD] 頭は抜群にいいけれど計画倒れで終わりやすい心配が

状況判断力・感情制御力・対人共感力の3つの能力に関して比較的高得点をマークしたあなたは、基本的にものすごく頭のよい人物ということができるでしょう。
何があっても決して取り乱したりせず、冷静に状況を分析して次にどうしたらいいのか、的確な判断を下します。しかもあなたあは、困っている人の悩みを聞いてあげたりする人情家の一面も持っているので、いい相談相手としてみんなに頼りにされているはず。人望も厚く、これらの点だけ見ればまさに理想的なリーダーかもしれません。
ただしあなたの場合、意志実行力にやや欠ける部分があるのが、はっきりいって悩みのタネ。「自分が今何をすべきか」がはっきりわかっているのに、なかなかそれを実行することができないまま、絶好のチャンスを逃してしまうのです。
そのため会社などで責任ある立場を任されたりしても、あなたの部署はチームワークはいいのに期待通りの成果をなかなかあげられないかも。
また恋愛でも同様です。好きな相手といい雰囲気になることはできても、友人と恋人の一線をなかなか超えられずにいるうちに、ライバルに先を越されたりしそう。仮に相手から告白されてつき合うことになったとしても、自分からどんどん愛情を表現していくことができないために、マンネリが人一倍早く訪れてしまったり・・・・・。
物事が計画だけで終わってしまいやすいあなたの運命を打開するには、とにかくせっかちで行動力のある人物を味方につけることが大切。仕事に関しても、そうした人物とチームを組めばあなたは成功率の高いプランを立てるだけでその人物が着実に実行してくれて大きな成果を上げることができるでしょう。
また恋愛も、おせっかいなところのある友人に何かと相談を持ち掛けるようにすれば、その友人がいろいろとお膳立てをしてくれてうまくいくようになります。交際中はあなたが相手に対していろいろな要求をし、それを実行してもらう関係が作れれば、愛は長続きするはず。

—-
意志実行力と総合評価が抜群にあたってる気がしますね。

皆さんもどうぞ。
http://cence.hp.infoseek.co.jp/eqtest.htm

猫を飼う。

ヘリコプターの中で猫を飼い始めました。

名前はTom。

飼い始めるまでに少々時間がかかりました。

今でも環境になじめてないのか、時々奇行に走ります。

手間のかかるかわいい奴です。

正直、ヘリコプターの運転を猫に任せるのはなんともいえない気分です。

ためしに「Hello Word」と書かれた餌を与えましたが、

なかなか食べてくれませんでした。

今後少しずつ、Tomと仲良くなりたいと思います。

というわけで、

Apache1.3 + mod_jk + Apache Tomcat 5.5

の環境を作ってみました。

正直WEBはPHPとPerl(少々)しかかじってないので、

JSPやサーブレットに関しては無知に等しい状況です。

動かすだけの設定にずいぶん手間取ってしまいました。

とりあえず、動くようにはなったので、少しずついじって見たいと思います。

今回難儀したのは

Tomcat側では、workers.propertiesの設定がさっぱりだったので適当に拾ってきた奴で動いてます。(笑)

Apache側に関しては、おなじみのLoadModule,AddModuleあたりをいじる感じです。

ただし、てっきりAddTypeに.jspを設定すると思い込んでましたが、

どうも違ってたようですね。

その辺もうまくまとまれば公開していきたいと思います。

とりあえず所感ですが、JSPに関してはそれなりに作れそうです。

PHPみたいな感覚で作れそうです。

HTMLにJavaを埋め込む感じみたいなので。

サーブレットに関しては少々厳しそう。

結局はJavaだとは思うんですが、いかんせんいちいちTomcatへアプリケーションを追加したり、云々が慣れるまで面倒くさそう。

とりあえず普通のJavaの基本的なことと、WEBアプリの基本的なことも

習得できているので、後はそれら二つをミックスして、サーブレット、JSPの開発も進めてみたいと思います。

まぁ、一人で作るようなWEBアプリなんてPHPで十分なんだろうな・・・。

そんな感じで、ブログの方にもJ2EEカテゴリー追加!

ではでは。またの機会に。

vectorに作者登録!

どうも~。こんばんは。

さてさて、本題の前に新着リンクのご紹介

初級プログラマ’sBlog
日記を中心につらつらと書いていきます。

アドレス:http://fukutoshi.dnsalias.net/Mypage/ptoshiyu/Blog/

クラスの友達のブログ。

1年のときからの友達で、かなりのつわもの。

なんというか、彼には天性と努力の両方を感じます。

就職も決まったようで、これからますますがんばって欲しいと思います。

さて、タイトルの件ですが、

実は今新しいアプリを開発しています。

ちょこっと紹介させていただくと、

ソフト名:Wi-FiController

概要:無線LANを通じてPDAからPCを操作するソフトウェア。

動作環境(サーバー):Windows 2000 or Windows XP
※要.NEt Framework 1.1

動作環境(クライアント):Windows Mobile 20003 SE異常
※要.NEt CompactFramework

開発環境:Visual Studio.NET 2003

開発言語:C#

種別:フリーウェア

開発状況:αバージョン完成。

主要機能:
キーの送信
クライアントはサーバーを起動しているPCのアクティブウインドウに対して

← → ↑ ↓ PageUp PageDown Space Enterを送信できる。
マウスカーソルの操作
クライアント上のマウスパッドエリアでスタイラスを操作すると、

その動きがにあわせてPC側のカーソルが移動する。

次期バージョンへの課題次項:
マウスのうごきのエミュレーションがへぼすぎるで修正。
特殊キー(Alt+F4など)の送信のサポート。
ユーザーがいくつか好きなキーを登録して送信出来るような機能の追加。
クライアントからPCの再起動、スタンバイ。
サーバーにインストールされているアプリの起動。
サーバーで実行中のアプリの終了。
サーバーのボリュームコントロールの操作。
Alt+Tab的な機能も欲しい。

こんな感じです。

まぁ何で作ろうかと思ったかっていうと、

寝転がったままテレビチューナーのチャンネルを変えたい!

でもリモートでつなぐのは仰々しいし、テレビなんか再生しながらリモートなんかできん。

じゃ好きなように作ろう。

それだけw

ですので、実質完成しています。

今使っているmAgicTVはチャンネルの変更はPageUp,PageDownで行えますので。

まぁ、そこは人間です。欲が出ます。

じゃぁ眠くなったらテレビ消したいよね。

消したけど、また見たくなったらつける機能欲しいよね。

本気で眠くなったらPC落としたいよね。

そういえば音楽聴きちなぁ。

メディアプレーヤーを起動しよう。

ってな具合で。。。

そして最後の欲。

公開したい

ってなわけで、日曜にvectorに作者申請。

今日登録完了メールが。

よーし。今月中に公開テストバージョンという位置づけで公開だ!

もしこんな機能ほしい!という方がいらっしゃいましたら

遠慮なくコメントください。

ただし実装できるかどうかは分かりません。

※開発中の画像
label1はご愛嬌・・・・。
灰色の部分をスタイラスでつつくと、PCのマウスも動きます。
現バージョンでは若干奇妙な動きをします。

開発中の画面(エミュレータで動かしているところ)

うーん。なんかしろーとくさいフォームだなぁ。。。

まぁまだまだβ以下ですので。。。

ではでは。またの機会に。

.NETのインターフェースについて。

※以下個人的な覚書です。
情報の正当性や、妥当性は保障しかねます。

普段Interfaceと聞くと、ついついJavaで見かけるようなInterfaceを想像します。

もちろん.NETにもJavaのような使用方法もありますが、

この記事では、インターフェースを型として宣言したり、メソッドの引数にするような使用方法を個人的にまとめます。

[開発環境]:Visual Stdio.NET 2003
[開発言語]:Visual Basic.NET(VB.NET)
[実行環境]:Windows Xp SP2

□Javaのinterfaceと同等のコード
‘Subプロシージャとプロパティを持つインターフェース
Public Interface IMyIF1
Property Msg() As String
Sub ShowMsg()
End Interface

※VB.NETではインターフェースに宣言できるのは、Sub,Functionおよびプロパティのみ。

‘IMyIFを実装した、IFTestクラス
Public Class IFTest
Implements IMyIF1
Private strMsg As String

Public Property Msg() As String Implements IMyIF1.Msg
Get
Return strMsg
End Get
Set(ByVal Value As String)
Me.strMsg = Value
End Set
End Property

Public Sub ShowMsg() Implements IMyIF1.ShowMsg
MsgBox(strMsg)
End Sub
End Class

ここまでのコードを見ると、言語の違いのみでJavaと等価といえます。
ただし、VB.NETに限って言うと、それぞれのプロシージャ、プロパティの
宣言の後に”Implements~”が書かれています。

これにより、実装するクラス側ではInterfaceで宣言したものと異なった名前
をつけることが可能です。

すでにご存知の方もいらっしゃると思いますが、
IDEが優秀なおかげ(?)で、Implements IMyIF1を記述した時点で、
実装コードは自動的に生成されます。

今回は僕が書き加えたのは、
・strMsgの宣言
・プロパティのGet,Setの中身。
・ShowMsgプロシージャの内容
のみです。

□インターフェースを型として宣言する。
まず、通常通りにIFTestクラスのインスタンスを生成してみます。

‘IFTestクラスのインスタンス生成
Dim IFTestObj As New IFTest

当然ながら、プロパティ「Msg」,プロシージャ「ShowMsg」を使用することができます。

次に何も考えずにIMyIF1を型として宣言してみましょう。

‘Interfaceの宣言
Dim IMyIF1Obj As IMyIF1

※InterfaceはNewすることは出来ません。

‘すると以下のように見事Interfaceのプロパティや、プロシージャにアクセスできます。
IMyIF1Obj.Msg = “test”
IMyIF1Obj.ShowMsg()

が、実行すると「オブジェクト参照がオブジェクト インスタンスに設定されていません。」

というエラーが出ます。
.NET触り始によく出したエラーですね(笑)

ここからが本題です。

上記コードでは、Interfaceのみを宣言した形になります。

ここで魔法の1行。

Dim IFTestObj As New IFTest
Dim IMyIF1Obj As IMyIF1
IMyIF1Obj = IFTestObj
IMyIF1Obj.Msg = “test”
IMyIF1Obj.ShowMsg()

あら不思議。

見事”test”とメッセージボックスが表示されましたね。

ここで僕の大好きな@ITから引用させてもらうと
@IT:連載 オブジェクト指向プログラミング超入門 最終回 オブジェクトをつなぐためのインターフェイス

インターフェイスを実装しているクラスは、そのインターフェイスの型の変数にキャストなしで代入することができます。

ふむふむ。

ここで@ITを呼んで理解できた人はすごい。

正直僕はいまだに理解してません(^^;;

本当にInterfaceを実装していればキャストせずに代入できるのか!?
ためしにもう一つInterfaceを作ってみます。

‘IFTestクラスに新たにShowMsg2を実装させるためのInterface
Public Interface IMyIF2
Sub ShowMsg2()
End Interface

実際にIFTestクラスに実装しましょう。
Public Class IFTest
Implements IMyIF1, IMyIF2
Private strMsg As String

Public Property Msg() As String Implements IMyIF1.Msg
Get
Return strMsg
End Get
Set(ByVal Value As String)
Me.strMsg = Value
End Set
End Property

Public Sub ShowMsg() Implements IMyIF1.ShowMsg
MsgBox(strMsg)
End Sub

Public Sub ShowMsg2() Implements IMyIF2.ShowMsg2
MsgBox(“ShowMsg2:” & strMsg)
End Sub
End Class

結局こんな感じになりました。

それではここから実験。

Dim IFTestObj As New IFTest
Dim IMyIF1Obj As IMyIF1
Dim IMyIF2Obj As IMyIF2

‘IMyIF1
IMyIF1Obj = IFTestObj
IMyIF1Obj.Msg = “test”
IMyIF1Obj.ShowMsg()

‘IMyIF1
IMyIF2Obj = IFTestObj
IMyIF2Obj.ShowMsg2()

どうでしょうか。
なんとなくわかっていただけたでしょうか?

正直本人すらよく分かってないものを一生懸命説明しても仕方ないんですが。。。

説明を書いている過程でひらめくかなと思った次第だったのですが、

あまりひらめきませんでしたorz

とりあえず、個人的なまとめとして、
・Javaのように使うことが出来る。
・Interfaceを実装しているクラスは、実装済みのInterfaceに代入できる。
・代入後、型として指定したInterfaceのメソッドや、プロパティを利用できる。

といったところでしょうか。

良いサンプルでなくて申しわけないのですが。

補足させていただくと、最近MSHTMLをよく触っていまして、
そこにIHTMLDocument,IHTMLDocument2,IHTMLDocument3,IHTMLDocument4,
IHTMLElement,IHTMLElement2などといったたくさんのインターフェースが
あったわけです。

この場合IHTMLDocument系のインターフェースはすべてHTMLDocumentClassというクラスが実装しています。(親クラスとでも言うんでしょうか)

それで何気なく、bodyにアクセスしたいときはIHTMLDocumentをつかうとか、
writeメソッドやwritelnメソッドを使いたいときはIHTMLElement2を使うなど、
適当にいじっていたわけです。

それで、どうも.NETというか、COM(?)のインターフェースは何か違うと感じ、
この記事にいたったわけです。

※もちろん、MSHTMLは8Mほどのファイルを再配布する必要があるので、
TypeクラスやとType.InvokeMembeなど駆使して利用していますが。。。

そのうちMSHTMLを使ったDOMHTMLでのHTML解析のサンプルも載せたいと思います。

最後に・・・

もしこの記事を読まれた方で、誤りを見つけられた方や、ご指摘のある方は、コメントの方へお願いしますm(_ _”m)ペコリ

まだまだ僕も勉強が足りてないなぁと思う今日この頃でした。

ではでは。またの機会に。

自称ネットワーク屋の独り言。 21th Seasons(Since 2005/01/11)