<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>digital matter &#187; C#</title>
	<atom:link href="http://blog.loadlimits.info/category/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.loadlimits.info</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Tue, 22 Jun 2010 10:46:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Encoding.GetString(Byte[])はSilverlightで使えない</title>
		<link>http://blog.loadlimits.info/2010/01/encoding-getstringbyte%e3%81%afsilverlight%e3%81%a7%e4%bd%bf%e3%81%88%e3%81%aa%e3%81%84/</link>
		<comments>http://blog.loadlimits.info/2010/01/encoding-getstringbyte%e3%81%afsilverlight%e3%81%a7%e4%bd%bf%e3%81%88%e3%81%aa%e3%81%84/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 12:53:23 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2010/01/encoding-getstringbyte%e3%81%afsilverlight%e3%81%a7%e4%bd%bf%e3%81%88%e3%81%aa%e3%81%84/</guid>
		<description><![CDATA[今日のびっくり。
&#8216;System.Text.Encoding.GetString(byte[])&#8217; はアクセスできない保護レベルになっています。


Encoding.UTF8.GetString(data);

こんなコードを書くとビルド時エラーになります。
なぜか、Encoding.GetString(Byte[], Int32, Int32)は使えます。

Encoding.UTF8.GetString(data, 0, data.Length);

こうしておけばOK。何だろう、この仕様。

Encoding.GetString メソッド (Byte[]) (System.Text)
Encoding.GetString メソッド (Byte[], Int32, Int32) (System.Text)

]]></description>
			<content:encoded><![CDATA[<p>今日のびっくり。</p>
<blockquote><p>&#8216;System.Text.Encoding.GetString(byte[])&#8217; はアクセスできない保護レベルになっています。</p>
</blockquote>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>Encoding.UTF8.GetString(data);</pre>
</div>
<p>こんなコードを書くとビルド時エラーになります。</p>
<p>なぜか、Encoding.GetString(Byte[], Int32, Int32)は使えます。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>Encoding.UTF8.GetString(data, 0, data.Length);</pre>
</div>
<p>こうしておけばOK。何だろう、この仕様。</p>
<ul>
<li><a href="http://msdn.microsoft.com/ja-jp/library/744y86tc.aspx" target="_blank">Encoding.GetString メソッド (Byte[]) (System.Text)</a></li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/05cts4c3.aspx" target="_blank">Encoding.GetString メソッド (Byte[], Int32, Int32) (System.Text)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2010/01/encoding-getstringbyte%e3%81%afsilverlight%e3%81%a7%e4%bd%bf%e3%81%88%e3%81%aa%e3%81%84/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>今日の微妙エラー</title>
		<link>http://blog.loadlimits.info/2010/01/%e4%bb%8a%e6%97%a5%e3%81%ae%e5%be%ae%e5%a6%99%e3%82%a8%e3%83%a9%e3%83%bc/</link>
		<comments>http://blog.loadlimits.info/2010/01/%e4%bb%8a%e6%97%a5%e3%81%ae%e5%be%ae%e5%a6%99%e3%82%a8%e3%83%a9%e3%83%bc/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 07:52:06 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2010/01/%e4%bb%8a%e6%97%a5%e3%81%ae%e5%be%ae%e5%a6%99%e3%82%a8%e3%83%a9%e3%83%bc/</guid>
		<description><![CDATA[コントロールはひとつの case ラベル (&#8216;default:&#8217;) から別のラベルへ流れ落ちることはできません。


switch (message)
{
    case "hoge":
        funcA();
        break;
    default:
        funcB();
        break; // これがないとエラー
}


他の言語のクセでbreak書かなかったら起きた。
「フォールスルー」ってことなんですね。
ちなみにcaseのあとのブロックにコードを書かなければフォールスルーはできるという話。
]]></description>
			<content:encoded><![CDATA[<blockquote><p>コントロールはひとつの case ラベル (&#8216;default:&#8217;) から別のラベルへ流れ落ちることはできません。</p>
</blockquote>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>switch (message)
{
    case "hoge":
        funcA();
        break;
    default:
        funcB();
        break; // これがないとエラー
}
</pre>
</div>
<p>他の言語のクセでbreak書かなかったら起きた。</p>
<p>「フォールスルー」ってことなんですね。</p>
<p>ちなみにcaseのあとのブロックにコードを書かなければフォールスルーはできるという話。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2010/01/%e4%bb%8a%e6%97%a5%e3%81%ae%e5%be%ae%e5%a6%99%e3%82%a8%e3%83%a9%e3%83%bc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windowsフォームへの、やたら簡単なSilverlightホスティング方法</title>
		<link>http://blog.loadlimits.info/2010/01/windows%e3%83%95%e3%82%a9%e3%83%bc%e3%83%a0%e3%81%b8%e3%81%ae%e3%80%81%e3%82%84%e3%81%9f%e3%82%89%e7%b0%a1%e5%8d%98%e3%81%aasilverlight%e3%83%9b%e3%82%b9%e3%83%86%e3%82%a3%e3%83%b3%e3%82%b0%e6%96%b9/</link>
		<comments>http://blog.loadlimits.info/2010/01/windows%e3%83%95%e3%82%a9%e3%83%bc%e3%83%a0%e3%81%b8%e3%81%ae%e3%80%81%e3%82%84%e3%81%9f%e3%82%89%e7%b0%a1%e5%8d%98%e3%81%aasilverlight%e3%83%9b%e3%82%b9%e3%83%86%e3%82%a3%e3%83%b3%e3%82%b0%e6%96%b9/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 01:44:59 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2010/01/windows%e3%83%95%e3%82%a9%e3%83%bc%e3%83%a0%e3%81%b8%e3%81%ae%e3%80%81%e3%82%84%e3%81%9f%e3%82%89%e7%b0%a1%e5%8d%98%e3%81%aasilverlight%e3%83%9b%e3%82%b9%e3%83%86%e3%82%a3%e3%83%b3%e3%82%b0%e6%96%b9/</guid>
		<description><![CDATA[
VisualStudioでフォームをひとつ作ります。
WebBrowserコントロールを配置します。
フォームのLoadイベントに以下を記述。


        private void Form1_Load(object sender, EventArgs e)
        {
            string html = @"&#60;!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd""&#62;
&#60;!-- saved from url=(0014)about:internet --&#62;

&#60;html xmlns=""http://www.w3.org/1999/xhtml"" &#62;
 &#60;head&#62;
  &#60;title&#62;Test&#60;/title&#62;

  &#60;script [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>VisualStudioでフォームをひとつ作ります。</li>
<li>WebBrowserコントロールを配置します。</li>
<li>フォームのLoadイベントに以下を記述。</li>
</ol>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>        private void Form1_Load(object sender, EventArgs e)
        {
            string html = @"&lt;!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd""&gt;
&lt;!-- saved from url=(0014)about:internet --&gt;

&lt;html xmlns=""http://www.w3.org/1999/xhtml"" &gt;
 &lt;head&gt;
  &lt;title&gt;Test&lt;/title&gt;

  &lt;script type=""text/xaml"" id=""testXaml""&gt;
&lt;?xml version=""1.0""?&gt;
&lt;Canvas xmlns=""http://schemas.microsoft.com/client/2007""&gt;
 &lt;Ellipse Fill=""Pink"" Width=""200"" Height=""100"" Canvas.Left=""40"" Canvas.Top=""30"" /&gt;
 &lt;Rectangle Fill=""Orange"" Width=""100"" Height=""160"" Canvas.Left=""150"" Canvas.Top=""50"" /&gt;
 &lt;TextBlock Text=""This is text on Silverlight"" Canvas.Left=""10"" Canvas.Top=""150""&gt;
  &lt;TextBlock.RenderTransform&gt;
   &lt;RotateTransform Angle=""-30"" /&gt;
  &lt;/TextBlock.RenderTransform&gt;
 &lt;/TextBlock&gt;
&lt;/Canvas&gt;
  &lt;/script&gt;
 &lt;/head&gt;

 &lt;body&gt;
   &lt;object type=""application/x-silverlight-2"" width=""800"" height=""600""&gt;
   &lt;param name=""source"" value=""#testXaml""/&gt;
  &lt;/object&gt;
 &lt;/body&gt;
&lt;/html&gt;";
            if (webBrowser1.Document == null)
            {
                webBrowser1.Navigate("about:blank");
            }
            webBrowser1.Document.OpenNew(true);
            webBrowser1.Document.Write(html);
        }
</pre>
</div>
<p>結果</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2010/01/20100127103949.png"><img style="border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px" border="0" alt="20100127103949" src="http://blog.loadlimits.info/wp-content/uploads/2010/01/20100127103949_thumb.png" width="247" height="244" /></a></p>
<p>XAMLソースはこちらから拝借。<br />
  <br /><a href="http://journal.mycom.co.jp/column/silverlight/016/index.html" target="_blank">【コラム】The Silverlight Times (16) 覚えておきたい「インラインXAML」 | ネット | マイコミジャーナル</a></p>
<p>WebBrowserの使い方はこちらを参考にしました。<br />
  <br /><a href="http://www.atmarkit.co.jp/fdotnet/dotnettips/773wbdocwrite/wbdocwrite.html" target="_blank">WebBrowserコントロールのコンテンツを文字列により設定するには？［2.0、C#、VB］ － ＠IT</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2010/01/windows%e3%83%95%e3%82%a9%e3%83%bc%e3%83%a0%e3%81%b8%e3%81%ae%e3%80%81%e3%82%84%e3%81%9f%e3%82%89%e7%b0%a1%e5%8d%98%e3%81%aasilverlight%e3%83%9b%e3%82%b9%e3%83%86%e3%82%a3%e3%83%b3%e3%82%b0%e6%96%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>実はFiddlerがすごすぎたので、機能まとめ紹介</title>
		<link>http://blog.loadlimits.info/2009/09/%e5%ae%9f%e3%81%affiddler%e3%81%8c%e3%81%99%e3%81%94%e3%81%99%e3%81%8e%e3%81%9f%e3%81%ae%e3%81%a7%e3%80%81%e6%a9%9f%e8%83%bd%e3%81%be%e3%81%a8%e3%82%81%e7%b4%b9%e4%bb%8b/</link>
		<comments>http://blog.loadlimits.info/2009/09/%e5%ae%9f%e3%81%affiddler%e3%81%8c%e3%81%99%e3%81%94%e3%81%99%e3%81%8e%e3%81%9f%e3%81%ae%e3%81%a7%e3%80%81%e6%a9%9f%e8%83%bd%e3%81%be%e3%81%a8%e3%82%81%e7%b4%b9%e4%bb%8b/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 14:29:54 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Fiddler]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[ツール]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2009/09/%e5%ae%9f%e3%81%affiddler%e3%81%8c%e3%81%99%e3%81%94%e3%81%99%e3%81%8e%e3%81%9f%e3%81%ae%e3%81%a7%e3%80%81%e6%a9%9f%e8%83%bd%e3%81%be%e3%81%a8%e3%82%81%e7%b4%b9%e4%bb%8b/</guid>
		<description><![CDATA[今までFiddlerをただのセッションの中身を確認できるLocal Proxyとしてしか見ていなかったのですが    改めて良く調べると色々できることが多すぎると判明。感動したので便利な機能をまとめてみました。
先に簡単に説明しておくと、FiddlerはMicrosoftが無料で配布しているWeb Debugging Proxyです。
Windows環境にインストールして、ブラウザとサーバの間の通信を読んだり操作したりできます。
配布サイトはこちら。
Fiddler Web Debugger &#8211; A free web debugging tool
動作環境は「Windows 2000 / XP / 2003 / Vista with Microsoft .NET Framework v2.0 or later」
今回使ったバージョンは、2009年9月10日時点で最新の安定版、2.2.4.6。
とりあえず簡単に目次。

セッションのリクエスト一覧を確認する 
やり取りしているヘッダ情報を見る 
リクエスト・レスポンスの実際のデータの中身を確認する 
セッション一覧表示をフィルタリングして、特定のContent-Typeだけ表示するようにする 
リクエストを自分で作る 
AutoResponderで特定のURLに対して、ローカルのファイルを割り当てる 
Fiddler起動時にProxyを自動的に切り替える 
Webページに対する一連の自動テストを実行する 
サンドボックス 
JScript.NETで拡張できる 
C#やVB.NETで拡張できる 
UIに好きな項目を追加できる 
ブレークポイントの設定 

マークアップエンジニアにおすすめしたいのは

セッション一覧表示をフィルタリングして、特定のContent-Typeだけ表示するようにする 
AutoResponderで特定のURLに対して、ローカルのファイルを割り当てる 

あたり。
プログラマには全部おすすめ。
詳細は「続き」からどうぞ。
 
セッションのリクエスト一覧を確認する
 
アクセスしたデータが左カラムのリストにステータスコードやURLとともにリアルタイムで表示されます。このリストは色々な操作で使用します。
やり取りしているヘッダ情報を見る
 
サーバとの間でやり取りされたセッションごとのヘッダ情報を見ることができます。ここでAjaxやFlashから送信したリクエストがちゃんとデータを返してきているかとかContent-Typeは正しいかとか、調べることができますね。右側のカラムでInspectorsのHeadersを選べばOKです。上側がクライアントがサーバに送ったリクエスト、下がサーバからのレスポンスです。
リクエスト・レスポンスの実際のデータの中身を確認する
 
右カラムのタブでTextViewを選択すると、そのセッションのBody部分のテキストを読むことができます。WebページならHTMLが見られたりするわけですね。
ここで、さらに右下にある「View in Notepad」ボタンを押すと、テキストをWindowsのメモ帳で表示できます。それだけではあまり使い道が少ないですが、その隣の「&#8230;」をクリックすると、Bodyを好きなプログラムを指定して開けるようになります。
ブラウザを指定すれば、Webページとして表示できます。例えば、フォームからPOSTした結果のページを、あとで見直したい場合にも使えますね。
セッション一覧表示をフィルタリングして、特定のContent-Typeだけ表示するようにする
 
HTMLのやり取りを見たいのに、大量の画像でリストが押し流されてしまうのを防げます。
 
右カラムのFilterタブを選択して、Use Filtersにチェック、さまざまなフィルタを設定できますが、例えば「Response Type [...]]]></description>
			<content:encoded><![CDATA[<p>今までFiddlerをただのセッションの中身を確認できるLocal Proxyとしてしか見ていなかったのですが    <br />改めて良く調べると色々できることが多すぎると判明。感動したので便利な機能をまとめてみました。</p>
<p>先に簡単に説明しておくと、FiddlerはMicrosoftが無料で配布しているWeb Debugging Proxyです。</p>
<p>Windows環境にインストールして、ブラウザとサーバの間の通信を読んだり操作したりできます。</p>
<p>配布サイトはこちら。</p>
<p><a href="http://www.fiddler2.com/fiddler2/" target="_blank">Fiddler Web Debugger &#8211; A free web debugging tool</a></p>
<p>動作環境は「Windows 2000 / XP / 2003 / Vista with Microsoft .NET Framework<b> v2.0</b> or later」</p>
<p>今回使ったバージョンは、2009年9月10日時点で最新の安定版、2.2.4.6。</p>
<p>とりあえず簡単に目次。</p>
<ul>
<li>セッションのリクエスト一覧を確認する </li>
<li>やり取りしているヘッダ情報を見る </li>
<li>リクエスト・レスポンスの実際のデータの中身を確認する </li>
<li>セッション一覧表示をフィルタリングして、特定のContent-Typeだけ表示するようにする </li>
<li>リクエストを自分で作る </li>
<li>AutoResponderで特定のURLに対して、ローカルのファイルを割り当てる </li>
<li>Fiddler起動時にProxyを自動的に切り替える </li>
<li>Webページに対する一連の自動テストを実行する </li>
<li>サンドボックス </li>
<li>JScript.NETで拡張できる </li>
<li>C#やVB.NETで拡張できる </li>
<li>UIに好きな項目を追加できる </li>
<li>ブレークポイントの設定 </li>
</ul>
<p>マークアップエンジニアにおすすめしたいのは</p>
<ul>
<li>セッション一覧表示をフィルタリングして、特定のContent-Typeだけ表示するようにする </li>
<li>AutoResponderで特定のURLに対して、ローカルのファイルを割り当てる </li>
</ul>
<p>あたり。</p>
<p>プログラマには全部おすすめ。</p>
<p>詳細は「続き」からどうぞ。</p>
<p> <span id="more-209"></span><br />
<h2>セッションのリクエスト一覧を確認する</h2>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image16.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb16.png" width="480" height="302" /></a> </p>
<p>アクセスしたデータが左カラムのリストにステータスコードやURLとともにリアルタイムで表示されます。このリストは色々な操作で使用します。</p>
<h2>やり取りしているヘッダ情報を見る</h2>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image17.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb17.png" width="480" height="302" /></a> </p>
<p>サーバとの間でやり取りされたセッションごとのヘッダ情報を見ることができます。ここでAjaxやFlashから送信したリクエストがちゃんとデータを返してきているかとかContent-Typeは正しいかとか、調べることができますね。右側のカラムでInspectorsのHeadersを選べばOKです。上側がクライアントがサーバに送ったリクエスト、下がサーバからのレスポンスです。</p>
<h2>リクエスト・レスポンスの実際のデータの中身を確認する</h2>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image18.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb18.png" width="480" height="302" /></a> </p>
<p>右カラムのタブでTextViewを選択すると、そのセッションのBody部分のテキストを読むことができます。WebページならHTMLが見られたりするわけですね。</p>
<p>ここで、さらに右下にある「View in Notepad」ボタンを押すと、テキストをWindowsのメモ帳で表示できます。それだけではあまり使い道が少ないですが、その隣の「&#8230;」をクリックすると、Bodyを好きなプログラムを指定して開けるようになります。</p>
<p>ブラウザを指定すれば、Webページとして表示できます。例えば、フォームからPOSTした結果のページを、あとで見直したい場合にも使えますね。</p>
<h2>セッション一覧表示をフィルタリングして、特定のContent-Typeだけ表示するようにする</h2>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image19.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb19.png" width="480" height="302" /></a> </p>
<p>HTMLのやり取りを見たいのに、大量の画像でリストが押し流されてしまうのを防げます。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image20.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb20.png" width="480" height="302" /></a> </p>
<p>右カラムのFilterタブを選択して、Use Filtersにチェック、さまざまなフィルタを設定できますが、例えば「Response Type and Size」で「Hide IMAGE/*」を選択すれば、画像ファイルがリストに表示されなくなります。表示されなくなるだけで、通信はできます。</p>
<p>このフィルタはかなり高機能です。</p>
<ul>
<li>特定のHostの通信だけを表示・非表示にする、もしくはフラグをつける機能。 </li>
<li>特定のプロセスからの通信のみを表示する機能。これは例えばChromeのこのタブからの通信だけを表示、ということができます。 </li>
<li>同様にIEからの通信だけ表示、Windows RSS platformからの通信だけ非表示、ということもできます。 </li>
<li>特定のステータスコードだけを非表示にする機能。300系のレスポンスは表示しない、とか。 </li>
<li>一定のサイズ以上・以下のファイル、スクリプト・画像・SWF・CSSをそれぞれ通信ブロックしてくれる機能。画像ブロックすると、Googleもこんな感じでさらにすっきり。      <br /><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image21.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb21.png" width="351" height="320" /></a> </li>
<li>ヘッダ情報を追加したり削除したりも、このフィルタで可能です。 </li>
<li>ブレークポイントの指定（これは後述） </li>
</ul>
<p>メニューのRulesでも、いくつかのフィルタを簡単にON/OFFできます。</p>
<h2>リクエストを自分で作る</h2>
<p>サーバに送信するリクエストを自分で組み立てることができます。右カラムのRequest Builderがそれです。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image22.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb22.png" width="480" height="302" /></a> </p>
<p>リクエストメソッドを選択して、URLと送りたいヘッダを書いて、右上のExecuteボタンを押せばOKです。サーバにそのリクエストが送信されます。HTTPのバージョンも選べます。HTTP/2.0も対応という。2.0て。</p>
<p>AjaxやFlashの、サーバとの通信テストで便利なのがここです。パラメータをちょっと修正してExecuteを押すだけで、サーバのAPIから取れるデータが、想定通りのものかテストできます。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image23.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb23.png" width="480" height="302" /></a> </p>
<p>もちろんチマチマとヘッダを書くのは面倒なので、リストから右カラムにセッションをドラッグアンドドロップするだけで、簡単にそのセッションの複製ができます。一度ブラウザから送ったセッションなら、あとから同じ内容でも、修正を加えてPOSTでも、自由にできます。</p>
<p>ここから送ったものは当然ブラウザには反映されませんが、結果ページを見たいなら、Request Builderで送って、レスポンスをInspectorsからブラウザを使って開く、ということもできますね。InspectorsにはXMLや画像のビューアもあるので、組み合わせれば大抵のものは表示できます。</p>
<h2>AutoResponderで特定のURLに対して、ローカルのファイルを割り当てる</h2>
<p>Webデザイナやマークアップエンジニアの方々におすすめしたい機能です。特定のURLへのアクセスを、自分のローカルPC上にあるファイルに置き換えることができます。</p>
<p>つまり、サーバ上にわざわざCSSファイルをアップロードしなくても、CSS変更程度の確認ならローカル作業だけで済むということですね。周りにもCSSをレポジトリにコミット→開発環境に自動反映されるのを待つ→確認→間違ってたら繰り返しという作業をしている人たちがいるので。</p>
<p>APIのレスポンスとしても使えると思います。開発環境で本番と同じレスポンスを返してほしい、とか。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image24.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb24.png" width="480" height="302" /></a></p>
<p>例えば、上記のようにTwitterのプロフィール画像に対してローカルに置いたファイルへの置き換えルールを書きます。そうすると、</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image25.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb25.png" width="351" height="320" /></a> </p>
<p>↓</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image26.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb26.png" width="351" height="320" /></a></p>
<p>というように置き換えられます。</p>
<p>JPEG画像をリクエストしても、置き換えがPNGなら、ちゃんとContent-Typeはimage/pngで返してくれます。</p>
<p>Proxomitronも使ってましたが、目的のセッションをリストから選択してAddボタン一発で登録できるのが便利ですね。セッションリストからドラッグアンドドロップすると、複数のルールを一気に追加できます。</p>
<p>Rule Editorでは正規表現も指定できるのですが、置き換える先のファイルは正規表現を使えないので、複数ファイル→単一のファイルに置き換えることはできますが、複数ファイル→複数ファイルに置き換えることはできません。これはちょっと残念ですね。フォルダ以下を一括でローカルのチェックアウトしたファイルに置き換えとかできれば最高だったのですが。</p>
<p>さっきのリストを正規表現で書き換えてみるとこんな感じです。画像ではあまり実用的ではないですが、CSSの編集には威力を発揮すると思います。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image27.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb27.png" width="480" height="302" /></a> </p>
<p>ちなみにリストのマッチ順序は+/-で変更できます。</p>
<h2>Fiddler起動時にProxyを自動的に切り替える</h2>
<p>WinINETのProxyを起動時に書き換えてくれるので、起動するだけでIEではFiddler経由のアクセスになります。同じくWinINETを使っているChromeも同様。以下はFiddler起動時に自動的に書き換えられたプロキシの設定画面。もちろんFiddlerを終了したときに自動でもとに戻ります。Fiddlerが使うポートはFiddlerのメニューからTools→Fiddler Optionsで変更可能。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image28.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb28.png" width="373" height="320" /></a> </p>
<p>FireFoxはWinINETを使っていないのですが、Fiddlerの有効・無効を簡単に切り替えられるAddOnがFiddlerと一緒にインストールされます。しかもそのAddOnがFiddlerの起動に連動して有効・無効を切り替えてくれるので、FireFoxでも便利にFiddlerライフが送れます。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image29.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb29.png" width="442" height="320" /></a> </p>
<h2>Webページに対する一連の自動テストを実行する</h2>
<p>なんとテストもできます。</p>
<p>コマンドプロンプトから諸々を操作できるExecAction.exeというファイルが用意されています。バッチファイルから一連のテストを実行したりする場合に便利。動作自体は、スクリプトや拡張に書くことができます。スクリプトや拡張に関しては後述。</p>
<p>WebのAPIに対するテストなんかもこれでできますね。</p>
<h2>サンドボックス</h2>
<p>Fiddlerの機能というわけではないかもしれませんが、FiddlerのサイトにHTTP Sandboxが用意されています。ショッピングカートやアップローダなどが用意されていて、自由にFiddlerの機能を試すことができます。</p>
<p>FiddlerのメニューのTools→Sandboxから行けます。</p>
<h2>JScript.NETで拡張できる</h2>
<p>Fiddler起動時や、リクエストに対する応答など、各種イベントへの挙動をJScript.NETで記述することができます。まぁほぼJavaScript的なもので書けるってことです。</p>
<p>FiddlerのメニューのRules→Customize Rulesを実行すると、メモ帳が開いてカスタムルールの編集が行えます。メモ帳以外のエディタを使いたい場合はメニューのTools→Fiddler Options→ExtensionsからEditorの欄に、使いたいエディタのプログラムを指定すればOKです。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image30.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb30.png" width="442" height="320" /></a> </p>
<p>エディタ上で保存すればすぐに反映されます。</p>
<p>スクリプトの書き方は下記参照。クックブックもすごい充実。</p>
<p><a href="http://www.fiddler2.com/fiddler/dev/scriptsamples.asp" target="_blank">Fiddler Web Debugger &#8211; Script Samples</a></p>
<h2>C#やVB.NETで拡張できる</h2>
<p>.NETでDLLを作成することでも拡張を作成できます。複雑な機能をプラグインとして配布したい場合に便利です。</p>
<p>スクリプトでの拡張で載せたスクリーンショットの下半分を見ると、SimpleFilterとTimelineも実は拡張だったことがわかります。</p>
<p>拡張プラグインの作り方も、細かく説明されています。</p>
<p><a href="http://www.fiddler2.com/fiddler/dev/IFiddlerExtension.asp" target="_blank">Fiddler Web Debugger &#8211; Extending Fiddler with .NET Code</a></p>
<h2>UIに好きな項目を追加できる</h2>
<p>前述の拡張で、右カラムに自由にタブを追加して、好きなインターフェースを追加できます。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/image31.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2009/09/image_thumb31.png" width="480" height="302" /></a> </p>
<h2>ブレークポイントの設定</h2>
<p>Filtersでブレークポイントを指定できます。ブレークポイントを指定すると、そのリクエストの時点で以降の通信をストップさせることができます。HTTP/1.0とHTTP/1.1では、リクエストの順序でレスポンスが送られることになっているので、ひとつの通信を止めると、以降そのHostからのレスポンスは止まります。</p>
<p>一旦ストップさせておいて、レスポンスをローカルのファイルで置き換えたり、そのまま再開させたりすることもできます。ちなみに止まっている間、ブラウザは読み込み中のままになります。</p>
<h2>まとめ</h2>
<p>紹介していない機能もまだあります。使えば使うほど便利なFiddler、ホントにおすすめです。もっと拡張機能が増えてほしい！</p>
</p>
</p>
</p>
<p>他の参考記事としてはこの辺。</p>
<p><a href="http://www.infoq.com/jp/news/2009/03/fiddler" target="_blank">InfoQ: Fiddler Webデバッグプロキシ</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2009/09/%e5%ae%9f%e3%81%affiddler%e3%81%8c%e3%81%99%e3%81%94%e3%81%99%e3%81%8e%e3%81%9f%e3%81%ae%e3%81%a7%e3%80%81%e6%a9%9f%e8%83%bd%e3%81%be%e3%81%a8%e3%82%81%e7%b4%b9%e4%bb%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NSISから使える、起動中のプロセスを削除するプラグイン</title>
		<link>http://blog.loadlimits.info/2009/09/nsis%e3%81%8b%e3%82%89%e4%bd%bf%e3%81%88%e3%82%8b%e3%80%81%e8%b5%b7%e5%8b%95%e4%b8%ad%e3%81%ae%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%82%92%e5%89%8a%e9%99%a4%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9/</link>
		<comments>http://blog.loadlimits.info/2009/09/nsis%e3%81%8b%e3%82%89%e4%bd%bf%e3%81%88%e3%82%8b%e3%80%81%e8%b5%b7%e5%8b%95%e4%b8%ad%e3%81%ae%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%82%92%e5%89%8a%e9%99%a4%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 07:20:22 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[DLL]]></category>
		<category><![CDATA[NSIS]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2009/09/nsis%e3%81%8b%e3%82%89%e4%bd%bf%e3%81%88%e3%82%8b%e3%80%81%e8%b5%b7%e5%8b%95%e4%b8%ad%e3%81%ae%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%82%92%e5%89%8a%e9%99%a4%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9/</guid>
		<description><![CDATA[常駐アプリケーションを作ったはいいが、アンインストールしようとしたときにプロセスが起動していると、削除できなくて困る。
というわけで、プロセスを殺す目的のプラグインDLLを作成。コンパイル済みファイルはエントリの最後に。
taskkillコマンド使えという話ですが、Windows XP Home Editionにはtaskkillコマンドが含まれていないので。
今回もさっくりC#で。C#.NETで作ってしまうと、そのままではNSISで使えないのだけど、.NETで作ったDLLをNSISのプラグインとして使う方法は以下のエントリを参照。
NSISで、C#で書かれた自作のDLLを使う : blog.loadlimit &#8211; digital matter -
ソースは以下。C#でクラスライブラリとしてプロジェクトを作成。プロセス名を指定すると、マッチしたプロセスを全部終了してくれます。


using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace TaskKill
{
    public class TaskKill
    {
        [DllImport("Psapi.dll", SetLastError = true)]
        static extern bool EnumProcesses(
         [...]]]></description>
			<content:encoded><![CDATA[<p>常駐アプリケーションを作ったはいいが、アンインストールしようとしたときにプロセスが起動していると、削除できなくて困る。</p>
<p>というわけで、プロセスを殺す目的のプラグインDLLを作成。コンパイル済みファイルはエントリの最後に。</p>
<p>taskkillコマンド使えという話ですが、Windows XP Home Editionにはtaskkillコマンドが含まれていないので。</p>
<p>今回もさっくりC#で。C#.NETで作ってしまうと、そのままではNSISで使えないのだけど、.NETで作ったDLLをNSISのプラグインとして使う方法は以下のエントリを参照。</p>
<p><a title="http://blog.loadlimits.info/2009/08/nsis%e3%81%a7%e3%80%81c%e3%81%a7%e6%9b%b8%e3%81%8b%e3%82%8c%e3%81%9f%e8%87%aa%e4%bd%9c%e3%81%aedll%e3%82%92%e4%bd%bf%e3%81%86/" href="http://blog.loadlimits.info/2009/08/nsis%e3%81%a7%e3%80%81c%e3%81%a7%e6%9b%b8%e3%81%8b%e3%82%8c%e3%81%9f%e8%87%aa%e4%bd%9c%e3%81%aedll%e3%82%92%e4%bd%bf%e3%81%86/">NSISで、C#で書かれた自作のDLLを使う : blog.loadlimit &#8211; digital matter -</a></p>
<p>ソースは以下。C#でクラスライブラリとしてプロジェクトを作成。プロセス名を指定すると、マッチしたプロセスを全部終了してくれます。</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:53c99b17-b530-4e95-997c-35715953896a" class="wlWriterEditableSmartContent">
<pre name="code" class="c#">using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace TaskKill
{
    public class TaskKill
    {
        [DllImport("Psapi.dll", SetLastError = true)]
        static extern bool EnumProcesses(
           [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U4)] [In][Out] UInt32[] processIds,
             UInt32 arraySizeBytes,
             [MarshalAs(UnmanagedType.U4)] out UInt32 bytesCopied
          );

        [DllImport("kernel32.dll")]
        static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle,
           uint dwProcessId);

        [Flags]
        public enum ProcessAccessFlags : uint
        {
            All = 0x001F0FFF,
            Terminate = 0x00000001,
            CreateThread = 0x00000002,
            VMOperation = 0x00000008,
            VMRead = 0x00000010,
            VMWrite = 0x00000020,
            DupHandle = 0x00000040,
            SetInformation = 0x00000200,
            QueryInformation = 0x00000400,
            Synchronize = 0x00100000
        }

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool CloseHandle(IntPtr hObject);

        [StructLayout(LayoutKind.Sequential)]
        public struct StringBuffer
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            public string text;
        }

        [DllImport("psapi.dll")]
        private static extern bool EnumProcessModules(IntPtr hProcess, out IntPtr lphModule, int cb, out int lpcbNeeded);
        [DllImport("psapi.dll")]
        private static extern int GetModuleBaseName(IntPtr hProcess, IntPtr hModule, out StringBuffer lpBaseName, int nSize);

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool TerminateProcess(IntPtr hProcess, int uExitCode);

        public static void KillByName(string pname)
        {

            UInt32 arraySize = 1024;
            UInt32 arrayBytesSize = arraySize * sizeof(UInt32);
            UInt32[] processIds = new UInt32[arraySize];
            UInt32 bytesCopied;

            bool success = EnumProcesses(processIds, arrayBytesSize, out bytesCopied);

            if (!success)
            {
                return;
            }
            if (0 == bytesCopied)
            {
                return;
            }

            UInt32 numIdsCopied = bytesCopied &gt;&gt; 2;

            if (0 != (bytesCopied &amp; 3))
            {
                UInt32 partialDwordBytes = bytesCopied &amp; 3;

                return;
            }

            for (UInt32 index = 0; index &lt; numIdsCopied; index++)
            {
                IntPtr hProcess = OpenProcess(
                    ProcessAccessFlags.QueryInformation | ProcessAccessFlags.VMRead | ProcessAccessFlags.Terminate,
                    false,processIds[index]);
                if (hProcess.ToInt32() != 0)
                {
                    IntPtr hMod = IntPtr.Zero;
                    int cbNeeded;
                    StringBuffer szProcessName;
                    szProcessName.text = "&lt;unknown&gt;";

                    if (EnumProcessModules(hProcess, out hMod, Marshal.SizeOf(hMod), out cbNeeded))
                    {
                        GetModuleBaseName(hProcess, hMod, out szProcessName, Marshal.SizeOf(szProcessName));
                    }

                    if (szProcessName.text == pname)
                    {
                        TerminateProcess(hProcess, -1);
                    }

                    CloseHandle(hProcess);
                }
            }

        }

    }
}
</pre>
</div>
<p>で、これをNSISの配布ファイルに含めておいて、</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e9619311-129a-4b77-9c2d-7fd6d50d64c6" class="wlWriterEditableSmartContent">
<pre name="code" class="py">; アンインストーラ
Section "Uninstall"
  ; アンインストールで使用するプラグインの準備
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "TaskKill.dll"

  ; hogehoge.exeが起動していたら、それを落とす
  CLR::Call /NOUNLOAD "TaskKill.dll" "TaskKill.TaskKill" "KillByName" 1 "hogehoge.exe"

  ; インストールしたファイル群削除
  Delete $INSTDIR\*.*

  CLR::Destroy
SectionEnd
</pre>
</div>
<p>という感じでnsiファイルを記述。</p>
<p>ファイルは下記リンクからダウンロードしてお使いください。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2009/09/TaskKill.dll" target="_blank">download TaskKill.dll</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2009/09/nsis%e3%81%8b%e3%82%89%e4%bd%bf%e3%81%88%e3%82%8b%e3%80%81%e8%b5%b7%e5%8b%95%e4%b8%ad%e3%81%ae%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%82%92%e5%89%8a%e9%99%a4%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>スクリーンキーボード</title>
		<link>http://blog.loadlimits.info/2009/08/%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%ad%e3%83%bc%e3%83%9c%e3%83%bc%e3%83%89/</link>
		<comments>http://blog.loadlimits.info/2009/08/%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%ad%e3%83%bc%e3%83%9c%e3%83%bc%e3%83%89/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 04:13:08 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2009/08/%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%ad%e3%83%bc%e3%83%9c%e3%83%bc%e3%83%89/</guid>
		<description><![CDATA[Vistaでソフトウェアキーボードというか、スクリーンキーボードを作ろうとしてハマったのでメモ。ただし、結局解決には至っていません。アプローチ変えてしまったので。
スクリーンキーボードを作るにあたって検索すると、imm32関連の関数を使ったサンプルが諸々出てくるのだけど、どうやらこの関数がWindows XPまでのもので、Vista以降はTSF(Text Services Framework)というものに置き換わっているらしい。
これに気づかず、
IntPtr hIMC = ImmGetContext(AHwnd);    IntPtr hKL = GetKeyboardLayout(0);     int dwSize = ImmGetConversionList(hKL, hIMC, AText, IntPtr.Zero, 0, GCL_CONVERSION);
とかやっていたのだけど、ImmGetConversionListの結果が必ず0になってしまう。
imm32 を使ったプログラムの互換性について
試してないけど、TSFのドキュメントは以下。
Text Services Framework Reference (Windows)
で、ここまでわかったところで、結局Linuxでやることになりました。
]]></description>
			<content:encoded><![CDATA[<p>Vistaでソフトウェアキーボードというか、スクリーンキーボードを作ろうとしてハマったのでメモ。ただし、結局解決には至っていません。アプローチ変えてしまったので。</p>
<p>スクリーンキーボードを作るにあたって検索すると、imm32関連の関数を使ったサンプルが諸々出てくるのだけど、どうやらこの関数がWindows XPまでのもので、Vista以降はTSF(Text Services Framework)というものに置き換わっているらしい。</p>
<p>これに気づかず、</p>
<p>IntPtr hIMC = ImmGetContext(AHwnd);    <br />IntPtr hKL = GetKeyboardLayout(0);     <br />int dwSize = ImmGetConversionList(hKL, hIMC, AText, IntPtr.Zero, 0, GCL_CONVERSION);</p>
<p>とかやっていたのだけど、ImmGetConversionListの結果が必ず0になってしまう。</p>
<p><a href="http://social.technet.microsoft.com/forums/ja-JP/windowsvistasoftwareja/thread/973a7407-5ddb-4b34-9aea-0fb36f762cf4/" target="_blank">imm32 を使ったプログラムの互換性について</a></p>
<p>試してないけど、TSFのドキュメントは以下。</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms629038(VS.85).aspx" target="_blank">Text Services Framework Reference (Windows)</a></p>
<p>で、ここまでわかったところで、結局Linuxでやることになりました。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2009/08/%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%ad%e3%83%bc%e3%83%9c%e3%83%bc%e3%83%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NSISで、C#で書かれた自作のDLLを使う</title>
		<link>http://blog.loadlimits.info/2009/08/nsis%e3%81%a7%e3%80%81c%e3%81%a7%e6%9b%b8%e3%81%8b%e3%82%8c%e3%81%9f%e8%87%aa%e4%bd%9c%e3%81%aedll%e3%82%92%e4%bd%bf%e3%81%86/</link>
		<comments>http://blog.loadlimits.info/2009/08/nsis%e3%81%a7%e3%80%81c%e3%81%a7%e6%9b%b8%e3%81%8b%e3%82%8c%e3%81%9f%e8%87%aa%e4%bd%9c%e3%81%aedll%e3%82%92%e4%bd%bf%e3%81%86/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 07:34:10 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[解決]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2009/08/nsis%e3%81%a7%e3%80%81c%e3%81%a7%e6%9b%b8%e3%81%8b%e3%82%8c%e3%81%9f%e8%87%aa%e4%bd%9c%e3%81%aedll%e3%82%92%e4%bd%bf%e3%81%86/</guid>
		<description><![CDATA[NSISでインストーラ＆アンインストーラを作っていて、インストール時に一緒にインストールしたAdobe AIRアプリケーションを、アンインストール時に同時にアンインストールしたいという要件。
Adobe AIRアプリケーションのアンインストールは、手動ならWindowsのコントロールパネルからできるので、ここの情報をレジストリから引っ張り出して実行すればOK。この辺は良くある手段。
で、レジストリからアンインストールに必要なプログラムの実行パス情報を持ってこようとしたら、Adobe AIRでは、Uninstall以下のサブキーの名前が毎回変わるので、検索する必要があることが発覚。
NSISにはレジストリの特定のキーを読む機能はあっても、キーを検索する機能はないので、DLLで拡張を作成。さっくり適当にC#でレジストリを検索して文字列を返すDLLを作成してみた。
ちなみにアンインストール情報はHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall以下にあります。
ということで、必要な動作はUninstall以下のサブキーを全部開いてDisplayNameが目的の名前と一致するサブキーを探すこと。ソースは以下。
SearchUninstall.cs    

using System;
using System.Collections.Generic;
using System.Text;

namespace SearchUninstall
{
    public class SearchUninstall
    {
        public static string Find(string name)
        {
            string keyPath [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nsis.sourceforge.net/" target="_blank">NSIS</a>でインストーラ＆アンインストーラを作っていて、インストール時に一緒にインストールしたAdobe AIRアプリケーションを、アンインストール時に同時にアンインストールしたいという要件。</p>
<p>Adobe AIRアプリケーションのアンインストールは、手動ならWindowsのコントロールパネルからできるので、ここの情報をレジストリから引っ張り出して実行すればOK。この辺は良くある手段。</p>
<p>で、レジストリからアンインストールに必要なプログラムの実行パス情報を持ってこようとしたら、Adobe AIRでは、Uninstall以下のサブキーの名前が毎回変わるので、検索する必要があることが発覚。</p>
<p>NSISにはレジストリの特定のキーを読む機能はあっても、キーを検索する機能はないので、DLLで拡張を作成。さっくり適当にC#でレジストリを検索して文字列を返すDLLを作成してみた。</p>
<p>ちなみにアンインストール情報はHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall以下にあります。</p>
<p>ということで、必要な動作はUninstall以下のサブキーを全部開いてDisplayNameが目的の名前と一致するサブキーを探すこと。ソースは以下。</p>
<p>SearchUninstall.cs    </p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2be952f0-e1de-476b-b78f-b9699d3ac5d4" class="wlWriterEditableSmartContent">
<pre name="code" class="c#">using System;
using System.Collections.Generic;
using System.Text;

namespace SearchUninstall
{
    public class SearchUninstall
    {
        public static string Find(string name)
        {
            string keyPath = "";

            // レジストリからの読み取り
            Microsoft.Win32.RegistryKey regkey =
                Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", false);
            // キーが存在しないときは null が返される
            if (regkey == null) return null;

            // 文字列を読み込む
            // 読み込む値が存在しないときは null が返される
            string stringValue = (string)regkey.GetValue("string");

            // sub以下のすべてのキー名を取得
            string[] keyNames = regkey.GetSubKeyNames();
            foreach (string k in keyNames)
            {
                string tmp_keyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + k;
                Microsoft.Win32.RegistryKey regkey2 =
                    Microsoft.Win32.Registry.LocalMachine.OpenSubKey(tmp_keyPath, false);
                try
                {
                    string displayName = (string)regkey2.GetValue("DisplayName");
                    if (displayName == name)
                    {
                        keyPath = tmp_keyPath;
                        break;
                    }
                }
                catch (Exception e)
                {
                    ;
                }
                finally
                {
                    regkey2.Close();
                }
            }

            //閉じる
            regkey.Close();

            return keyPath;
        }
    }
}
</pre>
</div>
<p>で、出来上がったDLLをNSISに読み込ませようとしても、どうにも動かない。</p>
<p>Dependency walkerで他のDLLと見比べてみると、C#で作られたDLLはエントリポイントが見えない。</p>
<p>そう言えばそんな話もあったような。</p>
<p>参考：<a href="http://forums.winamp.com/showthread.php?threadid=286007" target="_blank">WINAMP.COM | Forums &#8211; How can I use a C# DLL in NSIS</a></p>
<p>NSISからでは.NETのDLLが読めないらしい。ということで、見つけたのが以下。.NETのDLLを使えるようにするプラグイン。</p>
<p><a href="http://nsis.sourceforge.net/Call_.NET_DLL_methods_plug-in" target="_blank">Call .NET DLL methods plug-in &#8211; NSIS</a></p>
<p>CLR.zipをダウンロードしてきて、NSISをインストールしたフォルダのPluginsフォルダに入れておけばOK。</p>
<p>先に作ったSearchUninstall.dllはnsiファイルと同じ場所に入れておく。</p>
<p>で、nsiファイルは以下の感じ。Uninstall部分の必要部分を抜粋。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7725bb39-a6f9-4341-a35e-bd837af7967b" class="wlWriterEditableSmartContent">
<pre name="code" class="php">; アンインストーラ
Section "Uninstall"
  ; アンインストールで使用するプラグインの準備
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "SearchUninstall.dll"

  ; AIRアプリケーションのアンインストーラを探す
  CLR::Call /NOUNLOAD "SearchUninstall.dll" "SearchUninstall.SearchUninstall" "Find" 1 "HogeHogeAir"
  pop $0
  CLR::Destroy

  ReadRegStr $4 HKLM $0 "UninstallString"

  ; AIRアプリケーションのアンインストーラをPassiveモード(自動処理)で実行する
  ExecWait "$4 /passive"

  ; 後片付け
  Delete "$PLUGINSDIR\SearchUninstall.dll"
SectionEnd</pre>
</div>
<p>これで、アンインストール時にAdobe AIRアプリケーションのアンインストーラも勝手に起動して削除できる。</p>
<p>CLR超便利。プラグインを作るのが相当楽に。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2009/08/nsis%e3%81%a7%e3%80%81c%e3%81%a7%e6%9b%b8%e3%81%8b%e3%82%8c%e3%81%9f%e8%87%aa%e4%bd%9c%e3%81%aedll%e3%82%92%e4%bd%bf%e3%81%86/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
