詳細を書くのはちょっとはばかられるので、細々は書きませんが、久しぶりに手痛いミスを犯してしまいました。まさに痛恨の一撃。プライベートな話でお仕事やら会社の事業には関係ない話なのが救いですが、かなりの痛手となっております。
というわけで、絶賛落ち込み中。しばらくはこの状態が続きそうなので、そっとしておいてください...。
タイトルのとおり、iPhone 4S を買いました。今回は、思ったよりしょぼそうな感じだったので、どうしようか悩んだんですが、iPhone 4 の動作が微妙にもっさりしてるような気がしてきたので、『それなら速いだけでもいいじゃん』と。
iPhone の使い方を振り返ってみると、別に au 版でもよさげな感じだったんですが、いろいろ考えた末にまたまた SIM フリー版です。Xi ( クロッシィ ) でお安く契約ができる! なんて噂もちらほら聞こえてきますが、とりあえずはデータ通信定額プランがまだしばらく残っているので、引き続きそっちで。
音楽を移して、メールアドレスを設定して、などなど、ちょっと時間はかかりましたが、移行作業完了です。あ。Siri をちょっと使ってみましたが、やはり発音がだめだめで、全然聞き取ってくれませんでした...。日本語版を待つことにします。
変な思い込みというのはずっと続くもので、Windows ではまっとうな方法で親プロセスの情報が取得できないものだと思ってました。が、よくよく調べてみると、PROCESSENTRY32 structure に th32ParentProcessID というのが。これでさくっと取れるみたいです ( 未検証 )。
ま、取れたからといって、親を殺せば子供も死ぬ、とかってことがあるわけでもなく、さほど意味のある情報ではないんですけど。
ともあれ、反省の意味も込めて、親プロセスの取得を試してみました。Tool Help 系でもいいんですが、こういうときは NtQueryInformationProcess() 関数ということで。NtQueryInformationProcess function のリファレンスでは、PROCESS_BASIC_INFORMATION 構造体の Reserved3 となっているメンバー、これ、親プロセスの ID を示す値が入っているそうです。
ということで、宣言はこんな感じで。
[DllImport("ntdll.dll")] private static extern int NtQueryInformationProcess( IntPtr processHandle, int processInformationClass, ref PROCESS_BASIC_INFORMATION processInformation, int processInformationLength, out int returnLength); [StructLayout(LayoutKind.Sequential)] private struct PROCESS_BASIC_INFORMATION { public IntPtr Reserved1; public IntPtr PebBaseAddress; public IntPtr Reserved2_0; public IntPtr Reserved2_1; public IntPtr UniqueProcessId; public IntPtr InheritedFromUniqueProcessId; } private const int ProcessBasicInformation = 0;
呼び出しはこんな感じで、Visual Studio で実行しているときは『devenv.exe』が、アプリケーションをダブルクリックして実行したときは『explorer.exe』がそれぞれ取得できます。
IntPtr hCurrent; PROCESS_BASIC_INFORMATION pbi; int returnLength; int pid; string fileName; int result; pbi = new PROCESS_BASIC_INFORMATION(); hCurrent = Process.GetCurrentProcess().Handle; result = NtQueryInformationProcess( hCurrent, ProcessBasicInformation, ref pbi, Marshal.SizeOf(pbi), out returnLength); pid = pbi.InheritedFromUniqueProcessId.ToInt32(); fileName = Process.GetProcessById(pid).Modules[0].FileName; MessageBox.Show(fileName);