2008年06月28日

この想い真琴に届け! Ver.0.04

Seesaaブログ用アップローダー『この想い真琴に届け!』の評判が良いのか、かなりダウンロードされてるし、紹介記事から飛んできている人が結構いる。

やはり、皆さんFTPに対応してない&ファイルマネージャーが使い難いことで悩んでいたのですね…。
だからといって、移転するのもめんどくさい。

で、なんか人気なので0.04もアップしておきます。
SeesaaFileUploader_0.04zip(約60KB)

ちなみに真琴シリーズと題して「真琴への手紙」とか「真琴からの贈り物」っていうブログ用ソフトも密かに開発中。
どれも後発で優れたソフトが山のようにあるので完全趣味&自分専用ソフトですが…。
 
posted by ドーナツ塔 at 19:27| Comment(0) | TrackBack(0) | プログラミング関係 | このブログの読者になる | 更新情報をチェックする

2008年06月23日

C# DllImport関係のメモ パート2

C#は良いと思ったが、アンマネージドとマネージドが混在すると非常にめんどくさい気がしてきた…。
.Net使うだけなら、VC++で良い。

DllImportで構造体のポインタを返り値とする関数の扱い方。
受け取る型はポインタの代用みたいなIntPtr型。

例:
CのDllでの宣言:(Kanonという構造体がある)
Kanon* MyHeroine();

C#での再宣言:
[DllImport("kanon.dll")]
private static extern IntPtr MyHeroine();



さて、ここで問題になるのがIntPtr型で受け取ったポインタから構造体の配列へどうやってアクセスするのか…。

まさかのポインタをずらしてずらしてアクセスします。
下記の例は受け取った構造体配列の長さが5の場合。

IntPtr ptr=MyHeroine();
Kanon kano = new Kanon();
for (int i = 0; i < 5; i++)
{
  kano = (Kanon)Marshal.PtrToStructure(ptr, typeof(Kanon));
  ptr = (IntPtr)((int)ptr + Marshal.SizeOf(kano));
}
MyHeroineDie(ptr);


MyHeroineDieってのは、確保したメモリーの解放関数の意味です。
つまり、明示的な解放が必要です。

注意点として、上記のようにポインタをずらしてアクセスするため、構造体の再宣言は慎重に!
例えば、構造体の配列を使わないなら、構造体内のある要素char str[5]を単にstring strと再宣言しても正常に動く。
しかし、配列を使うとなると各要素へアクセスするために構造体の大きさは正確でなければならないため、
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public string str;
と明示的にサイズを指定する必要がある。

ちなみに、C#上でのIntPtr型のメモリの確保は、Marshal.AllocCoTaskMem()。
解放は、Marshal.FreeCoTaskMem()を使う。
 
posted by ドーナツ塔 at 23:35| Comment(2) | TrackBack(0) | プログラミング関係 | このブログの読者になる | 更新情報をチェックする

2008年06月21日

C# DllImport関係のメモ

DllImportでC#内に再宣言した関数で元がポインタを受け取る場合は参照渡し(引数にrefを付ける)をすればいい。
あとは、内部で処理してくれる。

例:
Cのdll内での宣言:
int hoge(int *a,int b);

C#での再宣言:
[DllImport("hoge.dll")]
private static extern int hoge(ref int a, int b);


注意する点として、異なる型間の変換は内部で自動的に行われるが、型が正しいかのチェックはされない。
強制的に何かを渡してしまう。



構造体がdll内で宣言されている場合は下記のように再宣言すればいい。

例:
Cのdll内での宣言:
struct kanon{
 int makoto;
 unsigned short hiroine[5];
};


C#での再宣言:
[StructLayout(LayoutKind.Sequential)]
public struct kanon{
 public int makoto;
 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
 public ushort[] hiroine;
};


ここで注目すべきは、C#では構造体内に固定長配列を宣言できないのでカスタム属性を使うこと。
ウェブ上ではfixedで固定長配列を宣言するとかさまざまな解決方法らしきことが書いてありますが、自分が正常に動作するのを確認できたので上記の方法だけ。

試行錯誤して解決した後でMicrosoftにてピンポイントな例が書いてあるとこを発見。
クラス、構造体、および共用体のマーシャリング
 
posted by ドーナツ塔 at 22:07| Comment(2) | TrackBack(0) | プログラミング関係 | このブログの読者になる | 更新情報をチェックする

2008年06月14日

この想い真琴に届け! Ver.0.03

バグいっぱい見つかったので修正した。
あぅ〜っぷろ〜どボタンを連打すると、Seesaaにアクセスできなくなるから注意!
あと、自分で使ってみてフォルダ単位で追加できないのは不便なので、フォルダにも対応した。
100個くらいを一気に送ってみようとしたら、50個くらいでまた切断されちゃった…。
30分くらいで再度アクセスできるようになったけど…。
なので、一気に送れるファイルの上限も設定した。

ただSeesaaブログには上書き問題が存在するのだが、どーにもならない。
レスポンスであるUpload_idをPOSTしてやれば、ファイルの削除はできる。
しかし、Seesaa上にあるファイルリストとUpload_idを取得できない。
2つが分かれば重複ファイルを削除してからアップロードも可能なのだが…。

ちなみに「思い」から「想い」に変えますた。

SeesaaFileUploader_0.03zip(約59KB)

今後は自分で使って自分でカスタマイズだな…。
 
posted by ドーナツ塔 at 22:03| Comment(2) | TrackBack(0) | プログラミング関係 | このブログの読者になる | 更新情報をチェックする

Seesaaブログ用ファイルアップローダー この思い真琴に届け! Ver.Beta

XML-RPCとかごにょごにょしてたけど、結局CGIへ投げることになったので2日ほどかけたXML-RPC関係が無駄になってしまった…。
けど、プログラミングしている中で知らないことをたくさん学べたので無問題なんだけど…。

しかーし、やっぱりもったいないので、Seesaaブログ用のアップローダー作成しました。
1時過ぎから、真夜中の1人きりの研究室でせっせと…。
趣味プログラミングってのは実に楽しい。
やらねばならぬプログラミングは辛い。

s-seesawuploader.jpg

SeesaaFileUploader_Beta.zip(約56KB)

C#で作成してます。
Betaなので何が起こってもしらないよっ!
ココログとかは簡単に対応できそうなので、いつかする予定。
でも、ココログのアカウントゲットするのがめんどくさい。
ソースも公開する予定。

それ仕様ですよ!Q&Aコーナー!
Q:
Seesaaのファイルマネージャーに表示される名前が変なんだけど!
A:
仕様です。
ファイル名にフォルダ名までついてしまいます。
日本語の場合は、EUC-JPをバイト文字列に変換してアップしてます。
表示名はおかしいですが、ファイルパスはSeesaaのファイルマネージャーでアップした場合と同じです。
気にしちゃだめだ!

Q:
勝手にファイルが上書きされるんだけど…。
A:
仕様です。
Seesaaのファイルマネージャーでは、同名ファイルがあるとアップロードできませんが、当ソフトでは問答無用で上書きします。
大事な写真を上書きしちゃったって?
大事ならバックアップとっとけ!

Q:
リストボックスをクリックしたら、リストから消えた!
A:
ヒューマンミス誘発確実な仕様です。
ドロップしたファイルを消す場合はクリックすべし!

Q:
フォルダ内部のファイルを追加できないの?
A:
できません。
仕様です。
正直めんどくさいです。


えっ?
笑い男のソースはって?
えーとね、複数対応させようとしたら、超汚いコードがよりひどくなって…。
デバッグすればするほど、バグが発見されまして嫌になりますたっ!

さて、帰って風呂入って寝るべ。
 
posted by ドーナツ塔 at 03:27| Comment(0) | TrackBack(0) | プログラミング関係 | このブログの読者になる | 更新情報をチェックする