・Winampのプラグイン
Winampのプラグイン完成。
いやぁ、、、予想以上に手間取った。
というか、自分がすごい誤解をしてたのもあるけど、
結局、半ば強引に実装しました。
以下そのとき思ったことのメモ。
・プラグインを作るときは、Cでやるほうがいい
C++でやると、どうにも安定しないっていうか、
まれに読み込まれる、と解釈した方がいいのか。
追記
C++でやる場合、extern "C"を使えば、問題ないかも。
ただ、この処理がどういう処理を行ってるのかはいまいち不明。
使ってみようというかたは、別に調べてみてください。
・ソリューションを作成するときは、添付されてるものを使う
Winampのプラグインを作るときは、ソリューションを自分で作成せずに、
添付されているプロジェクトファイルなり、Makeファイルなりを使うようにする。
あと、規定のライブラリを無視する設定になっているものがあるけど、
それは有効にしてもOKだった。というか、しないと厄介。
メモ終了。
そういや、やっとプロセスのアタッチとかデタッチの使い方がわかってきた。
プラグインを作るときはこの機能があると、実行中にデバッグできて
かなりらくだなぁ。
・Pocket PCでポッドキャストのファイルを取得
今度は別のソフトで、CでDLLを作って、C#でそれを呼び出し。
しかも、対象プラットフォームがPocket PCだから、さらに厄介。
.NET Compact Framework 1.xだと、オブジェクトの
ウィンドウハンドルが取得できないので、
しぶしぶ.NET Compact Framework 2.0を使用。。。
違うプロジェクトをコンパイルしてるのに(しかも、
言語も違うのに)1Byteもサイズが違わないものが生成された(笑
なんで、こうやって宣言されてて、
struct sockaddr {
ushort safamily; /* address family /
char sa_data[14]; / up to 14 bytes of direct address */
};
typedef struct sockaddr SOCKADDR;
これがよくて、
if(SOCKET_ERROR == connect(ServerSocket,(SOCKADDR *)&ServerSockaddr,sizeof(ServerSockaddr)))
これがいけない。
if(SOCKET_ERROR == connect(ServerSocket,(sockaddr *)&ServerSockaddr,sizeof(ServerSockaddr)))
どうしてなんだろう。
よくわからないなぁ。
どこかで自分が間違えてるか、、、
マルチバイト文字列からワイド文字列への変換関数
mbstowcs(), wcstombs()
こんなエラーが出た。
エラー 1 error LNK2019: 未解決の外部シンボル _securitycookie が関数 Connect で参照されました。 Download.obj
エラー 2 error LNK2019: 未解決の外部シンボル _securitycheck_cookie が関数 Connect で参照されました。 Download.obj
検索してみると、日本語の情報はあまりない。
英語の方で検索してみると、同じ状況のエラーを発見。
「secchk.lib」を追加してやれば、できるようになった。
DLL linker error security_cookie ??? - MSDN Forums
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=92692&SiteID=1
何故か、C#でstringでDLLで定義して、DLL側に送られてくるのが一文字だけ orz
ふざけるなぁ。。。
splitpath、wsplitpath
資料探してる間にこんな関数を発見。
「パス名を構成要素に分解します。」とのこと。
やったーーー。
やったよ、やっと3時間近く悩んでた問題(一文字しか
送られてこない問題)が解決したよ。。。
原因は、文字コードの違い。
Pocket PCの場合、基本的にすべてUnicodeで処理することになるんだけど、
C#からアクセスする関数の引数がLPCSTRになってたのが原因っぽい。
半角英数についてはそんなにうるさく言われないと踏んでたのに、
これは盲点だったなぁ。変数のサイズが違うからかなぁ。。。
C#のXMLリーダって、URLからの取得も対応してるんだねぇ。
まぁ、C++で作ったダウンローダの方はバイナリに対して
使いたいだけだから、無駄にはならないけど。
属性(Attribute)を取得したいときは下の方法。
Path.Add(reader.GetAttribute("url"));
何か、ホスト名からIPアドレスに変換したときに、
IPアドレス文字列の末尾にごみがつく・・・。
また、余計なことに時間を取ってしまったような気がする。
上の問題はwcstombsの三つ目の引数の解釈を間違えてたのが原因だ。。。
てっきり、変換前の文字列の長さかと思ったら、そうじゃなくて、
変換後の文字列を格納する変数の最大長を入れてやらないといけないみたい。
それだから、末尾にNULLが入ってなくって、ごみが入ったようになったんだと思う。
長年の疑問が解決したような気がする。
というか、いわれれば、もっともなんだけど、
HTTPのリクエスト投げるときに、バーチャルドメインで稼動してる環境だと、
IPアドレスでサーバーソケットに接続して、
そこから、どうすれば個別のドメインに対して
アクセスできるのか、ってのがわからなかった。
で、今よくよく考えてみれば、別に、HTTPのリクエストメッセージの
ところに、ドメイン名からかいてやれば、いいだけじゃないのか、
と思って、調べてみると、やっぱりそういうことらしい。
というか、スキーム名からはじめちゃっていいみたい。
おし、、、ダウンロードできる状況まで完成。
これ以降は明日以降でもすぐに実装できるだろう。
・Free Typing
手をつけようと思ったけど、時間が無くて断念。
こちらも明日以降に回します。
さて、かなり見辛いですが、今日の様子。
今日は、勉強はほとんどしていませんでした。
まぁ、今日は息抜きだと決めてやりましたが。
さて、明日からは夏休み最後までがんばっていこう。