Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!
-
最近の投稿
最近のコメント
[Vista] GeForceとブルースクリーン に OS変えた。えらく疲れた。… より [Excel] 時系列データのグラフ に girlab より アーカイブ
カテゴリー
メタ情報
Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!
Windows Live Messangerをインストールしようとしてエラーになりました。エラー番号などは出ませんでした。プロキシの設定を変更して直りました。Windows Liveのインストーラから本体をダウンロードするのですが、プロキシの設定が違うとダウンロードできないため、エラーになるようです。
インストーラが見ているプロキシはIEの設定ではなく、proxycfgというコマンドで設定します。これはWindows Updateも同じです。そのためproxycfgの設定を変更するときは一旦Windows Update Automatic Updates Service(wuauserv)を止める必要があります。proxycfgをIEの設定に合わせるにはコマンドプロンプトで以下のように入力します。
net stop wuauserv proxycfg -u net start wuauserv |
プロキシの設定が変わったときにこれを行わないと、Windows Updateも正常動作しなくなります。
Windows Mobileアプリケーションをクロス開発するためクロスコンパイラを準備しました。Interix用の手順はpmgrで追加パッケージにしました。ただしCeGCCそのものではないため問題があります。(後述)
実はパッケージ自体は3ヶ月くらい前にx64のクロスコンパイラと同時にできていたのですが、問題があったため公開していませんでした。
binutilsやgccにパッチを当てずにどこまで出来るか確認したかったため、CeGCCのパッチを当てずにオリジナルを使用しています。CeGCCからはヘッダとライブラリだけを持って来ていますが、CRTが使えません。(後述)
ソースをCeGCCのSVNから取得すれば良いというのは分かっていたのですが、Windows Mobile開発の必要に迫られていなかったため放置していました。しかしARMの実験にはこのままでも使えるようなので、とりあえず公開することにしました。
あくまでARMの実験用で、実用には不向きです。いずれCeGCCにきちんと対応したものを作り直す予定です。
以下のような問題があります。
これらの問題を回避して使う方法は以下の通りです。
次のソースをtest.cとして用意します。
#include <windows.h> void winmain() { MessageBox(0, L"HELLO", L"WORLD", MB_OK); } |
以下のようにするとtest.exeが出力されます。WILLCOM 03での動作を確認しました。
% arm-wince-pe-gcc -o test.exe -e winmain -DUNICODE -DARM -fno-leading-underscore test.c -nostdlib -lcoredll
正直、これでは既存のアプリケーションをコンパイルするのは厳しいです。やはりCeGCCでないと実用にはならないようです。
InterixでPHPのパッケージを作成しました。以下に追加パッケージとして置いておきます。今回からパッケージのファイル名にバージョンと作成日を入れることにしました。
libtoolでハマったので参考までに書いておきます。
libxml2をインストールします。ライブラリのパスが標準外のため、xml2-config –libsでrpath(-Wl,-R)を返すように細工しておきます。
% xml2-config --libs -L/opt/pmgr/lib -Wl,-R/opt/pmgr/lib -lxml2 -lpthread -lm |
PHPをconfigureします。
./configure --prefix=/opt/pmgr |
libxml2が見付からないとエラーになったので、libxml2の場所を指示します。
./configure --prefix=/opt/pmgr --with-libxml-dir=/opt/pmgr |
configureは成功しますが、コンパイル中にL_ctermidが見付からないとエラーになります。Interixでは_ALL_SOURCEマクロを付けないとlibcが制限されてしまいます。そのためconfigureをやり直します。Interixではよくあることです。
CFLAGS=-D_ALL_SOURCE ./configure --prefix=/opt/pmgr --with-libxml-dir=/opt/pmgr |
これでコンパイルは通りました。しかしphpが起動しません。
php: error in loading shared libraries libxml2.so.2: cannot open shared object file: No such file or directory |
先ほどxml2-configに付け足したrpathの指定が効いていないようです。libtoolが共有ライブラリを認識しないため、gccにrpathを渡していないようです。libtool周りの問題はconfig.subとconfig.guessを差し替えれば直ることが多いのですが、phpではうまくいきません。
configureを見ると、OS別に分岐する箇所があって、それがlibtoolに反映されていました。そのためInterixの処理を付け足しました。これでようやくphpが起動するようになりました。パッチは冒頭のパッケージに入れてありますので、具体的な修正内容はそちらを参照してください。
gccでWindows x64の開発ができるようになりました。PE32+関連はbinutils-2.18やgcc-4.3に取り込まれているため、パッチなどは特に必要ないようです。
32bitのInterixから使用するクロスコンパイラのパッケージを作ってみました。(注:64bit SUAのセルフコンパイラではありません)
これでPE32+やx64バイナリの調査・実験が便利になりそうです。
Windows XP以降でパーティションのマウント先やARC名などを表示するツールをC#で作成しました。以下にソースを置いておきます。
マウント先をkernel32.dll内の以下の関数で取得しています。ドライブやパーティションの情報は NT Object Manager から取得しているため、FindFirstVolume()等のWin32APIは使用していません。
P/Invokeで呼び出している部分を抜粋します。
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern bool GetVolumePathNamesForVolumeName( string lpszVolumeName, char[] lpszVolumePathNames, int cchBuferLength, out int lpcchReturnLength); public static string[] GetVolumePathNames(string volume) { int len; GetVolumePathNamesForVolumeName(volume, null, 0, out len); var buf = new char[len]; if (!GetVolumePathNamesForVolumeName(volume, buf, buf.Length, out len)) return null; var list = new List<string>(); foreach (string s in new string(buf).Split('')) if (!string.IsNullOrEmpty(s)) list.Add(s); return list.ToArray(); } |
ボリューム名(例: "\?Volume{GUID}")を渡すとマウント先が返って来ます。
このAPIを使わずにWindows 2000にも対応させるにはやや複雑な手順が必要です。得られる情報が逆のため、集計して抽出することになります。
今回はWindows 2000に対応していない.NET Framework 3.5を使用しているため、APIでの対応も見送りました。
Windowsカーネル内でデバイスなどはNT Object Managerによって管理されています。WinObjというアプリケーションで表示することができます。C#で似たようなものを作ってみました。以下にソースを置いておきます。
カーネルオブジェクトを取得には、ntdll.dll内の以下の関数を使用します。
オブジェクトはファイルとして開くことができます。ファイル名の対応は以下の通りです。ただし.NETのライブラリ(System.IO.FileStream等)では使えないため、Win32API(CreateFile等)を使用する必要があります。
オブジェクトやシンボリックリンクを取得する部分の抜粋です。
private KernelObject[] GetObjects() { if (!IsDirectory) return null; var list = new List<KernelObject>(); SafeFileHandle h; var attr = new OBJECT_ATTRIBUTES(FullName, 0); var st = NtOpenDirectoryObject( out h, ACCESS_MASK.DIRECTORY_QUERY, ref attr); if (st < 0) return null; var bufsz = 1024; var buf = Marshal.AllocHGlobal(bufsz); uint context = 0, len; for (; ; ) { st = NtQueryDirectoryObject(h, buf, bufsz, true, context == 0, ref context, out len); if (st < 0) break; var odi = (OBJECT_DIRECTORY_INFORMATION) Marshal.PtrToStructure(buf, typeof(OBJECT_DIRECTORY_INFORMATION)); list.Add(new KernelObject(this, odi)); } Marshal.FreeHGlobal(buf); h.Dispose(); var ret = list.ToArray(); Array.Sort(ret, (a, b) => a.Name.CompareTo(b.Name)); return ret; } private string GetLink() { if (!IsSymbolicLink) return null; SafeFileHandle h; var attr = new OBJECT_ATTRIBUTES(FullName, 0); var st = NtOpenSymbolicLinkObject( out h, ACCESS_MASK.GENERIC_READ, ref attr); if (st < 0) return null; int len; var buf = new UNICODE_STRING(new string(' ', 512)); st = NtQuerySymbolicLinkObject(h, ref buf, out len); h.Dispose(); if (st < 0) return null; return buf.ToString(); } |
P/Invokeの定義は長くなるため省略します。ソースを参照してください。
Windows Live WriterでLLPのソースを挿入するためのプラグインを作りました。自分以外の人には使い道がないと思いますが、プラグイン作成の参考になるかもしれないので、ソースコードを置いておきます。
生成されるHTMLはCSSを使わない決め打ちのため、汎用性は低いです。
struct Test { int x, y; function Show() { printfln("x = %d, y = %d", x, y); } } Test t = { 1, 2 }; t.Show(); |
富士通のノートパソコン(Vista)でマウスのホイールをクリックすると虫眼鏡が出て、アプリケーション本来の機能が使えなくて困りました。プレインストールされているSetPointというソフトをアンインストールすると出なくなりました。
検索すると同様の質問が出てきますが、回答者が富士通の環境を持っていないと分からない事情のため、原因究明が難航しているようです。そのためこの記事を書きました。
富士通のサポート情報は以下の通りです。