<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>タイトル</title>
    <link>http://okamerin.com/nc/title/</link>
    <description>日記帳</description>
    <!-- optional tags -->
    <language>ja</language>
    <generator></generator>
    <copyright>okamerin.com</copyright>
    <category>Weblog</category>
    <docs></docs>
    <image>
      <url>http://okamerin.com/nc/nucleus/nucleus2.gif</url>
      <title>タイトル</title>
      <link>http://okamerin.com/nc/title/</link>
    </image>
     <item>
 <title><![CDATA[２０１２．４  The robot lists]]></title>
 <link>http://okamerin.com/nc/title/346.htm</link>
<description><![CDATA[<br>
２０１２．４&nbsp; The robot lists<br>
<br>
うーん ログになんかみたことないアドレス。<br>
しかも、月に7860回もアクセスしていやがる。<br>
.htaccessで拒否いれてやろうかと思いましたが(ドメインブロック)<br>
.go.jpドメインを参照してとあるので<br>
とりあえず様子見。<br>
※後日whois.jpドメイン管理情報を閲覧して本当に<br>
.go.jpか調べます。<br>
<br>　[Domain Name]                   JGN-X.JP<br>
　[登録者名]                      独立行政法人情報通信研究機構<br>
<br>
あとは、定番のロボしかlogに載っていないので<br>
今回の定期ログ検閲は、問題なし。<br>
<br>
<table style=" text-align: left;" border="1" cellpadding="2"
cellspacing="2">
<tbody>
<tr>
<td style="text-align: left;">ホスト名<br>
host name<br>
</td>
<td>gw.ucri.jgn-x.jp</td>
</tr>
<tr>
<td style="text-align: left;">IP<br>
</td>
<td>-<br>
</td>
</tr>
<tr>
<td style="text-align: left;">ユーザーエージェント<br>
UserAgent</td>
<td>ICC-Crawler/2.0 (Mozilla-compatible; ;
http://kc.nict.go.jp/project1/crawl.html)</td>
</tr>
<tr>
<td colspan="2" rowspan="1" style="vertical-align: top;">なんだろう
ね？<br>
</td>
</tr>
</tbody>
</table>
<br>
<br>
<table style=" text-align: left;" border="1" cellpadding="2"
cellspacing="2">
<tbody>
<tr>
<td style="text-align: left;">ホスト名<br>
host name<br>
</td>
<td>crawl-数字-数字-数字-数字.googlebot.com</td>
</tr>
<tr>
<td style="text-align: left;">IP<br>
</td>
<td>-<br>
</td>
</tr>
<tr>
<td style="text-align: left;">ユーザーエージェント<br>
UserAgent</td>
<td>Mozilla/5.0 (compatible; Googlebot/2.1;
+http://www.google.com/bot.html)</td>
</tr>
<tr>
<td colspan="2" rowspan="1" style="vertical-align: top;">Google



の自動サイトデータ収集ソフトウェア</td>
</tr>
</tbody>
</table>
<br>
<table style=" text-align: left;" border="1" cellpadding="2"
cellspacing="2">
<tbody>
<tr>
<td style="text-align: left;">ホスト名<br>
host name<br>
</td>
<td>msnbot-数字-数字-数字-数字.search.msn.com</td>
</tr>
<tr>
<td style="text-align: left;">IP<br>
</td>
<td>-<br>
</td>
</tr>
<tr>
<td style="text-align: left;">ユーザーエージェント<br>
UserAgent</td>
<td>Mozilla/5.0 (compatible; bingbot/2.0;
+http://www.bing.com/bingbot.htm</td>
</tr>
<tr>
<td colspan="2" rowspan="1" style="vertical-align: top;">前から
bing？ だったかな？<br>
以前は、これだったみたい。<br>
msnbot/2.0b (+http://search.msn.com/msnbot.htm)._<br>
</td>
</tr>
</tbody>
</table>
<br>
アクセスの８０％は検索エンジンですけど、<br>
利用統計　トップ 30 of 45 国<br>
をみると、いろんな国からアクセスがあるのですね。<br>
遠くに住む日本の方がアクセスしている場合もあるようです。<br>
<br>]]></description>
 <category>レンタルサーバーやcgi</category>
<comments>http://okamerin.com/nc/title/index.php?itemid=346</comments>
 <pubDate>Fri, 18 May 2012 23:00:00 +0900</pubDate>
</item><item>
 <title><![CDATA[GPSログの手動checksum再計算]]></title>
 <link>http://okamerin.com/nc/title/345.htm</link>
<description><![CDATA[GPSログの手動checksum再計算<br>
<hr style="width: 100%; height: 2px;">
<div style="text-align: right;">執筆：2012.05.05<br>
</div>
<hr style="width: 100%; height: 2px;"><br>
通常のchecksumは、全部の合計ですが計算方法が違います。<br>
$と*の間の文字を順番にxor演算します。<br>
<br>
修正したいポイントの緯度経度は、<br>
google earthでカーソル位置の情報をリアルタイムで知ることができるのでそれを参考にすると簡単です。<br>
<br>
GPSログの緯度経度を手動で修正した場合の再計算などに使うと便利です。<br>
機器にGPSログの修正機能が付属していない場合に<br>
　 ちょっとここ微妙に違う！！<br>
　　　このわずかな ずれが気になる！！<br>
　というようなときに活躍します。<br>
<br>
<table style=" text-align: left;" border="1" cellpadding="2"
cellspacing="2">
<tbody>
<tr>
<td style="vertical-align: top;">コード(Pascal言語)<br>
</td>
</tr>
<tr>
<td style="vertical-align: top;">
<p>// GPSのログの行を手動変更した場合のchecksumの再計算など<br>
function GPS_NMEA_Line_Checksum(s : string) : integer;<br>
&nbsp; var<br>
&nbsp;&nbsp; i , sum : integer;<br>
begin<br>
&nbsp; // $data*&lt;CR&gt;&lt;LF&gt;<br>
&nbsp; // $と*の間の文字をxorします<br>
&nbsp; // Todo : 1文字目が $以外は例外生成<br>
&nbsp; sum := 0;<br>
&nbsp; s := Trim(s);<br>
&nbsp; for i := 1 to Length(s) do<br>
&nbsp;&nbsp; begin<br>
&nbsp;&nbsp;&nbsp;&nbsp; if (i = 1) and (s[1] = ''$'') then
continue;<br>
&nbsp;&nbsp;&nbsp;&nbsp; if (s[i] = ''*'') then break;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum := sum xor&nbsp;
Byte(s[i]);<br>
&nbsp;&nbsp; end;<br>
&nbsp;&nbsp; Result := sum;<br>
end;<br>
<br>
procedure TForm1.Button_RecalcClick(Sender: TObject);<br>
begin<br>
&nbsp; Edit2.text := Format(''%.2x'' , [
GPS_NMEA_Line_Checksum(Edit1.text)]);<br>
end;<br>
<br>
procedure TForm1.Button_ClearClick(Sender: TObject);<br>
begin<br>
&nbsp; Edit1.text := '''';<br>
end;<br>
</p>
</td>
</tr>
</tbody>
</table>
<br>
C/C++言語の場合は、 xor は　^ です。<br>
for ( i = 0; i &lt; strlen(s); i++ )<br>
&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp; if ( (i == 0) &amp;&amp; (s[0] == ''$'') )<br>
&nbsp; &nbsp; &nbsp; &nbsp; { continue; }<br>
&nbsp;&nbsp;&nbsp;&nbsp; if (s[i] == ''*'')<br>
&nbsp; &nbsp; &nbsp; &nbsp; { break; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum = sum ^ s[i];<br>
&nbsp; }<br>
<br>
GPSの各行の仕様は、<br>
&nbsp; GPS NMEA フォーマット<br>
&nbsp; GPS NMEA 仕様<br>
などで検索すると知ることができます。<br>
<br>
finepixだと 1ポイントは、４行が1セットです。<br>
$GPGGA,・・・<br>
$GPGSA,・・・<br>
$GPRMC,・・・<br>
$GPVTG,・・・<br>
<br>]]></description>
 <category>General</category>
<comments>http://okamerin.com/nc/title/index.php?itemid=345</comments>
 <pubDate>Sat, 5 May 2012 23:00:00 +0900</pubDate>
</item><item>
 <title><![CDATA[PTF DIFF 1.0.0.0-ベータ1]]></title>
 <link>http://okamerin.com/nc/title/342.htm</link>
<description><![CDATA[  PTF DIFF 1.0.0.0-ベータ1<br>
    <hr style="width: 100%; height: 2px;">

    <div style="text-align: right;">執筆：2012.1.3<br>
    </div>
    <hr style="width: 100%; height: 2px;">PTF形式<br>
    Panasonic製のナビの登録ポイント<br>
    ２ファイル間の差分・保存アプリケーション<br>
    <br>
    <table style=" text-align: left;" border="0" cellpadding="2"
      cellspacing="2">

      <tbody>
        <tr>
          <td style="vertical-align: top;"><img style=" width: 400px;
              height: 360px;" alt=""
              src="http://okamerin.com/images/ptf_diff_2012_ver1_0_0_dev_snap01.jpg"><br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;">Version 1.0.0.0-ベータ1 snapshot
            20120103</td>
        </tr>

      </tbody>
    </table>
    <br>
    サイズ 約600Kbyte<br>
    開発版のためダウンロードできません。<br>
    <br>]]></description>
 <category>General</category>
<comments>http://okamerin.com/nc/title/index.php?itemid=342</comments>
 <pubDate>Wed, 4 Jan 2012 18:15:26 +0900</pubDate>
</item><item>
 <title><![CDATA[パナナビ　ポイント登録データフォーマット( .PTF 編 )　メモ]]></title>
 <link>http://okamerin.com/nc/title/memo-ptf_data_format.htm</link>
<description><![CDATA[    <!-- uri : memo-ptf_data_format  -->

    <h2>パナナビ　ポイント登録データフォーマット( .PTF 編 )　メモ<br>
    </h2>
    <hr style="width: 100%; height: 2px;">
    <div style="text-align: right;">執筆：2011.12.18<br>
      編集：2011.12.19<br>
      編集：2011.12.20<br>
      編集：2011.12.21<br>

      編集：2011.12.22<br>
      編集：2011.12.28<br>
    </div>
    <hr style="width: 100%; height: 2px;">マイ　メモ<br>
    <br>
    <span style="color: rgb(255, 0, 0); font-weight: bold;">※データを操作するに
      はバ イナリ操作に関する知識が必要です。</span><br style="color: rgb(255, 0, 0);
      font-weight: bold;">
    <span style="color: rgb(255, 0, 0); font-weight: bold;">※データを参考にする 際
      は、自己責任で参考になされてください。</span><br style="color: rgb(255, 0, 0);
      font-weight: bold;">
    <span style="color: rgb(255, 0, 0); font-weight: bold;"></span><span
      style="font-weight: bold; color: rgb(255, 0, 0);">※データの整合性はご自分で十分検
      証なされてください。</span><br>

    <span style="color: rgb(255, 0, 0); font-weight: bold;"></span><span
      style="color: rgb(255, 0, 0); font-weight: bold;">※</span><span
      style="color: rgb(255, 0, 0); font-weight: bold;">設定を間違ったり、</span><span
      style="color: rgb(255, 0, 0); font-weight: bold;">データを編集したりするとナビが故
      障・誤動作する恐れがあります。</span><br style="color: rgb(255, 0, 0);
      font-weight: bold;">
    <br>
    ファイル拡張子： PTF<br>
    ファイル形式： バイナリデータ <br>
    <br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">

      <tbody>
        <tr>
          <td colspan="2" rowspan="1" style="vertical-align: top;">ポイン ト
            ファイル ptf<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;">ヘッダ 12バイト</td>
          <td style="vertical-align: top;">データ1 データ2 .... データ<span
              style="font-weight: bold;">N</span></td>

        </tr>
      </tbody>
    </table>
    <br><b>　2011.12.29：<br>
数日の解析で<br>
新規データを挿入して使えるレベルまでデータ解析はできたのですが<br>
ページが長くなって見にくいことと<br>
ローカルPCの解析済みの仕様と同期をとるのが面倒なこと<br>
その他<br>
の理由により
解析したPTFの仕様データの詳細は、削除しました。<br>
</b>
<br>
再掲載する際は、このページか、別のページになりますので、<br>
その際は、このページにリンクを張るなりしたいと思います。<br>
<br>
<br>
<hr style="width: 100%; height: 2px;">【ひとりごと】<br>
2011年12月<br>
CN-H500WDを購入しました。<br>
<br>
<span style="font-weight: bold;">pmfが取り込めると説明書にあるので、</span><br
style="font-weight: bold;">
<span style="font-weight: bold;"> pmfを取り込むと、<span
style="text-decoration: underline;">マークと音声が無くなりました</span>。</span><br>
<br>
しかも、ナビの説明書を見ると効果音が500m固定。<br>
曲がり角とか、危ない地点とかの登録が台無しです。<br>
<br>
<br>
同社の前のナビの形式・機能と比較して<br>
「意地悪で機能を大幅にケズッタ」か<br>
「現ナビの開発者がナビをまったく利用していない」<br>
「車の免許をもっていない」<br>
「外にでないで模擬電波で引きこもって開発しているとか」<br>
とかでないと この仕様はありえません。<br>
<br>
もう、お客様相談に、<br>
&nbsp;ブブー苦情いいたいと思います。<br>
・<span style="font-weight: bold;">効果音 500m　固定なんて ありえない！！ 遠すぎ</span><br>
&nbsp; 作ったやつの距離感覚疑ってしまうヨ！！<br>
・<span style="font-weight: bold;">方位指定したら　効果音ベル固定なんて ありえない！！</span><br
style="font-weight: bold;">
<span style="font-weight: bold;"> </span>・ナビの入力画面から電話番号にハイフンを入れることが
できない。<br>
　→番号読みづらい。<br>
&nbsp; pmfからの読み込みデータで取り込んだ物はハイフン付きで表示される。<br>
・ポイントにメモ機能がない。いるときはいるんだよ！！<br>
　開店時間とか定休日とかいれるんだヨ！！<br>
　その他もろもろ。<br>
　ないから場所をメモ帳代わりに代用するけど。<br>
・ポイント書き出しが全データしかない<br>
　他の人にあげるために複数選択して個別にエクスポートしたいときってあるんだよ！！<br>
地図３年間更新セット付きなんだから<br>
モーーーー！！！！プログラム更新で対応しろっていいたいです。<br>
決して無理な要望ではないですよ。以前の同社のナビについていた機能ですから。<br>
<br>
みんなで、メーカーに要望いわないと改善しないヨ。<br>
<br>
あー　すっきりした。<br>
<br>
「タッチパネルの使い勝手の悪さ」<br>
「効果音の機能の貧弱さ」<br>
「登録ポイントの編集の使い勝手の悪さ」<br>
この使い勝手の悪さは、 ありえない！！。<br>
<br>
もう１台の車のHDX300は、壊れないことを祈りつつ<br>
まだ初期搭載の2002年マップなので、<br>
来年末あたりにマップを買って大事に継続利用しようと思います。<br>
<br>
ナビの案内は、事故多発とか案内が出て、<br>
HDX300と比べると少しはアップグレードしているみたいですが<br>
ポイントデータの感想として、使い勝手としては<br>
機能的にダウンしていると思います。<br>
私的には、改悪です。　ゲロゲロです。<br>
<br>
仕方がないので、それなりの対処をします。<br>
PMFは、専用の編集ソフトがあるので<br>
そのプログラムコードを利用して、<br>
PTFのデータを開いて<br>
PTFのマーク・音声データなどを部分的に照合条件検索で<br>
再割り当てすることで解決しました。<br>
<br>
効果音500m固定は、ゲロゲロです。<br>
どうにかしてほしいです。<br>
<br>
pmfのポイントを元に<br>
ptfを好みの設定に一括修正できたので<br>
良しとします。<br>
<br>
最後に<br>
今後、このページ内容の更新は、<br>
よっぽどのことがないとしないと思います<br>
<br>
<span style="color: rgb(255, 0, 0); font-weight: bold;">※データを参考にする 際
は、自己責任で参考になされてください。</span><br>
<span style="font-weight: bold; color: rgb(255, 0, 0);">※データの整合性はご自分
で十分検証なされてください。</span><br>
<span style="color: rgb(255, 0, 0); font-weight: bold;">※</span><span
style="color: rgb(255, 0, 0); font-weight: bold;">設定を間違ったり、</span><span
style="color: rgb(255, 0, 0); font-weight: bold;">データを編集したりするとナビが故
障・誤動作する恐れがあります。</span><br style="color: rgb(255, 0, 0);
font-weight: bold;">
<br>
<hr style="width: 100%; height: 2px;"><br>

<br>
<hr style="width: 100%; height: 2px;">キーワード：<br>
&nbsp;パナソニック PTF データ 仕様 フォーマット<br>
&nbsp;ナビ カーナビ<br>
&nbsp;pmf ptf 変換 コンバート<br>
&nbsp;pmf ptf 変換ソフト<br>
&nbsp;ptf編集<br>
&nbsp;登録ポイント編集<br>
<br>
【自分用メモ Todo】<br>
・ptf → pmf dumpソフト<br>
&nbsp; 簡単なのでphpでいいか。<br>
・pmf → ptf dumpソフト<br>
&nbsp; pmfソフトにメニューと関数追加。<br>
・ptf 編集ソフト<br>
&nbsp; 新規：自作のpmfソフトから派生させる。<br>
　編集コントロールの置き換え。<br>
&nbsp; pmf出力機能を追加する。<br>
・地図用ソフトと連携、表示<br>
<br>
2004年に作ったpmfソフト久しぶりに少し更新したぁ。<br>
わー６年ぶりにいじった。<br>
結構力作だったりする。<br>
　（あげないヨ）<br>
<br>
<img style=" width: 284px; height: 232px;" alt=""
src="http://okamerin.com/images/pmf_app_2011_ver1_2_3.jpg"><br>
<br>
<hr style="width: 100%; height: 2px;"><br>
追記：2011/12/25<br>
<table style=" text-align: left;" border="0" cellpadding="2"
cellspacing="2">
<tbody>
<tr>
<td style="vertical-align: top;"> ・</td>
<td style="vertical-align: top;">ptfソフト<br>
pmfから派生<br>
切り取り、保存、部分保存<br>
、距離順ソート機能を実装した。</td>
</tr>
<tr>
<td style="vertical-align: top;"><br>
</td>
<td style="vertical-align: top;">Todo:<br>
　編集詳細画面<br>
、任意項目並び替え実装(自動、手動)<br>
、条件検索<br>
、写真のExifからポイント登録<br>
、.cvsからインポート<br>
、他形式エクスポート(.pmf , .rcx)<br>
、地図ソフトと連携<br>
、マークの画像化<br>
、お気に入りデータベース機能<br>
</td>
</tr>
<tr>
<td style="vertical-align: top;"><br>
</td>
<td style="vertical-align: top;"><img style=" width: 284px;
height: 232px;" alt=""
src="http://okamerin.com/images/ptf_app_2011_ver1_0_0_dev_snap01.jpg"><br>
version 1.0.0-dev-20111225 snapshot<br>
</td>
</tr>
</tbody>
</table>
&nbsp;&nbsp; <br>
追記：2011/12/28<br>
・ptfソフトにアイテム詳細編集機能を搭載した。<br>
・ptfソフトにpmf出力機能を搭載した。<br>
マップルデジタル版などに取り込めるので便利。<br>
続きは、別記事で。<br>
<br>
pmfとptfソフトセットでシェアウェアにしちゃうかな！！<br>
需要がなさそう＋採算とれないヨ<br>
<br>
<br>
]]></description>
 <category>ぷろぐらみんぐ／メモ</category>
<comments>http://okamerin.com/nc/title/index.php?itemid=341</comments>
 <pubDate>Sun, 18 Dec 2011 09:00:00 +0900</pubDate>
</item><item>
 <title><![CDATA[ sqlite.exe .dumpで文字化け 【＆ patch p2 編】]]></title>
 <link>http://okamerin.com/nc/title/sqlite2_dump_blob_fix_hex.htm</link>
<description><![CDATA[    sqlite.exe .dumpで文字化け 【＆ patch p2 編】<br>
    <hr style="width: 100%; height: 2px;">

    <div style="text-align: right;">執筆：2011.12.09<br>
      編集：2011.12.10 </div>
    <hr style="width: 100%; height: 2px;"><br>
    概要<br>
    ・sqlite.exe の dumpにHEXモードを追加する方法<br>
    ・sqlite の 「dump」と「インポート」の仕方<br>

    ・sqlite の構築の仕方<br>
    ・php PDO sqlite versionの自動選択手法<br>
    ・<a href="#sqlite_source_download">ソースコードのダウンロード先</a><br>
    <br>
    sqlite3に完全移行していたつもりだったのですが<br>
    今回、サーバーのDBファイルがあちこちのフォルダに散らばっているため<br>

    保存先を統一して整理した結果<br>
    version3シリーズへの移行をしていないデータがいくつかありました。<br>
    <br>
    そして dumpすると　ビープ音　ビ　ビー。<br>
    インポートも書式エラーでできない始末。<br>
    もー、出力をエスケープしていないようです。<br>

    <br>
    sqlite3に移行するのが目的なので、強引に HEXモードを加えました。<br>
    一緒に前回（昨年のパッチ1、set_table_name関数）の修正も入っています<br>
    <br>
    sqlite3.exeの .dumpでは、BLOB型にしていれば、HEX出力されるようです。<br>
    <br>
    とりあえず、<br>

    １個のDBを移行するのに使うだけで、<br>
    cygwinで動いて　、無事に移行できたのでよしとします。<br>
    <br>    <hr style="width: 100%; height: 2px;"><br>
    【修正コード】<br>
    <b>コードを使う際は、利用者の自己責任でのみご利用できます。<br>
      利用前に コードが安全かどうか、ご自分で確認をお願いします。<br>

    </b> <br>
    <span style="color: rgb(255, 0, 0);">また、操作していたアプリケーション固有のエンコード・デコード方
      式があったりして、</span><br style="color: rgb(255, 0, 0);">
    <span style="color: rgb(255, 0, 0);"> dumpにより
      データが壊れる可能性がありますので、ご注意ください。</span><br style="color: rgb(255, 0,
      0);">
    <span style="color: rgb(255, 0, 0);">
      phpのデコード方式には対応したつもりですが、ご自分で確認をお願いします。</span><br style="color:
      rgb(255, 0, 0);">
    <br>

    <b style="color: rgb(255, 0, 0);">※移行した際は、旧DBと新しいDBのデータを完全照合するなどして、<br>
      　 データが破損したりしていないか確認をしましょう。<br>
      ※万が一のため、移行前のDBも保管しておくことをお勧めします。</b><br style="color: rgb(255, 0,
      0);">
    <br>
    <br>
    ファイルは、<br>
    &nbsp; こちらに置いておきます。<br>

    ↓↓↓<br>
    <script type="text/javascript" src="/nc/x/filehaisin.php?detail&amp;name=sqlite2.8.17-p2&amp;.js"></script>
    <noscript></noscript><br>
    ↑↑↑<br>
    <br>
    リンク切れの際は、下のコードをどうぞ。<br>

    <br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td style="vertical-align: top;">sqlite version 2.8x.の修正<br>
          </td>
        </tr>
        <tr>

          <td style="vertical-align: top;">
            <pre><small><small><small><span style="font-family: monospace;">--- SQLite-47fee16ba9bd8ab2/VERSION	2007-01-09 01:20:28.000000000 +0900<br>+++ SQLite-47fee16ba9bd8ab2/VERSION	2011-12-09 21:58:33.703125000 +0900<br>@@ -1 +1 @@<br>-2.8.17<br>+2.8.17-p2<br>--- SQLite-47fee16ba9bd8ab2/src/shell.c	2007-01-09 01:20:28.000000000 +0900<br>+++ SQLite-47fee16ba9bd8ab2/src/shell.c	2011-12-10 10:50:15.031250000 +0900<br>@@ -82,6 +82,8 @@<br> */<br> extern int sqliteIsNumber(const char*);<br> <br>+static int dump_mode = 3; // dump of sqlite version<br>+<br> /*<br> ** This routine reads a line of text from standard input, stores<br> ** the text in memory obtained from malloc() and returns a pointer<br>@@ -220,6 +222,91 @@<br> static void output_quoted_string(FILE *out, const char *z){<br>   int i;<br>   int nSingle = 0;<br>+  int zlen = strlen(z);<br>+  int blen = 0;      // add HEX mode<br>+  int hex_mode = 0;  // add HEX mode<br>+  int need_decode = 0;  // add HEX mode<br>+  int need_trim_header0 = 0;  // add HEX mode<br>+  unsigned char *bin_buf = 0;  // add HEX mode<br>+<br>+  // add HEX output mode<br>+//  if ( dump_mode !=2 )<br>+  {<br>+      for(i=zlen-1; i&gt;=0; i--)<br>+      {<br>+          if ( i&gt;=1 )<br>+           if (<br>+                ( (z[i] == 1) || (z[i] == 2) || (z[i] == 0x28) )<br>+                &amp;&amp;<br>+                ( z[i-1] == 1 )<br>+              )<br>+           {<br>+//**       0x00  -&gt;  0x01 0x01<br>+//**       0x01  -&gt;  0x01 0x02<br>+//**       0x27  -&gt;  0x01 0x28<br>+              need_decode = 1;<br>+              hex_mode = 1;<br>+              // skip i-1<br>+              i--; <br>+              continue;<br>+           }<br>+          if ( /*(z[i] &gt;= 1) &amp;&amp;*/ ((unsigned char) z[i] &lt;= 8) ) <br>+           {  // my rule<br>+              hex_mode = 1;<br>+           }<br>+//        if ( (i != 0) &amp;&amp; (z[i] == 1) ) { } // error ? or other rule<br>+          if ( (i == 0 ) &amp;&amp; (z[i] == 1) )<br>+           {<br>+                // [0] 0x01 has no paire <br>+                // perhaps php encode head<br>+                //  php/ext/sqlite/pdo_sqlite2.c : function sqlite2_handle_quoter<br>+                hex_mode = 1;<br>+                need_decode = 1;<br>+                need_trim_header0 = 1;<br>+           }<br>+      }<br>+<br>+      if ( hex_mode &amp;&amp; (zlen &gt; 0) )<br>+      {<br>+         if ( need_decode )<br>+          {<br>+             bin_buf = malloc( zlen + 1 );<br>+             if( bin_buf==0 )<br>+              {<br>+                fprintf(stderr,"hex_mode: out of memory!\n");<br>+                exit(1);<br>+              }<br>+            if ( need_trim_header0 )<br>+              blen = sqlite_decode_binary((unsigned char *) ( z + 1 ) , (unsigned char *) bin_buf);<br>+            else<br>+              blen = sqlite_decode_binary((unsigned char *) z , (unsigned char *) bin_buf);<br>+          }<br>+         else<br>+          {<br>+             bin_buf = (unsigned char *) z;<br>+             blen = zlen;<br>+          }<br>+<br>+         if ( blen &gt; 0)<br>+             {<br>+                 fprintf(out,"X'");<br>+                 for(i=0; i &lt; blen; i++)<br>+                 {<br>+                    fprintf(out,"%02x" , (unsigned char ) bin_buf[i]);<br>+                 }<br>+                 fprintf(out,"'");<br>+             }<br>+           else<br>+             {<br>+                 fprintf(out,"''");<br>+             }<br>+         if ( need_decode )<br>+            free(bin_buf);<br>+         return ;<br>+      }<br>+  }<br>+  // end add HEX output mode<br>+<br>   for(i=0; z[i]; i++){<br>     if( z[i]=='\'' ) nSingle++;<br>   }<br>@@ -415,19 +502,32 @@<br>   int i, n;<br>   int needQuote;<br>   char *z;<br>+  char quote_char;<br> <br>   if( p-&gt;zDestTable ){<br>     free(p-&gt;zDestTable);<br>     p-&gt;zDestTable = 0;<br>   }<br>   if( zName==0 ) return;<br>-  needQuote = !isalpha(*zName) &amp;&amp; *zName!='_';<br>+<br>+  if ( dump_mode != 2 )<br>+      {<br>+        quote_char = '"';<br>+        needQuote = 1;<br>+      }<br>+    else<br>+      {<br>+        quote_char = '\'';<br>+        needQuote = !isalpha(*zName) &amp;&amp; *zName!='_';<br>+      }<br>+<br>   for(i=n=0; zName[i]; i++, n++){<br>-    if( !isalnum(zName[i]) &amp;&amp; zName[i]!='_' ){<br>+    if( !needQuote &amp;&amp; !isalnum(zName[i]) &amp;&amp; zName[i]!='_' ){<br>       needQuote = 1;<br>-      if( zName[i]=='\'' ) n++;<br>     }<br>+    if( zName[i]==quote_char ) n++;<br>   }<br>+<br>   if( needQuote ) n += 2;<br>   z = p-&gt;zDestTable = malloc( n+1 );<br>   if( z==0 ){<br>@@ -435,12 +535,12 @@<br>     exit(1);<br>   }<br>   n = 0;<br>-  if( needQuote ) z[n++] = '\'';<br>+  if( needQuote ) z[n++] = quote_char;<br>   for(i=0; zName[i]; i++){<br>     z[n++] = zName[i];<br>-    if( zName[i]=='\'' ) z[n++] = '\'';<br>+    if( zName[i]==quote_char ) z[n++] = quote_char;<br>   }<br>-  if( needQuote ) z[n++] = '\'';<br>+  if( needQuote ) z[n++] = quote_char;<br>   z[n] = 0;<br> }</span></small></small></small><br></pre>

          </td>
        </tr>
      </tbody>
    </table>
    <br>
    パッチの当てかた、ソースのルートフォルダで<br>
    patch -p1 -i SQLite-47fee16ba9bd8ab2-p2.diff.txt<br>
    <br>

    【構築(ビルド、コンパイル)のメモ】<br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td colspan="2" rowspan="1" style="vertical-align: top;"><span
              style="font-weight: bold;">cygwin</span> , <span
              style="font-weight: bold;">Linux</span></td>
        </tr>

        <tr>
          <td style="vertical-align: top;"><br>
          </td>
          <td style="vertical-align: top;">./configure \<br>
            &nbsp;&nbsp; --enable-utf8 \<br>
            &nbsp;&nbsp; --enable-tempdb-in-ram<br>

            make<br>
            <br>
          </td>
        </tr>
        <tr>
          <td colspan="2" rowspan="1" style="vertical-align: top;"><span
              style="font-weight: bold;">FreeBSD <br>
            </span></td>
        </tr>

        <tr>
          <td style="vertical-align: top;"><br>
          </td>
          <td style="vertical-align: top;">./configure
            --prefix=$HOME/local/sqlite2 \<br>
            &nbsp;&nbsp; --enable-utf8 \<br>
            &nbsp;&nbsp; --enable-tempdb-in-ram \<br>

            &nbsp;&nbsp; --enable-static<br>
            <br>
            gmake<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;"><br>

          </td>
          <td style="vertical-align: top;"><br>
          </td>
        </tr>
        <tr>
          <td colspan="2" rowspan="1" style="vertical-align: top;">FreeBSD-mingw
:




            need gcc + mingw package</td>
        </tr>
        <tr>

          <td colspan="1" rowspan="2" style="vertical-align: top;"><br>
          </td>
          <td style="vertical-align: top;">途中でエラー：うまく構築できないので、詳細不明。<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;">
            <pre><small><small>chmod&nbsp; 700 ./configure<br>./configure --help<br>./configure --target=mingw32 --host=mingw32 --enable-static<br>gmake</small></small></pre>

          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;"><br>
          </td>
          <td style="vertical-align: top;"><small><small>checking for a
                BSD-compatible install... /usr/bin/install -c<br>
                Version set to 2.8.17-p2<br>
                checking for mingw32-gcc... (cached) mingw32-gcc<br>

                checking whether we are using the GNU C compiler...
                (cached) yes<br>
                checking whether mingw32-gcc accepts -g... (cached) yes<br>
                checking for mingw32-gcc option to accept ANSI C...
                (cached) none needed<br>
                configure: error: unable to find a compiler for building
                build tools</small></small><br>
          </td>
        </tr>
      </tbody>

    </table>
    バージョンの確認方法<br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td style="vertical-align: top;">Windows<br>
          </td>
          <td style="vertical-align: top; font-weight: bold;">sqlite.exe
            -version</td>

        </tr>
        <tr>
          <td style="vertical-align: top;">Unix<br>
          </td>
          <td style="vertical-align: top;"><span style="font-weight:
              bold;">./sqlite -version</span></td>
        </tr>
      </tbody>
    </table>

    &nbsp;2.8.17-p2 と表示されれば OK.<br>
    <br>
    ※sqlite3の./configureは、上のオプションの文字列が違うので<br>
    &nbsp;&nbsp; 注意してください。<br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>

          <td colspan="2" rowspan="1" style="vertical-align: top;">./configure


            の違い<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">sqlite2<br>
          </td>
          <td style="text-align: center;">sqlite3<br>

          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;">--enable-tempdb-in-ram</td>
          <td style="vertical-align: top;">--enable-tempstore<br>
          </td>
        </tr>
        <tr>

          <td style="vertical-align: top;">--enable-utf8<br>
          </td>
          <td style="vertical-align: top;">&nbsp;<br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>

    <br>
    【dumpメモ】<br>
    ・sqlite2をファイルにダンプする<br>
    <span style="font-weight: bold;">&nbsp;./sqlite old-sqlite.db .dump
      &gt; old-sqlite.sql.txt</span><br>
    <br>
    ・エラーが多くてインポートログをとりたい場合<br>

    <span style="font-weight: bold;">sqlite3 new-sqlite.db&nbsp; &lt;
      old-sqlite.sql.txt &gt; new-sqlite-inport-log.txt 2&lt;&amp;1</span><br>
    <br>
    ・直接新しいDBに流し込みたい場合<br>
    <span style="font-weight: bold;"> &nbsp;./sqlite old-sqlite.db .dump
      | sqlite3 new-sqlite.db</span><br>

    <br>
    【その他のメモ】<br>
    compile.htmlには、<br>
    sqlite3コンパイル時に<br>
    SQLITE_OMIT_BLOB_LITERALが定義されていると<br>
    X'ABCD' 書式が使えないとあります。<br>

    <br>
    <br>
    【db自動判別メモ】<br>
    移行期間中だけ、コードに組み込むことで、エラーをはかずに済みます。<br>
    後々のためにsqlite3も判定にいれています。<br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>

        <tr>
          <td colspan="1" rowspan="1" style="vertical-align: top;">php（PDO）
            で開く前に sqliteのバージョンを自動判別する方法<br>
          </td>
        </tr>
        <tr>
          <td colspan="1" rowspan="1" style="vertical-align: top;">
            <pre> $dsn = 'sqlite:'.$db_name;<br> if (file_exists($db_name))<br> {<br>   $handle = fopen($db_name, "r");<br>   $head = fread($handle, 100);<br>   fclose($handle);<br><br>   $head_sqlite2 = '** This file contains an SQLite 2.1 database **';<br>   $head_sqlite3 = 'SQLite format 3';<br><br>   if (substr_compare($head , $head_sqlite2, 0, strlen($head_sqlite2)) == 0)<br>     {<br>       $dsn = 'sqlite2:'.$db_name;<br>     }<br>    else if (substr_compare($head , $head_sqlite3, 0, strlen($head_sqlite3)) == 0)<br>     {<br>       $dsn = 'sqlite:'.$db_name;<br>     }<br> }<br><br>  $dbh = new PDO($dsn);<br>  //sqlite::memory:<br>  // sqlite:filename<br>  // sqlite2:filename</pre>

          </td>
        </tr>
      </tbody>
    </table>
    <br>
    <a name="sqlite_source_download"></a><br>
    【ソースの場所】 ソースコードのダウンロード先<br>
    &nbsp;3.xは、公式<a target="_blank" href="http://www.sqlite.org/">サイト</a>で
    普通に配られています。<br>

    <br>
    ログによると ソースの管理は、<br>
    &nbsp;cvsから Fossilというシステムに移行したそうです。<br>
    &nbsp;2009 Sep 11 (3.6.18):&nbsp; http://www.sqlite.org/changes.html<br>
    <br>
    2.xのコードは、<br>

    &nbsp;http://www.sqlite.org/sqlite-source-2_8_17.zip<br>
    &nbsp;か<br>
    &nbsp;http://www.sqlite.org/download.html<br>
    &nbsp;の Branches → version_2 をクリックしてダウンロードする<br>
    &nbsp;version_2: <a href="http://www.sqlite.org/cgi/src/timeline?r=version_2" target="_blank">http://www.sqlite.org/cgi/src/timeline?r=version_2</a><br>
    <br>

    上記の方法でリンク切れの際は、自力で探してください。<br>
    その他のソースを探す方法<br>
    ・つついてみる<br>
    　ローカルにストックしてあるファイル名は下記なので<br>
    　そのファイル名で公式サイトのurlをつついてみる。<br>
    sqlite-source-2_8_17.zip<br>

    sqlite-2_8_17.zip<br>
    sqlitedll-2_8_17.zip<br>
    sqlite_analyzer-2.8.16.bin.gz<br>
    sqlite-2.8.17.bin.gz<br>
    ・unixなどのリポジトリからソースrpm,tarを展開して取り出す<br>
    <br>
]]></description>
 <category>ぷろぐらみんぐ／データベース</category>
<comments>http://okamerin.com/nc/title/index.php?itemid=339</comments>
 <pubDate>Fri, 9 Dec 2011 23:59:00 +0900</pubDate>
</item><item>
 <title><![CDATA[エラー： [ASW] is not a valid value for ItemId.]]></title>
 <link>http://okamerin.com/nc/title/336.htm</link>
<description><![CDATA[エラー： "B005SR0OMY" is not a valid value for ItemId.<br />
<br />
はぁ・・・<br />
<br />
最近まで正常に表示されていたので<br />
全くわかりませんでしたが、表示されなくなっていたので<br />
<br />
あわわ・・・って急いで調べました。<br />
<br />
１時間検索の末、やっと<br />
エンドポイントが原因ということを書いているページがあったので<br />
<br />
AWSECommerceServicePortJPというのが wsdlに記述されているので<br />
そこの値を指定すると解決しました。<br />
<br />
$AWS_wsdl_end_point = 'https://webservices.amazon.co.jp/onca/soap?Service=AWSECommerceService';<br />
$client->__setLocation($AWS_wsdl_end_point);<br />
<br />
<br />
wsdlは日本のurlから取得しているのになんでcomの値が入っているの？<br />
って感じ。<br />
まったく もう！！]]></description>
 <category>レンタルサーバーやcgi</category>
<comments>http://okamerin.com/nc/title/index.php?itemid=336</comments>
 <pubDate>Wed, 9 Nov 2011 18:15:04 +0900</pubDate>
</item><item>
 <title><![CDATA[CoreMini痛い！]]></title>
 <link>http://okamerin.com/nc/title/335.htm</link>
<description><![CDATA[coreserverに移転しようと思っていたのですが<br />
<br />
スクリプトが動きません。<br />
最初は、パーミッションの問題と思いましたが<br />
同じスクリプトでパラメーターによって<br />
動いたり、エラーがでたりするので<br />
表示されるとおりにしてみてみました。<br />
<br />
AddType application/x-httpd-phpcgi-debug .php<br />
をいれなさいと表示されるので　いれると<br />
ページ最後に<br />
PHPで以下のエラーがでました。<br />
 *** glibc detected *** malloc(): memory corruption: 0x087f4090 ***<br />
<br />
 coreserver　glibc detected malloc(): memory corruptionで検索すると<br />
どうやら<br />
これが原因らしい。<br />
【要望フォーラム】PHPが使用しているlibxmlのバージョンのアップグレード <br />
<a href="http://sb.xrea.com/showthread.php?t=13001" target="_blank">http://sb.xrea.com/showthread.php?t=13001</a><br />
<br />
で スクリプトの先頭で phpinfo(); exit; してみる<br />
<br />
Hostname:Port 	www.m33.coreserver.jp:80 <br />
dom<br />
DOM/XML 	enabled<br />
DOM/XML API Version 	20031129<br />
libxml Version 	2.6.19 <br />
<br />
うーん。<br />
<br />
比較のためにさくらでも phpinfo(); してみる<br />
dom<br />
DOM/XML 	enabled<br />
DOM/XML API Version 	20031129<br />
libxml Version 	2.7.3 <br />
<br />
あちゃー、xreaは、メンテの悪いサーバーってうわさは聞いていましたが<br />
有料サービスもですか・・・。<br />
2008年のサポート掲示板の件が 2011.11になっても更新されていないってことなので<br />
先が見えないから、契約するのは　ちょっと保留というか取りやめですね。<br />
「契約するぞー！」モードだったので<br />
非常に残念ですが、さくっとcoreserverのお試しをキャンセルさせていただきます。<br />
<br />
メールウイルス検知は、<br />
ウィルスメールに「****VIRUS****」という件名を加えます<br />
という　件名表記だけにどん引きしましたが、<br />
まぁ、それは、別にPCで受信時に検知できるので<br />
なくてもOKなんです。<br />
<br />
しかしですね、<br />
xmlパースできないと困ります！！<br />
DBが使えないより、最悪ですよ！！<br />
<br />
もうさくらは、解約申請したので、継続できないから<br />
もー　ロリポしかないです。<br />
<br />
よし、「コロリポ」「ロリポ」うーん。。。<br />
どっちにしよう・・・。<br />
<br />
<br />
追記：<br />
「ロリポ」は、試用した感想として<br />
・フォルダ構成がわかりにくい<br />
　私向きではなかったです。<br />
・FTPソフトでドキュメントルート以下に入れなかった<br />
　（非公開フォルダにファイルを置くにはテクニックがいる）<br />
・サブドメインが１つ(さくらは、＋２個付属)<br />
・説明不十分な意味不明のアカウントロック規約がある。<br />
・メールの保存フォルダがどこにあるのかわからない。<br />
ということで、<br />
ロリポを借りることは、中止しました。<br />
<br />
で、結局、「さくらインターネット　ライトを新規契約しました」<br />
<br />
数年前のさくらインターネット　スタンダードより容量が多いので、特に問題ないです。<br />
<br />
弊害として、さくらのブログが消えたり、Mysql,SSH,SSL(https),cronがなくなりますが、気合いと技術で乗り切ります。<br />
<br />
本年度は、契約料5000円→2500円<br />
で2500円ダウン！！<br />
来年は、1500円になるので、5000円→1500円<br />
3500円ダウン！！<br />
値段が1/3になったので、いままでの１年分で３年分契約できます♪<br />
<br />
移転ファイルの再構成が面倒でしたけど、なんとか移動しました。<br />
<br />
スタンダードはシングルコアっぽかったので<br />
ライトに移動してマルチコアサーバーになったので、よかったかも？<br />
Pentium(R) M processor 2.00GHz<br />
→<br />
Core(TM)2 CPU T7200 2.00GHz<br />
<br />
苦労した点<br />
・いろんなサイトへメールの再登録<br />
・ドメインの移動（数時間ドメインが消える）<br />
　※重要なメールが入ることがある場合は、要注意。<br />
・移動に伴いファイルの絶対パスが変わること<br />
・パス毎にページの表示確認。<br />
<br />
学習した点<br />
・メインテの比較的よいサーバーがいいみたい。<br />
・ネームサーバーは、サーバーと同じ会社に向けないと<br />
　独自ドメインを設定できないみたい。<br />
<br />
移転は、当面しないと思いますが、バックアップは、簡単な方がいいので<br />
今度から、さくっと、バックアップや移動できるように、<br />
徐々にシステムに依存しにくいフォルダ構成にしようと思います。]]></description>
 <category>レンタルサーバーやcgi</category>
<comments>http://okamerin.com/nc/title/index.php?itemid=335</comments>
 <pubDate>Wed, 2 Nov 2011 13:35:20 +0900</pubDate>
</item><item>
 <title><![CDATA[flashのハンドルを取得してみよう]]></title>
 <link>http://okamerin.com/nc/title/334.htm</link>
<description><![CDATA[    flashのハンドルを取得してみよう。<br>
    <hr style="width: 100%; height: 2px;">
    <div style="text-align: right;">執筆：2011.10.19<br>
      編集：2011.10.19<br>
    </div>
    <hr style="width: 100%; height: 2px;">TWebBrowser.HWNDを取得する方法 (メモ:
    その2)<br>
    flashのハンドルを取得してみよう。<br>
    <br>
    【方法１】 ： Tag名からリストアップする<br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td style="vertical-align: top;">&nbsp; var<br>
            &nbsp;&nbsp;&nbsp; H : THandle;<br>
            &nbsp;&nbsp;&nbsp; i : Integer;<br>
            &nbsp;&nbsp;&nbsp; v_Doccument, v_elems , v_attr : Variant;<br>
            &nbsp;&nbsp;&nbsp; s : string;<br>
            begin<br>
            &nbsp; v_Doccument := WebBrowser1.Document;<br>
            <br>
            &nbsp; if VarIsClear(v_Doccument)<br>
            &nbsp;&nbsp;&nbsp; or<br>
            &nbsp;&nbsp;&nbsp; ('Internet Explorer_Server'<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&gt;
            GetClassNameText(GetWindowHandleFromIDispatch(v_Doccument)))<br>
            &nbsp;&nbsp;&nbsp;&nbsp; then<br>
            &nbsp;&nbsp; begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp; Exit;<br>
            &nbsp;&nbsp; end;<br>
            <br>
            &nbsp; v_elems&nbsp;&nbsp; :=
            v_Doccument.getElementsByTagName('OBJECT');<br>
            &nbsp; if Not VarIsClear(v_elems)<br>
            &nbsp;&nbsp;&nbsp;&nbsp; and (v_elems.length &gt; 0) then<br>
            &nbsp;&nbsp; begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp; s := 'count:
            '+IntToStr(v_elems.length) + sLineBreak;<br>
            &nbsp;&nbsp;&nbsp;&nbsp; for i := 0 to v_elems.length -1 do<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_attr :=
            v_elems.Item(i).getAttribute('CLASSID');<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if Not
            VarIsClear(v_attr)<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            and (VarToStr(v_attr)<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000')<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            then<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            s := s + v_attr + sLineBreak;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            H := GetWindowHandleFromIDispatch(v_elems.Item(i));<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            s := s + ' HWND: ' + IntToStr(H) + sLineBreak + sLineBreak;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>
            &nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(s);<br>
            &nbsp;&nbsp; end;<br>
            end;<br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    【方法２】 ： 子Windowから探す<br>
    flashオブジェクトが htmlの<br>
    最上位に貼り付けられている場合の例です。<br>
    ※iframeなどに入っている場合は、下位階層まで追いかける必要があります。<br>
    <br>
    ※単一のflashが htmlに張り付いている場合。<br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td style="vertical-align: top;">function
            SearchFlashHandle(p_hwnd : HWND) : HWND;<br>
            &nbsp;&nbsp;&nbsp; var<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c_hwnd : HWND;<br>
            begin<br>
            &nbsp; Result := 0;<br>
            &nbsp; c_hwnd := GetWindow(p_hwnd, GW_CHILD );<br>
            &nbsp;&nbsp;&nbsp; while (c_hwnd &gt; 0) do<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //
            ClassName[MacromediaFlashPlayerActiveX]<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
            (Pos('MacromediaFlashPlayerActiveX',<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;




            GetClassNameText(c_hwnd)) = 1) then<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;




            Result := c_hwnd;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;




            break;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            end;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            c_hwnd := GetWindow(c_hwnd, GW_HWNDNEXT );<br>
            &nbsp;&nbsp;&nbsp;&nbsp; end;<br>
            end;</td>
        </tr>
      </tbody>
    </table>
    <br>
    <br>
    使用例 : SetFocusする。<br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td style="vertical-align: top;">h :=
            GetWindowHandleFromIDispatch(WebBrowser1.Document); <br>
            flash_handle := SearchFlashHandle(h);<br>
            if (flash_handle &gt; 0) then<br>
            &nbsp; Windows.SetFocus(flash_handle);<br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    GetWindowHandleFromIDispatch関数については、<br>
    TWebBrowser.HWNDを取得する方法 (メモ: その1)<br>
    に書いてあります。<br>
    <br>
    <br>
    TWebBrowserで、どうしても入力フォーカスを当てたい際に役に立ちます。<br>
    flash以外の他のオブジェクトも同様に応用することができます。<br>
    <br>
    <hr style="width: 100%; height: 2px;"><br>
    さようなら　Delphi<br>
    　レッツゴー&nbsp; ドットネット<br>
    　それいけ　ドットネット<br>
    　　それいけ　C#<br>
    <br>
    <hr style="width: 100%; height: 2px;"><br>]]></description>
 <category>ぷろぐらみんぐ／メモ</category>
<comments>http://okamerin.com/nc/title/index.php?itemid=334</comments>
 <pubDate>Thu, 20 Oct 2011 15:02:26 +0900</pubDate>
</item><item>
 <title><![CDATA[TWebBrowser.HWNDを取得する方法 (メモ: その1)]]></title>
 <link>http://okamerin.com/nc/title/333.htm</link>
<description><![CDATA[    TWebBrowser.HWNDを取得する方法 (メモ: その1)<br>
    <hr style="width: 100%; height: 2px;">
    <div style="text-align: right;">執筆：2011.10.17<br>
      編集：2011.10.17<br>
    </div>
    <hr style="width: 100%; height: 2px;">今日は、<br>
    &nbsp; C#へレッツゴー<br>
    &nbsp; さぁ Delphiなんか捨てて みんなドットネットへ Go !!<br>
    &nbsp; それいけ ドットネット推進派 の 禁断のDelphiネタです。<br>
    <br>
    次期Windows8 の 「<a target="_blank"
      href="http://msdn.microsoft.com/en-us/windows/home/">Windows
      Developer Preview</a>版」が無償公開 されていますが<br>
    もう みなさんは、お使いですか？<br>
    <span style="text-decoration: underline;">※OSのアンインストール機能がないそうなので、インス
      トールは気をつけてください</span><br>
    Visual Studio 11 Expressの同梱版もあり すごいお試し版OSです。<br>
    “Win RunTime（WinRT）”と呼ばれる新しいAPIが追加され<br>
    新しいデスクトップ“Metro”では、新しい“Metro”対応のアプリケーション（“Metro style apps”）<br>
    なんていうものが必要になるそうです。<br>
    キット古い開発環境とアプリを市場から強制排除したいのでしょうね。<br>
    もう、Visual Studio意外に開発環境の選択の余地がないって感じになってきましたね。<br>
    ということで、　ほらほら、　みんなドットネットへ Go !!<br>
    <br>
    では、本題です。<br>
    <br>
    TWebBrowser.HWNDへのアクセスは不正なエラーに なります。<br>
    WebBrowser1.Handleでいいようです。<br>
    <br>
    構造
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td style="vertical-align: top;">　<br>
          </td>
          <td style="vertical-align: top;">ClassName</td>
          <td style="vertical-align: top;">　<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;">親<br>
          </td>
          <td style="vertical-align: top;">- Shell Embedding</td>
          <td style="vertical-align: top;">←
            GetClassName(WebBrowser1.Handle)<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;">子<br>
          </td>
          <td style="vertical-align: top;">-- Shell DocObject View</td>
          <td style="vertical-align: top;">不明</td>
        </tr>
        <tr>
          <td style="vertical-align: top;">孫<br>
          </td>
          <td style="vertical-align: top;">--- Internet Explorer_Server</td>
          <td style="vertical-align: top;">← 操作画面<br>
            解説URL<br>
            <title>HTML clipboard</title>
            <input
value="ms-help://MS.MSDNQTR.v90.ja/accessibility/workshop/browser/accessibility/overview/overview.htm"
              name="T1" size="30"><br>
          </td>
        </tr>
      </tbody>
    </table>
    ページを表示するとコンテンツに応じて 上の３つが、階層構造で多様につながる。<br>
    iframeなどの要素があると多重構造になるようです。<br>
    <br>
    ※ コードを参考にする場合は、自己責任で参考にされてください。<br>
    ※ 十分なテストが必要です。<br>
    ※ 将来的に、仕様などの変更で利用できなくなることも考えられます。<br>
    <br>
    <hr style="width: 100%; height: 2px;">【TWebBrowser.HWNDは、無効なプロパティ】<br>
    &nbsp; (MSDN 文書番号: 244310)：<br>
    　※要約 子WindowをたどっていくとHandleを取得することができます。
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td style="vertical-align: top;">※ TWebBrowser.HWND <br>
          </td>
          <td style="vertical-align: top;">Web ブラウザの Window
            ハンドルへのアクセスを提供します。</td>
        </tr>
        <tr>
          <td colspan="2" rowspan="1" style="vertical-align: top;">※
            Delphiでは、TWebBrowser.HWNDは使えません。</td>
        </tr>
        <tr>
          <td style="vertical-align: top;">コード</td>
          <td style="vertical-align: top;">WebBrowser1.HWND;</td>
        </tr>
        <tr>
          <td style="vertical-align: top;">実行結果</td>
          <td style="vertical-align: top;">デバッガ例外通知<br>
            &nbsp;プロジェクト は例外クラス EOleException （メッセージ
            'エラーを特定できません'）を送出しました。</td>
        </tr>
      </tbody>
    </table>
    <br>
    <hr style="width: 100%; height: 2px;">【HTML要素からhandleを取得する方法。】
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td colspan="2" rowspan="1" style="vertical-align: top;">ハンドルを
            直接要求する方法<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;"><br>
          </td>
          <td style="vertical-align: top;">// [エラー] : E2010
            'System.TGUID' と 'Ole2.TGUID' には互換性がありません<br>
            const // From Ole2.pas<br>
            &nbsp; IID_IOleWindow: TGUID = (<br>
            &nbsp;
            D1:$00000114;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));<br>
            <br>
            function GetWindowHandleFromIDispatch(disp: IDispatch) :
            HWND;<br>
            &nbsp;var<br>
            &nbsp;&nbsp;&nbsp;&nbsp; h : hwnd;<br>
            &nbsp;&nbsp;&nbsp;&nbsp; Res : HRESULT;<br>
            &nbsp;&nbsp;&nbsp;&nbsp; oWin : IOleWindow; // Unit
            ActiveX.pas<br>
            begin<br>
            &nbsp; // example:
            GetWindowHandleFromIDispatch(WebBrowser1.Document)<br>
            &nbsp; Result := 0;<br>
            &nbsp; Res := disp.QueryInterface(IID_IOleWindow, oWin);<br>
            &nbsp; if Succeeded(Res) then<br>
            &nbsp;&nbsp; begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp; Res := OWin.GetWindow(h);<br>
            &nbsp;&nbsp;&nbsp;&nbsp; if (SUCCEEDED(Res)) then<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := h;<br>
            &nbsp;&nbsp; end;<br>
            end;<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;">使<br>
            い<br>
            方<br>
          </td>
          <td style="vertical-align: top;">// Class : Internet
            Explorer_Server<br>
            h := GetHTMLObjectWindowHandle(WebBrowser1.Document);<br>
            if (h &gt; 0) then<br>
            &nbsp; Windows.SetFocus(h);</td>
        </tr>
        <tr>
          <td colspan="2" rowspan="1" style="vertical-align: top;">(参考)正
            規のhtml要素のfocusの使い方<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;">&nbsp;<br>
          </td>
          <td style="vertical-align: top;">// HtmlElement から直接呼び出す場合<br>
            // HtmlElement.focus();<br>
            &nbsp; var<br>
            &nbsp;&nbsp;&nbsp; v : Variant;<br>
            begin<br>
            &nbsp; v_Doccument := WebBrowser1.Document;<br>
            &nbsp; if Not VarIsClear(v_Doccument) then<br>
            &nbsp;&nbsp;&nbsp; v_Doccument.focus();<br>
            <br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;">&nbsp;<br>
          </td>
          <td style="vertical-align: top;">&nbsp; var<br>
            &nbsp;&nbsp;&nbsp; v_Doccument, v_elems : Variant;<br>
            begin<br>
            &nbsp; v_Doccument := WebBrowser1.Document;<br>
            &nbsp; if VarIsClear(v_Doccument) then exit;<br>
            &nbsp; v_elems&nbsp;&nbsp; :=
            v_Doccument.getElementsByName('ここにhtml要素の名前');<br>
            &nbsp; if Not VarIsClear(v_elems)<br>
            &nbsp;&nbsp;&nbsp;&nbsp; and (v_elems.length &gt; 0) then<br>
            &nbsp;&nbsp;&nbsp;&nbsp; v_elems.Item(0).focus();<br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    擬似キー入力を送るコード：Function Key<br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td style="vertical-align: top;">&nbsp; var<br>
            &nbsp;&nbsp;&nbsp; H : THandle;<br>
            begin<br>
            &nbsp; h :=
            GetWindowHandleFromIDispatch(WebBrowser1.Document);<br>
            &nbsp; Windows.PostMessage(H , WM_KEYDOWN, VK_F1 , 0);<br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    擬似キー入力を送るコード：通常文字<br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td style="vertical-align: top;">&nbsp; var<br>
            &nbsp;&nbsp;&nbsp; H : THandle;<br>
            begin<br>
            &nbsp; h :=
            GetWindowHandleFromIDispatch(WebBrowser1.Document);<br>
            &nbsp; Windows.PostMessage(H , WM_CHAR, Byte('a') , 0);<br>
            end;<br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    ALT+F4(終了)を呼びたい場合は<br>
    WM_SYSKEYDOWN を使います<br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td colspan="3" rowspan="1" style="vertical-align: top;">Windows.PostMessage(TargetHandle


            , <br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;


            WM_SYSKEYDOWN , wParam, lParam);</td>
        </tr>
        <tr>
          <td style="vertical-align: top;"><br>
          </td>
          <td style="vertical-align: top;">wParam<br>
          </td>
          <td style="vertical-align: top;">lParam<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">VK_F4 + ALT</td>
          <td style="text-align: center;">VK_F4&nbsp; <br>
          </td>
          <td style="text-align: center;">1 shl 29</td>
        </tr>
      </tbody>
    </table>
    <br>
    VK_F1<br>
    <div style="margin-left: 40px;">IEのF1(ヘルプ)の呼び出しは、反応しないのでわかりません。<br>
      Firefox系の他のブラウザでは反応します。<br>
    </div>
    <br>
    テキストボックスに文字列をいれるだけなら、<br>
    普通にgetElementsByNameやgetElementByIdなどで<br>
    要素にアクセスして代入した方が安全に入力できます。<br>
    <br>
    普通にテキストボックスに入力する方法<br>
    ( 応用例：ログインIDなどの自動入力 )<br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td colspan="2" rowspan="1" style="vertical-align: top;">例<br>
            &nbsp; v_elems.Item(0).innerText := 'abc';<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;">&nbsp;</td>
          <td style="vertical-align: top;">.innerText</td>
        </tr>
        <tr>
          <td style="vertical-align: top;">&nbsp;<br>
          </td>
          <td style="vertical-align: top;">.innerHTML</td>
        </tr>
        <tr>
          <td style="vertical-align: top;">コンボボックス<br>
            (selectタグのoption要素) <br>
          </td>
          <td style="vertical-align: top;">e.options[e.selectedIndex].text<br>
            e.options[e.selectedIndex].value<br>
          </td>
        </tr>
      </tbody>
    </table>
    使い方は、基本的にJavaScriptと同じ。<br>
    <br>
    <hr style="width: 100%; height: 2px;">【一番上のShell DocObject View の
    HWND 取得方法】<br>
    &nbsp; GetWindow(WebBrowser1.Handle, GW_CHILD )<br>
    　※ ClassNameで、確認した方がいい　、　GW_HWNDNEXT<br>
    &nbsp; Navigateでフォルダを指定した場合、エクスプローラーが内蔵されるので注意。　SysListView32などが現れる。<br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td style="vertical-align: top;">function
            GetWebBrowser_Root_ShellDocObject_Handle(AWebBrowser :
            TWebBrowser) : hwnd;<br>
            // Shell DocObject View<br>
            &nbsp;var<br>
            &nbsp;&nbsp; h : hwnd;<br>
            begin<br>
            &nbsp; h := GetWindow(AWebBrowser.Handle, GW_CHILD );<br>
            &nbsp; while (h &gt; 0) do<br>
            &nbsp; begin<br>
            &nbsp;&nbsp;&nbsp; if (Pos('Shell DocObject View',
            GetClassNameText(h)) = 1) then<br>
            &nbsp;&nbsp;&nbsp;&nbsp; begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := h;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Break;<br>
            &nbsp;&nbsp;&nbsp;&nbsp; end;<br>
            &nbsp;&nbsp;&nbsp; h := GetWindow(h, GW_HWNDNEXT );<br>
            &nbsp; end;<br>
            end;<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;">function
            GetWebBrowser_Root_IE_Server_Handle(AWebBrowser :
            TWebBrowser) : hwnd;<br>
            // Internet Explorer_Server<br>
            &nbsp;var<br>
            &nbsp;&nbsp; h : hwnd;<br>
            &nbsp;&nbsp; h_child : hwnd;<br>
            begin<br>
            &nbsp; h := GetWindow(AWebBrowser.Handle, GW_CHILD );<br>
            &nbsp; while (h &gt; 0) do<br>
            &nbsp; begin<br>
            &nbsp;&nbsp;&nbsp; if (Pos('Shell DocObject View',
            GetClassNameText(h)) = 1) then<br>
            &nbsp;&nbsp;&nbsp;&nbsp; begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h_child := GetWindow(h,
            GW_CHILD );<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (h_child &gt; 0)
            do<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
            (Pos('Internet Explorer_Server',<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;






            GetClassNameText(h_child)) = 1) then<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;






            Result := h_child;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;






            break;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            end;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            h_child := GetWindow(h_child, GW_HWNDNEXT );<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Result &gt; 0) then<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Break;<br>
            &nbsp;&nbsp;&nbsp;&nbsp; end;<br>
            &nbsp;&nbsp;&nbsp; h := GetWindow(h, GW_HWNDNEXT );<br>
            &nbsp; end;<br>
            end;<br>
          </td>
        </tr>
      </tbody>
    </table>
    &nbsp; <br>
    <hr style="width: 100%; height: 2px;">【場所から取得する方法】<br>
    ・ ChildWindowFromPoint関数を使用します。<br>
    <br>
    <hr style="width: 100%; height: 2px;">ついでに、それいけみんなドットネットなので<br>
    <br>
    C#で、ハンドルにメッセージを送る方法は<br>
    知らないので<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    [System.Runtime.InteropServices.DllImport("user32.dll")]<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private extern static
    System.Boolean PostMessage(<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.IntPtr
    hWnd,&nbsp; <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.UInt32
    Msg,<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Int32
    wParam,<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Int32
    lParam);<br>
    で回避することができる。<br>
    <br>]]></description>
 <category>General</category>
<comments>http://okamerin.com/nc/title/index.php?itemid=333</comments>
 <pubDate>Wed, 19 Oct 2011 18:58:46 +0900</pubDate>
</item><item>
 <title><![CDATA[C#で WebBrowserを使ってみよう(その１)]]></title>
 <link>http://okamerin.com/nc/title/332.htm</link>
<description><![CDATA[   C#で WebBrowserを使ってみよう(その１)<br>
    <hr style="width: 100%; height: 2px;">
    <div style="text-align: right;">執筆：2011.10.15<br>
      編集：2011.10.16<br>
    </div>
    <hr style="width: 100%; height: 2px;"><br>
    Delphiで作ると<span style="text-decoration: underline; font-weight:
      bold;">実行ファイルが大きくなる</span><span style="font-weight: bold;">し、</span><span
      style="font-weight: bold; text-decoration: underline;">Tabで
      WebBrowserコ ントロール内に移動できない</span>ので<br>
    <br>
    さぁ C#だー<br>
    　はっはっはっ！<br>
    　　って 試験動作させると<br>
    　&nbsp;&nbsp; 瞬時に ずっこけました。<br>
    <br>
    OnNewWindowで、Dispatchが設定したかったのです。<br>
    <br>
    他にもいっぱいあるのですけど<br>
    NewWindowでDelphi相当の機能が実装されていないのです。<br>
    開くURLも取得できないし、Dispatchも設定できないなんて、酷い(ひどい)話です。<br>
    <br>
    .Netには、なんの嫌がらせか知りませんが、本来つけておくべきイベントがたくさんないのです。<br>
    <br>
    なんでもかんでも<br>
    新しいWindowで開くで、IEに送るのでは、WebBrowserを内蔵する意味がほとんどないでしょ。<br>
    (※IEに送るとセッションCookie？が引き継がれないから問題なんです。)<br>
    <br>
    ということで、<br>
    .NetのWebBrowserを拡張して本来あるべきイベントを追加して対処しました。<br>
    <br>
    <table style=" text-align: left;" border="1" cellpadding="2"
      cellspacing="2">
      <tbody>
        <tr>
          <td style="vertical-align: top;"><br>
          </td>
          <td style="vertical-align: top;">&nbsp;private void
            exWebBrowser1_NewWindow3(<br>
            &nbsp;&nbsp;&nbsp; object sender, <br>
            &nbsp;&nbsp;&nbsp; WebBrowserExtendedNewWindow3EventArgs e)<br>
            &nbsp;{<br>
            &nbsp;&nbsp;&nbsp;&nbsp; // メモ<br>
            &nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; (1)e.pDisp
            に設定しない。新しいIEとして開く。<br>
            &nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; (2)e.pDisp
            を設定する。指定したWebBrowserで開く。<br>
            &nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;
            ※同じWebBrowserでは、e.pDispは、動作しない。<br>
            &nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;
            (3)同じWebBrowserで開く。キャンセルNavigateを呼ぶ。<br>
            &nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;
            ※POSTなどが失われるので注意。<br>
            &nbsp;&nbsp;&nbsp;&nbsp; // MessageBox.Show((string) e.URL);<br>
            &nbsp;&nbsp;&nbsp;&nbsp; // open as self WebBrowser<br>
            &nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; e.Cancel = true;
            exWebBrowser1.Navigate((string) e.URL);<br>
            &nbsp;&nbsp;&nbsp;&nbsp; // open as new WebBrowser<br>
            &nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; e.pDisp =
            exWebBrowser2.ActiveXInstance;<br>
            &nbsp;}</td>
        </tr>
        <tr>
          <td style="vertical-align: top;"><br>
          </td>
          <td style="vertical-align: top;">// using
            System.Runtime.InteropServices;<br>
            &nbsp;&nbsp;&nbsp; public event
            EventHandler&lt;WebBrowserExtendedNewWindow3EventArgs&gt;
            NewWindow3;<br>
            <br>
            &nbsp;&nbsp;&nbsp; protected void OnNewWindow3( ... 省略<br>
            &nbsp;&nbsp;&nbsp; ..... 省略<br>
            <br>
            &nbsp;&nbsp;&nbsp; [ComImport,
            Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),<br>
            &nbsp;&nbsp;&nbsp;
            InterfaceType(ComInterfaceType.InterfaceIsIDispatch),<br>
            &nbsp;&nbsp;&nbsp; TypeLibType(TypeLibTypeFlags.FHidden)]<br>
            &nbsp;&nbsp;&nbsp; public interface DWebBrowserEvents2<br>
            &nbsp;&nbsp;&nbsp; {<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [DispId(273)]<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void NewWindow3(<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [In,
            Out, MarshalAs(UnmanagedType.IDispatch)] ref object pDisp,<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [In,
            Out] ref bool cancel,<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [In]
            ref object flags,<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [In]
            ref object URLContext,<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [In]
            ref object URL);<br>
            &nbsp;&nbsp;&nbsp; }<br>
            <br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top;"><br>
          </td>
          <td style="vertical-align: top;">読者に作る機会を与え、動作原理を理解させるために<br>
            あえて、完全なコードは開示していません。<br>
            不足分は、参考サイトを見ながら完成させましょう。<br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    参考にした フォーラム が型とか ウソ書いていたので<br>
    少し手間だったヨ。<br>
    <br>
    ◎よくできました<br>
    とりあえず、目的の動作をするようにしたのでので「よし」としよう。<br>
    <br>
    <br>
    【参考サイト】<br>
    <ul>
      <li>webBrowserで別のウインドウで開くときの開く先のＵＲＬの取得法<br>
        とその中のリンク記事<br>
        （VSUG フォーラム → .NET 開発&nbsp; → Visual C#&nbsp; →
        webBrowserで別のウインドウで開くときの開く先のＵＲＬの取得法）</li>
      <li>MSDN Library for Visual Studio 2008<br>
        ・CreateSink メソッド （使用例）<br>
        ・他<br>
      </li>
    </ul>
    <br>]]></description>
 <category>ぷろぐらみんぐ／メモ</category>
<comments>http://okamerin.com/nc/title/index.php?itemid=332</comments>
 <pubDate>Mon, 17 Oct 2011 10:33:43 +0900</pubDate>
</item>
  </channel>
</rss>
