Windows」カテゴリーアーカイブ

C++/CLI FromHandle to Destroy

SHGetFileInfo API にてアイコン取得方法をエラそうに書いているんだけど

C++/CLI でアイコンと種類を取ってくる

てめえ…HICON を破棄してネェぞこのやろう!

という「え、ガベージコレクション仕様な言語なのにそんなもん必要?」な指摘が来た。

そういえばリソースの開放は必須だっけ、何故全自動な仕組みにしないのか解らないけど。
つか今の時代となってはメモリ使用量なんざジャブジャブでいいんじゃい。
Linux 版 Opera 11 のメモリリークっぷりを知っていると笑うところ。
って Ubuntu 10.10 のシステムモニタがおかしいの?マジで笑えないレベルだが。

ソレはいつもの Opera だし、ンナモンさえ割り切れないなら狐を使っとけ。
狐をあんまり使っていないから狐なら大丈夫かどうかは知らないけど…
んなことはどうでもよくて。

Icon.FromHandle メソッド (System.Drawing)

本当だ、FromHandle と Destroy はセットなんだね。
FromHandle 開放 でググったら即見つかった、解放と誤字している人多いな…
いや解放のほうが正しいのか?まあ破棄が一番正しいと思うけど…

しかたがないから書き換えた、Ubuntu から書き換えたので動作は試していない(ぉい!
とにかく、どこの誰かしらないけど指摘ありがとう。

IronPython 2.7

世間は震災情報に釘付け、当然私もそうであります。
私自身は愛知、親族は中国地方ばかりなので混乱はありませんでした。

そんな最中で IronPython 2.7 正式版が出たようです。
ただでさえ注目度が低い言語なのにタイミングが悪すぎる…

ironpython – Release: 2.7

どうやら 2.7 から .NET 4.0 専用になったみたい。
.NET 4.0 を導入していないと使えないので注意。

インストーラ版は一つしかないので 64bit では今回も (x86) ディレクトリに入る。

デフォルトでは 2.6 とは違う場所にインストールされた。
又しても環境変数の書き換えか、Windows はコレが面倒くさい。
2.6 が完全に残るので比較するには楽でいいのだけれど。

構成ファイルは結構違う。
chm ヘルプが同梱された、CPython に合わせたのだろうけど chm は古い…

IronPython.Wpf.dll とかは何だろう?
と思ったけど情報が見つからないのでテキトーに試した。

# -*- coding: UTF-8 -*-

import clr
import wpf # IronPython 2.7
"""
clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")"""

from System.Windows import *
w = Window()
w.Title = "Titlebar"
w.Show()
a = Application()
a.Run(w)

reference 指定が import wpf だけでよくなった、簡単になって嬉しい。
他にも何か進歩があるだろうけど今はよくわからない。

2.6 には無かった gzip モジュールが有った。
残念ながら bz2 モジュールは無いみたいだがこれで tar.gz は展開できる。

2.7 互換なので collections.OrderedDict なんかも使える。

起動速度が 10% 早くなったらしい、もう少し早くならんかったのか…
たしかに 2.6 より起動は早いけど普段使うスクリプトには少しキビシイかも。

今のところこんだけ、ニュース見なきゃ。

clipoli 1.0.0

clipoli を正式公開。
それとトップページのレイアウト変更、ついでに幾つかのアプリを公開終了をした。
vector に放置している奴も公開停止以来を、何を今ごろだが…

コンパイルしないで Blog と同じようにビルドバッチ付きソースコード配布にした。
これでイケそうだったので、一応オンラインヘルプにビルド方法は書いた。
というかソレがやりたいから作ったといっても過言ではないわけで。

アイコンは Windows 7 のデザインに合わせたつもり、XP だとカッチョワルイ。

WindowsForm を使いたくなかったのでバージョン情報はヒントウインドウで。
レイアウタという概念が無い化石 GUI なんて早くサポートを終了してください。
Forms 名前空間を使わないでトレイが使えるようにならないかな。

INI の読み直し機能を付けた、この機能以外は全部 INI でまかなう方向にした。
つまり作者サイトへのランチャも default.ini を開く機能も消せるという凄い仕様…

ソースコードに <summary> も書いた、あんまり意味ネェ。
今気がついたけどコンストラクタの param name 間違えた!次で直そう。
そういえば readme.txt を付けていない…まあいいか、ソースコード配布だし。

とりあえずこんな仕様になった、初版なんだから何だっていいや!
本日はお知らせのみ。

Clipoli 0.0.2

Clipoli で読み込む ini ファイルはどこに置くか。
exe と同じ位置では昔の古い考え方バリバリなアプリになってしまう。
やはり環境変数 %APPDATA% に置くべきだろう。

echo %APPDATA%

と cmd.exe で打てばそれが何なのか解らない人も理解できるだろう。
Opera や Firefox の設定もココにありますね。

ということで書いてみる。
C# では Environment を使わないと環境変数展開は無理みたい、まぁ ini 側はイケるだろう。
SeeMe の設定で sasakima というディレクトリを作るので同じ所に置くように。

string appdata = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "sasakima");
if (!Directory.Exists(appdata))
{
	Directory.CreateDirectory(appdata);
}
appdata = Path.Combine(appdata, "clipoli");
if (!Directory.Exists(appdata))
{
	Directory.CreateDirectory(appdata);
}
appdata = Path.Combine(appdata, "default.ini");
if (!File.Exists(appdata))
{
	string s = "[Launcher]\r\ndefault.ini を開く=notepad %APPDATA%\\sasakima\\clipoli\\default.in";
	var sw = new StreamWriter(appdata);
	sw.Write(s);
	sw.Close();
}
var app = new TrayIcon(appdata);
Application.Run();

んでコンストラクタ引数に default.ini 位置を渡してコレを読み込むと。
こんな感じでいいかな、やってみる。

Process.Start じゃ環境変数の %APPDATA% を展開してくれない…

引数を半角スペースではなく別オーバーロード引数で渡さないと駄目みたい…

Linux に慣れすぎたのでコマンドラインと GUI の区別が付かなくなってしまった。
だって Linux はどちらも同じだもん、Windows では別物なんだよね。

えっと、%APPDATA% は自前で展開するしかないみたいなので Format するか。
コマンドを引数と分離するには、とりあえずファイル名に使えない | でも利用してみよう。

string appdata = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "sasakima");
if (!Directory.Exists(appdata))
{
	Directory.CreateDirectory(appdata);
}
appdata = Path.Combine(appdata, "clipoli");
if (!Directory.Exists(appdata))
{
	Directory.CreateDirectory(appdata);
}
appdata = Path.Combine(appdata, "default.ini");
if (!File.Exists(appdata))
{
	string s = "[Launcher]\r\ndefault.ini を開く=notepad|{0}";
	s = string.Format(s, appdata);
	var sw = new StreamWriter(appdata);
	sw.Write(s);
	sw.Close();
}
var app = new TrayIcon(appdata);
Application.Run();

これで

private void on_launcher(object sender, EventArgs e)
{
	try
	{
		string s = (sender as ToolStripMenuItem).Name;// MessageBox.Show(s);
		int lPos = s.IndexOf('|');
		if (lPos == -1)
		{
			System.Diagnostics.Process.Start(s);
		}
		else
		{
			string name = s.Substring(0, lPos);
			string args = s.Substring(lPos + 1, s.Length - lPos - 1);
			System.Diagnostics.Process.Start(name, args);
		}
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

と分離して Process.Start する、意外に面倒な処理になっちまったなぁ。
後は多重起動防止させて、えっとそれから…
あぁアイコンを作る時間も無かった、つか十二時過ぎた、とりあえずバックアップ。

clipoli002.zip

今日は日経平均株価は上がってくれるだろうか…
木金で今月の稼ぎが吹っ飛んでもーたんだが…