<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>はみ出しRAPTの戯言</title><link>http://blogs.wankuma.com/rapt/</link><description>- a day after yesterday -</description><managingEditor>RAPT</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>RAPT</dc:creator><title>近況報告</title><link>http://blogs.wankuma.com/rapt/archive/2015/01/27/502424.aspx</link><pubDate>Tue, 27 Jan 2015 00:08:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2015/01/27/502424.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/502424.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2015/01/27/502424.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/502424.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/502424.aspx</trackback:ping><description>&lt;p&gt;いつの間にか iPhone アプリ開発者になって早二年。&lt;br /&gt;
この記事を書いている Windows 機の脇には Mac Book Pro が居ます。&lt;/p&gt;

&lt;p&gt;久しぶりに Windows の開発を行なうと手順が思い出せなくて焦るｗ&lt;/p&gt;

&lt;p&gt;エクスプローラーでファイル名を変更するのに、F2 キーではなく、つい Enter キーを押していたり。&lt;br /&gt;
※Mac 標準のキーバインドでは、Finder（Windows のエクスプローラー）では、return でファイル名変更なのです。&lt;/p&gt;

&lt;p&gt;一番つらいのは、Mac 版の Excel の動作が Windows 版と互換性がない点かな。&lt;br /&gt;
セルの編集が F2 キーではなく、control+U とか、&lt;br /&gt;
セル内改行が Alt+Enter ではなく command+control+return だったり。&lt;/p&gt;

&lt;p&gt;Windows 機と Mac Book Pro との間でのファイル受け渡しは Bluetooth です。&lt;br /&gt;
通信速度は遅いけど、特に何を抜き差ししなくてよいのが最大の利点。&lt;br /&gt;
インターネットも要らないし。&lt;br /&gt;
Air Drop が使えたら最高なんだけど。&lt;/p&gt;

&lt;p&gt;取りあえず生きてます。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/502424.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>[VC++] プロセスの生存確認</title><link>http://blogs.wankuma.com/rapt/archive/2012/05/19/271682.aspx</link><pubDate>Sat, 19 May 2012 05:13:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2012/05/19/271682.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/271682.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2012/05/19/271682.aspx#Feedback</comments><slash:comments>192</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/271682.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/271682.aspx</trackback:ping><description>&lt;p&gt;&lt;span style="color: green; font-size: 150%; font-weight: bold;"&gt;プロセス間通信&lt;/span&gt;をしたりとか、他プロセスが落ちたりしたときに何かしたい、という場合があります。&lt;/p&gt;

&lt;p&gt;監視したい相手プロセスのプロセス ID だけあるとき、それを基に&lt;span style="color: green; font-size: 150%; font-weight: bold;"&gt;対象のプロセスが生きているか&lt;/span&gt;をテストするコードです。&lt;/p&gt;


&lt;p&gt;なお、あるプロセスが終了して、別のプロセスが立ち上がった時、&lt;span style="color: brown; font-size: 130%; font-weight: bold;"&gt;たまたま同じプロセス ID&lt;/span&gt; が使用されることがあります。&lt;br&gt;
これを回避するには、監視対象のプロセス ID が判明した時点で、プロセスハンドルを取得しておくのがよいかと思います。&lt;/p&gt;


&lt;div style="padding: 0.5em 1em; border: 1px solid blue; background-color: white;"&gt;&lt;p&gt;&lt;code&gt;&lt;font color="#008000"&gt;// VC2010 にてビルド&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;#include&lt;/font&gt; &lt;font color="#ff0000"&gt;&amp;lt;cstdio&amp;gt;&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;#include&lt;/font&gt; &lt;font color="#ff0000"&gt;&amp;lt;cstdlib&amp;gt;&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;#include&lt;/font&gt; &lt;font color="#ff0000"&gt;&amp;lt;conio.h&amp;gt;&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;#include&lt;/font&gt; &lt;font color="#ff0000"&gt;&amp;lt;windows.h&amp;gt;&lt;/font&gt;&lt;br&gt;
&lt;br&gt;
&lt;font color="#008000"&gt;// プロセスの存在確認。消滅していたら true&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;bool&lt;/font&gt; IsProcessGone( &lt;font color="#ff00ff"&gt;DWORD&lt;/font&gt; dwProcessId )&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;HANDLE&lt;/font&gt; hProcess = ::OpenProcess( SYNCHRONIZE, &lt;font color="#ff00ff"&gt;FALSE&lt;/font&gt;, dwProcessId );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ( !hProcess ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;return&lt;/font&gt; &lt;font color="#0000ff"&gt;true&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;const&lt;/font&gt; &lt;font color="#ff00ff"&gt;DWORD&lt;/font&gt; dwWait = ::WaitForSingleObject( hProcess, &lt;font color="#ff0000"&gt;0&lt;/font&gt; );&lt;br&gt;
&amp;nbsp; &amp;nbsp; ::CloseHandle( hProcess );&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;return&lt;/font&gt; ( dwWait == WAIT_OBJECT_0 );&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;font color="#0000ff"&gt;int&lt;/font&gt; main()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;DWORD&lt;/font&gt; dwPID = &lt;font color="#ff0000"&gt;0&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;for&lt;/font&gt; ( ;; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wprintf( &lt;font color="#ff00ff"&gt;L&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;process-id:&amp;quot;&lt;/font&gt; );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ( wscanf_s( &lt;font color="#ff00ff"&gt;L&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;%lu&amp;quot;&lt;/font&gt;, &amp;amp;dwPID ) != &lt;font color="#ff0000"&gt;1&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;break&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ( IsProcessGone( dwPID ) ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wprintf( &lt;font color="#ff00ff"&gt;L&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;=&amp;gt; gone\n&amp;quot;&lt;/font&gt; );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;else&lt;/font&gt; {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wprintf( &lt;font color="#ff00ff"&gt;L&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;=&amp;gt; still alive\n&amp;quot;&lt;/font&gt; );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;return&lt;/font&gt; &lt;font color="#ff0000"&gt;0&lt;/font&gt;;&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/271682.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>[VC++] プロセス ID から実行されている絶対パスを取得</title><link>http://blogs.wankuma.com/rapt/archive/2012/05/06/269441.aspx</link><pubDate>Sun, 06 May 2012 15:32:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2012/05/06/269441.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/269441.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2012/05/06/269441.aspx#Feedback</comments><slash:comments>417</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/269441.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/269441.aspx</trackback:ping><description>&lt;p&gt;プロセス ID からそのプロセスの実行可能ファイルが置かれている場所の絶対パスが知りたい場合があります。&lt;/p&gt;
&lt;p&gt;MSDN をみると、&lt;code style="color: green; font-size: 150%; font-weight: bold;"&gt;GetProcessImageFileName&lt;/code&gt; を使えばよさそうなのですが、&lt;code style="color: brown; font-size: 130%; font-weight: bold;"&gt;"C:\Program Files\hoge\example.exe"&lt;/code&gt; なんてのを期待していると &lt;code style="color: brown; font-size: 130%; font-weight: bold;"&gt;"\Device\HarddiskVolume3\Program Files\hoge\example.exe"&lt;/code&gt; といった謎の形式で返ってきます。&lt;code style="color: brown; font-size: 130%; font-weight: bold;"&gt;"\Device\HarddiskVolume3"&lt;/code&gt; の部分は物理的な所在を意味しているようですが、ここでは普通にドライブ名が欲しい。&lt;/p&gt;
&lt;p&gt;調べてみると &lt;code style="color: green; font-size: 150%; font-weight: bold;"&gt;QueryDosDevice&lt;/code&gt; で &lt;code style="color: brown; font-size: 130%; font-weight: bold;"&gt;"C:"&lt;/code&gt; → &lt;code style="color: brown; font-size: 130%; font-weight: bold;"&gt;"\Device\HarddiskVolume3"&lt;/code&gt; の変換ができるらしい。&lt;/p&gt;

&lt;p&gt;これらを組み合わせればできるんじゃね？　ということで書いてみました。&lt;/p&gt;


&lt;div style="padding: 0.5em 1em; border: 1px solid blue; background-color: white;"&gt;&lt;p&gt;&lt;code&gt;
&lt;font color="#008000"&gt;// VC2010 にてビルド、XP 以降で動作&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;#include&lt;/font&gt; &lt;font color="#ff0000"&gt;&amp;lt;conio.h&amp;gt;&lt;/conio.h&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;#include&lt;/font&gt; &lt;font color="#ff0000"&gt;&amp;lt;unordered_map&amp;gt;&lt;/unordered_map&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;#include&lt;/font&gt; &lt;font color="#ff0000"&gt;&amp;lt;string&amp;gt;&lt;/string&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;#include&lt;/font&gt; &lt;font color="#ff0000"&gt;&amp;lt;windows.h&amp;gt;&lt;/windows.h&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;#include&lt;/font&gt; &lt;font color="#ff0000"&gt;&amp;lt;atlstr.h&amp;gt;&lt;/atlstr.h&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;#include&lt;/font&gt; &lt;font color="#ff0000"&gt;&amp;lt;psapi.h&amp;gt;&lt;/psapi.h&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;#pragma comment&lt;/font&gt; ( &lt;font color="#0000ff"&gt;lib&lt;/font&gt; , &lt;font color="#ff0000"&gt;&amp;quot;psapi.lib&amp;quot;&lt;/font&gt; )&lt;br&gt;
&lt;br&gt;
&lt;font color="#008000"&gt;//プロセス ID から絶対パスを取得する&lt;/font&gt;&lt;br&gt;
&lt;font color="#0000ff"&gt;bool&lt;/font&gt; GetFullPathFromProcessId( &lt;font color="#ff00ff"&gt;DWORD&lt;/font&gt; dwPID, CAtlString* pstrPath )&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// プロセスハンドルを取得&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;HANDLE&lt;/font&gt; hProcess = ::OpenProcess( PROCESS_ALL_ACCESS, &lt;font color="#ff00ff"&gt;FALSE&lt;/font&gt;, dwPID );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ( !hProcess ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;return&lt;/font&gt; &lt;font color="#0000ff"&gt;false&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;bool&lt;/font&gt; bOk = &lt;font color="#0000ff"&gt;false&lt;/font&gt;;&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// デバイス名('\Device\HarddiskVolume3') =&amp;gt; ドライブ文字('C:') の変換マップを作成&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;std&lt;/font&gt;::unordered_map&amp;lt; &lt;font color="#ff00ff"&gt;std&lt;/font&gt;::wstring, &lt;font color="#ff00ff"&gt;std&lt;/font&gt;::wstring &amp;gt; mapDeviceDrive;&lt;br&gt;
&amp;nbsp; &amp;nbsp; {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;WCHAR&lt;/font&gt; szDrive[] = &lt;font color="#ff00ff"&gt;L&lt;/font&gt;&lt;font color="#ff0000"&gt;" :"&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;WCHAR&lt;/font&gt; szDevicePath[ &lt;font color="#ff0000"&gt;4096&lt;/font&gt; ] = {};&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;const&lt;/font&gt; &lt;font color="#ff00ff"&gt;WCHAR&lt;/font&gt; lpszAlpha[] = &lt;font color="#ff00ff"&gt;L&lt;/font&gt;&lt;font color="#ff0000"&gt;"ABCDEFGHIJKLMNOPQRSTUVWXYZ"&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;for&lt;/font&gt; ( &lt;font color="#ff00ff"&gt;size_t&lt;/font&gt; i = &lt;font color="#ff0000"&gt;0&lt;/font&gt;; i &amp;lt; &lt;font color="#ff00ff"&gt;_countof&lt;/font&gt;( lpszAlpha ); ++i ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; szDrive[ &lt;font color="#ff0000"&gt;0&lt;/font&gt; ] = lpszAlpha[ i ];&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;DWORD&lt;/font&gt; dwCopiedLength = ::QueryDosDeviceW( szDrive, szDevicePath, &lt;font color="#ff00ff"&gt;_countof&lt;/font&gt;( szDevicePath ) );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ( dwCopiedLength ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mapDeviceDrive.insert( &lt;font color="#ff00ff"&gt;std&lt;/font&gt;::&lt;font color="#ff00ff"&gt;make_pair&lt;/font&gt;( &lt;font color="#ff00ff"&gt;std&lt;/font&gt;::wstring( szDevicePath ), &lt;font color="#ff00ff"&gt;std&lt;/font&gt;::wstring( szDrive ) ) );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// 実行可能ファイル名を取得&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;WCHAR&lt;/font&gt; szImage[ &lt;font color="#ff00ff"&gt;MAX_PATH&lt;/font&gt; ] = {};&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;DWORD&lt;/font&gt; dwCopiedLength = ::GetProcessImageFileNameW( hProcess, szImage, &lt;font color="#ff00ff"&gt;_countof&lt;/font&gt;( szImage ) );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ( dwCopiedLength ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// デバイスパスをドライブ名に置換&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CAtlString strImagePath( szImage );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;for each&lt;/font&gt; ( &lt;font color="#0000ff"&gt;const&lt;/font&gt; &lt;font color="#0000ff"&gt;auto&lt;/font&gt;&amp;amp; item &lt;font color="#0000ff"&gt;in&lt;/font&gt; mapDeviceDrive ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// 先頭でのみマッチさせる&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ( strImagePath.Left( item.first.size() ) == item.first.c_str() ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; strImagePath.Delete( &lt;font color="#ff0000"&gt;0&lt;/font&gt;, item.first.size() - &lt;font color="#ff0000"&gt;2&lt;/font&gt; );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; strImagePath.SetAt( &lt;font color="#ff0000"&gt;0&lt;/font&gt;, item.second[ &lt;font color="#ff0000"&gt;0&lt;/font&gt; ] );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; strImagePath.SetAt( &lt;font color="#ff0000"&gt;1&lt;/font&gt;, &lt;font color="#ff00ff"&gt;L&lt;/font&gt;&lt;font color="#ff0000"&gt;':'&lt;/font&gt; );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;break&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// ショートファイル名をロングファイル名に変換&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;WCHAR&lt;/font&gt; szLongPath[ &lt;font color="#ff00ff"&gt;MAX_PATH&lt;/font&gt; * &lt;font color="#ff0000"&gt;2&lt;/font&gt; ] = {};&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dwCopiedLength = ::GetLongPathNameW( strImagePath, szLongPath, &lt;font color="#ff00ff"&gt;_countof&lt;/font&gt;( szLongPath ) );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ( dwCopiedLength ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *pstrPath = szLongPath;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bOk = &lt;font color="#0000ff"&gt;true&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; ::CloseHandle( hProcess );&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;return&lt;/font&gt; bOk;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;font color="#0000ff"&gt;int&lt;/font&gt; main()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;DWORD&lt;/font&gt; dwPID = &lt;font color="#ff0000"&gt;0&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;for&lt;/font&gt; ( ;; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wprintf( &lt;font color="#ff00ff"&gt;L&lt;/font&gt;&lt;font color="#ff0000"&gt;"process-id:"&lt;/font&gt; );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ( wscanf_s( &lt;font color="#ff00ff"&gt;L&lt;/font&gt;&lt;font color="#ff0000"&gt;"%lu"&lt;/font&gt;, &amp;amp;dwPID ) != &lt;font color="#ff0000"&gt;1&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;break&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CAtlString strPath;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ( GetFullPathFromProcessId( dwPID, &amp;amp;strPath ) ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wprintf( &lt;font color="#ff00ff"&gt;L&lt;/font&gt;&lt;font color="#ff0000"&gt;"=&amp;gt; %s\n"&lt;/font&gt;, strPath.GetString() );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;return&lt;/font&gt; &lt;font color="#ff0000"&gt;0&lt;/font&gt;;&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/269441.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>Gavotte Ramdisk を Windows 7 x64 で使う</title><link>http://blogs.wankuma.com/rapt/archive/2010/04/26/188431.aspx</link><pubDate>Mon, 26 Apr 2010 15:24:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2010/04/26/188431.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/188431.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2010/04/26/188431.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/188431.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/188431.aspx</trackback:ping><description>&lt;h3&gt;概要&lt;/h3&gt;
&lt;p&gt;Windows 7 x64 環境で、フリーの Gavotte Ramdisk を使いたい。&lt;br&gt;
ところが、Gavotte Ramdisk のドライバは署名されていないので、そのままでは x64 環境にインストールできない。&lt;br&gt;
巷にはブート中に自動的に [F8] を押して、ドライバの署名を無視して、といった手法がみられるが、これはやりたくない。&lt;br&gt;
そのため、オレオレ証明書を作り、自己署名することでドライバのインストールブロッキングを回避する。&lt;br&gt;
x64 用ドライバは、&lt;code&gt;rramdisk64.sys&lt;/code&gt; なので、これを署名する。&lt;br&gt;
下記で、署名パスワードは &amp;quot;hogehoge&amp;quot; にしているので、適宜変更すること。&lt;br&gt;
※Vista 以降の環境では、コマンドプロンプトを「管理者として実行」にする必要あり。&lt;br&gt;
&lt;/p&gt;
&lt;h3&gt;ドライバを署名する&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&amp;displaylang=en" title="MS:Download details: Windows&amp;reg; Server 2003 SP1 Platform SDK Web Install"&gt;Windows&amp;reg; Server 2003 SP1 Platform SDK Web Install&lt;/a&gt; に含まれている署名ツールをインストール&lt;/li&gt;
&lt;li&gt;証明書(.cer)と秘密鍵(.pvk)を作る(パスワードはすべて同一のものを指定)
&lt;br&gt;&lt;code&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/library/bfsktky3(VS.80).aspx" title="MSDN:証明書作成ツール (Makecert.exe)"&gt;makecert&lt;/a&gt; -sv rramdisk64.pvk -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -ss Root -len 1024 -sr localMachine -n CN=&amp;quot;rramdisk64.sys&amp;quot; rramdisk64.cer&lt;/code&gt;
&lt;br&gt;-keu 1.3.6.1.5.5.7.3.3 はコード署名
&lt;br&gt;CN=&amp;quot;xxxx&amp;quot; は発行元&lt;/li&gt;
&lt;li&gt;証明書(.cer)からソフトウェア発行元証明書(.spc)ファイルを作る
&lt;br&gt;&lt;code&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/library/f657tk8f(VS.80).aspx" title="MSDN:ソフトウェア発行元証明書テスト ツール (Cert2spc.exe)"&gt;cert2spc&lt;/a&gt; rramdisk64.cer rramdisk64.spc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ソフトウェア発行元証明書(.spc)と秘密鍵(.pvk)からキーペア(.pfx)ファイルを作る
&lt;br&gt;&lt;code&gt;pvk2pfx -pvk rramdisk64.pvk -pi hogehoge -spc rramdisk64.spc -pfx rramdisk64.pfx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;署名ツールでターゲットファイルに電子署名する
&lt;br&gt;&lt;code&gt;signtool sign /f rramdisk64.pfx /p hogehoge /d &amp;quot;rramdisk64.sys&amp;quot; /v rramdisk64.sys&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;証明書のインストール&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;rramdisk64.pfx&lt;/code&gt; を右クリックして「インストール」&lt;/li&gt;
&lt;li&gt;[パスワード] で hogehoge を入力し、「すべての拡張プロパティを含める」にチェック&lt;/li&gt;
&lt;li&gt;[証明書ストア] で「証明書をすべて次のストアに配置する」にチェック&lt;/li&gt;
&lt;li&gt;「物理ストアを表示する」にチェック&lt;/li&gt;
&lt;li&gt;「信頼されたルート証明機関\レジストリ」を選択&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;ドライバのインストール&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ram4g.reg&lt;/code&gt; をダブルクリックしてインストール&lt;/li&gt;
&lt;li&gt;管理者権限で、普通にコマンドプロンプトを出す&lt;/li&gt;
&lt;li&gt;ブート構成データ エディタで、デジタル署名取得を無効化する
&lt;br&gt;&lt;code&gt;bcdedit /set TESTSIGNING ON&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;PC を再起動&lt;/li&gt;
&lt;li&gt;「ファイル名を指定して実行」で &lt;code&gt;hdwwiz&lt;/code&gt; を入力し、ハードウェアの追加ウィザードを開く&lt;/li&gt;
&lt;li&gt;「一覧から選択したハードウェアをインストールする」にチェックし「次へ」&lt;/li&gt;
&lt;li&gt;「すべてのデバイスを表示」を選択して「次へ」&lt;/li&gt;
&lt;li&gt;「ディスク使用」をクリック&lt;/li&gt;
&lt;li&gt;「製造元のファイルのコピー元」で上記で証明した &lt;code&gt;rramdisk64.sys&lt;/code&gt; のあるフォルダを指定&lt;/li&gt;
&lt;li&gt;これで次々と表示される警告にめげずにクリックしていくと成功&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Ramdisk の作成&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ramdisk.exe&lt;/code&gt; を右クリックして「管理者として実行」&lt;/li&gt;
&lt;li&gt;「Install Ramdisk」をクリック&lt;/li&gt;
&lt;li&gt;今回は RamDisk を 5GB 使いたいので「Data Size」に「5G」と入力。プルダウンには 3G までしかないが、手入力 OK&lt;/li&gt;
&lt;li&gt;「Drive Letter」も「R:」のままでいいので、そのまま&lt;/li&gt;
&lt;li&gt;Media Type も「Fixed Media」のままで OK&lt;/li&gt;
&lt;li&gt;「OK」をクリック&lt;/li&gt;
&lt;li&gt;PC を再起動&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これで無事に RAM ドライブが使えるようになりました(^^&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/188431.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>Windows 7 のタスクスケジューラでバッチファイルを実行する</title><link>http://blogs.wankuma.com/rapt/archive/2010/04/22/188276.aspx</link><pubDate>Thu, 22 Apr 2010 16:27:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2010/04/22/188276.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/188276.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2010/04/22/188276.aspx#Feedback</comments><slash:comments>2086</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/188276.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/188276.aspx</trackback:ping><description>&lt;P&gt;今まで Windows XP のタスクスケジューラで、毎日一定時刻にバックアップを取るようにしていたが、&lt;BR&gt;PC の劣化に伴い、データ載せ替えの際、OS を Windows 7 にした。&lt;/P&gt;
&lt;P&gt;データの移行は、NIC 同士を LAN ケーブルでつないで、手動で IP アドレスを設定し、フォルダ共有で&lt;BR&gt;ファイルを受け渡しするという単純作業で楽にできた。&lt;/P&gt;
&lt;P&gt;タスクスケジューラで使用していたバッチファイルもコピーし、なんとなくタスクを設定してみたが、&lt;BR&gt;翌朝動作を確認したら、コピーできていなかった。&lt;/P&gt;
&lt;P&gt;ここで、散々設定を見直したり、ヘルプを見たり、ググったりしてみたが、一向に解決できず。&lt;/P&gt;
&lt;P&gt;丸一日かけてどうやら解決策が判明したっぽいので備忘録として記す。&lt;BR&gt;かなりハマった上に、情報の少なさときたら！&lt;BR&gt;とりあえず色々と試行錯誤したところ、下記でうまくいった。&lt;/P&gt;
&lt;P&gt;タスクスケジューラの起動：[スタート]-[管理ツール]-[タスク スケジューラ]&lt;/P&gt;
&lt;P&gt;新しいタスクの作成：&lt;BR&gt;[全般] タブ：&lt;BR&gt;[名前] には分かりやすい名前を。「夜間バックアップ」とか。。&lt;BR&gt;（後で変更できないっぽい。C:\Windows\System32\Tasks にあるファイル名を変更すれば可能？　未検証。）&lt;BR&gt;（※[最上位の特権で実行する] にチェックを入れると、バッチファイル内でフォルダを作ったりするとアクセス権が設定されてしまう。）&lt;/P&gt;
&lt;P&gt;[全般] タブ：&lt;BR&gt;[ユーザーがログオンしているかどうかにかかわらず実行する]?にチェック&lt;/P&gt;
&lt;P&gt;[トリガー] タブ：&lt;BR&gt;[新規] で、[スケジュールに従う] / [毎日] / [有効]&lt;/P&gt;
&lt;P&gt;[操作] タブ：&lt;BR&gt;[プログラムの開始]&lt;BR&gt;[プログラム/スクリプト] に実行したいバッチファイルのフルパス ("C:\Program Files (x86)\FastCopy\NightlyBackup.bat" など)&lt;BR&gt;[開始（オプション）] に上記で指定した&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;バッチファイルの作業フォルダ&lt;/STRONG&gt;&lt;/FONT&gt;を入れる。※パスにスペースがあったとしても、ここでは&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;ダブルクォーテーションを入れてはダメ&lt;/STRONG&gt;&lt;/FONT&gt;。&lt;/P&gt;
&lt;P&gt;[履歴] タブは規定では無効となっているが、タスクスケジューラのメイン画面右側にある「操作」ウィンドウ内の「すべてのタスク履歴を有効にする」を選択することで有効になる。&lt;BR&gt;（※この設定はここ以外からは設定できなさげ。起動時のウィンドウサイズでは、ここのテキストが省略され、読めなくなっていたため、ヘルプを見てもどこに設定があるか見つけられなかった。）&lt;/P&gt;
&lt;P&gt;上記まで入力後、OK ボタンを押下すると、実行ユーザーの認証用パスワードを要求され、正しく入力するとタスクが正常に追加される。&lt;/P&gt;
&lt;P&gt;追加したタスクの有効/無効の切り替えなどは、プロパティを開いても変更できるが、先ほどの「操作」ウィンドウで変更した方が便利。&lt;/P&gt;
&lt;P&gt;?&lt;/P&gt;
&lt;P&gt;さて、これでうまくいくはずだ。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/188276.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>IE7 以降で HttpOpenRequest() API が エラーコード 12006 で失敗する件</title><link>http://blogs.wankuma.com/rapt/archive/2009/01/14/166330.aspx</link><pubDate>Wed, 14 Jan 2009 02:51:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2009/01/14/166330.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/166330.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2009/01/14/166330.aspx#Feedback</comments><slash:comments>1462</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/166330.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/166330.aspx</trackback:ping><description>&lt;p&gt;IE7 以降で &lt;strong&gt;HttpOpenRequest&lt;/strong&gt;() API が エラーコード 12006 で失敗する件&lt;/p&gt;
&lt;p&gt;プログラム上からインターネットに接続して直接ファイルをダウンロードしたい場合などに、&lt;strong&gt;InternetOpen&lt;/strong&gt;/&lt;strong&gt;InternetConnect&lt;/strong&gt;/&lt;strong&gt;HttpOpenRequest&lt;/strong&gt; API を使って下記のようなコードを使用すると思うが、このコードは IE6 以前では問題なく動作するが、IE7 以降では失敗する。&lt;/p&gt;
&lt;DIV style="BORDER-RIGHT: blue 1px solid; PADDING-RIGHT: 1em; BORDER-TOP: blue 1px solid; PADDING-LEFT: 1em; PADDING-BOTTOM: 0.5em; BORDER-LEFT: blue 1px solid; PADDING-TOP: 0.5em; BORDER-BOTTOM: blue 1px solid; BACKGROUND-COLOR: white"&gt;&lt;p&gt;&lt;code&gt;&lt;font color='#ff00ff'&gt;HINTERNET&lt;/font&gt; hSession = ::InternetOpen( &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;UserAgent&amp;quot;&lt;/font&gt; ), INTERNET_OPEN_TYPE_PRECONFIG, &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt;, &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt;, &lt;font color='#ff0000'&gt;0&lt;/font&gt; );&lt;br&gt;
&lt;font color='#ff00ff'&gt;HINTERNET&lt;/font&gt; hConnect = ::InternetConnect( hSession, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;www.example.com&amp;quot;&lt;/font&gt; ), &lt;font color='#ff0000'&gt;80&lt;/font&gt;, &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt;, &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt;, INTERNET_SERVICE_HTTP, &lt;font color='#ff0000'&gt;0&lt;/font&gt;, &lt;font color='#ff0000'&gt;0&lt;/font&gt; );&lt;br&gt;
&lt;font color='#ff00ff'&gt;HINTERNET&lt;/font&gt; hRequest = ::HttpOpenRequest( hConnect, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;GET&amp;quot;&lt;/font&gt; ), &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;/~user/path/file.txt&amp;quot;&lt;/font&gt; ), &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt;, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;Referrer&amp;quot;&lt;/font&gt; ), &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt;, INTERNET_FLAG_DONT_CACHE, &lt;font color='#ff0000'&gt;0&lt;/font&gt; );&lt;br&gt;
&lt;font color='#0000ff'&gt;if&lt;/font&gt; ( hRequest == &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#ff00ff'&gt;DWORD&lt;/font&gt; dwError = ::GetLastError();&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#0000ff'&gt;if&lt;/font&gt; ( dwError == ERROR_INTERNET_UNRECOGNIZED_SCHEME &lt;font color='#008000'&gt;/*12006*/&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color='#ff00ff'&gt;ATLTRACE&lt;/font&gt;( &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;スキームが認識できないエラー\n&amp;quot;&lt;/font&gt; ) );&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;font color='#008000'&gt;// (snip)&lt;/font&gt;&lt;br&gt;
&lt;br&gt;
::InternetCloseHandle( hRequest );&lt;br&gt;
::InternetCloseHandle( hConnect );&lt;br&gt;
::InternetCloseHandle( hSession );&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;原因は、&lt;strong&gt;HttpOpenRequest&lt;/strong&gt;() でリファラに「Referrer」と記述しているがこの形式が「スキーム:識別子」の形式になっていないことによるものらしい。これをたとえば「myscheme:Referrer」に変更することで上記コードは IE7 以降でも正常に動作する。&lt;/p&gt;
&lt;p&gt;なぜ IE7 以降で動作しなくなったかは不明だが、これにはかなりハマったので記事にして残しておくことにした。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/166330.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>IE8 Beta2 で User-Agent が変更できない問題</title><link>http://blogs.wankuma.com/rapt/archive/2009/01/14/166328.aspx</link><pubDate>Wed, 14 Jan 2009 02:21:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2009/01/14/166328.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/166328.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2009/01/14/166328.aspx#Feedback</comments><slash:comments>32</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/166328.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/166328.aspx</trackback:ping><description>&lt;p&gt;IE8 Beta2 で User-Agent が変更できない問題&lt;/p&gt;
&lt;p&gt;今更ネタにするものでもないけど、去年の夏に IEβニュースグループに投稿した記事と同じ内容をここにも書いておく。&lt;/p&gt;
&lt;p&gt;VC6/VC2003 で Trident コンポーネントを使ったプログラムを作成しているときの話。&lt;br&gt;
プログラム上で User-Agent を変更して接続するために &lt;strong&gt;UrlMkSetSessionOption&lt;/strong&gt;( URLMON_OPTION_USERAGENT ) API を使用しているが、IE8β2 では正常に動作しない。&lt;/p&gt;
&lt;p&gt;下記のサンプルコードは IE4 以降の環境では正常に動作するが、IE8 では &lt;strong&gt;UrlMkSetSessionOption&lt;/strong&gt; は正常終了(S_OK) を返すものの効果がない。&lt;/p&gt;
&lt;div style="padding: 0.5em 1em; border: 1px solid blue; background-color: white;"&gt;&lt;p&gt;&lt;code&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt; ChangeUserAgentTest()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;char&lt;/font&gt; lpaUserAgent[ &lt;font color="#ff0000"&gt;1024&lt;/font&gt; ] = &lt;font color="#ff0000"&gt;"test user-agent"&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;DWORD&lt;/font&gt; dwLength = lstrlenA( lpaUserAgent );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;HRESULT&lt;/font&gt; hr = ::UrlMkSetSessionOption( URLMON_OPTION_USERAGENT, lpaUserAgent, dwLength, &lt;font color="#ff0000"&gt;0&lt;/font&gt; );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;CString&lt;/font&gt; strMsg;&lt;br&gt;
&amp;nbsp; &amp;nbsp; strMsg.Format( &lt;font color="#ff00ff"&gt;_T&lt;/font&gt;( &lt;font color="#ff0000"&gt;"UrlMkSetSessionOption: 0x%08x"&lt;/font&gt; ), hr );&lt;br&gt;
&amp;nbsp; &amp;nbsp; ::MessageBox( &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;, strMsg, &lt;font color="#ff00ff"&gt;_T&lt;/font&gt;( &lt;font color="#ff0000"&gt;"[debug - 1]"&lt;/font&gt; ), MB_OK );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ( hr == &lt;font color="#ff00ff"&gt;S_OK&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#ff00ff"&gt;DWORD&lt;/font&gt; dwSize = &lt;font color="#ff0000"&gt;1023&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#0000ff"&gt;char&lt;/font&gt; lpaString[ &lt;font color="#ff0000"&gt;1024&lt;/font&gt; ] = {&lt;font color="#ff0000"&gt;0&lt;/font&gt;};&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hr = ::ObtainUserAgentString( &lt;font color="#ff0000"&gt;0&lt;/font&gt;, lpaString, &amp;amp;dwSize );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; strMsg.Format( &lt;font color="#ff00ff"&gt;_T&lt;/font&gt;( &lt;font color="#ff0000"&gt;"ObtainUserAgentString: 0x%08x\n%s"&lt;/font&gt; ), hr, &lt;font color="#ff00ff"&gt;CString&lt;/font&gt;( lpaString ) );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ::MessageBox( &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;, strMsg, &lt;font color="#ff00ff"&gt;_T&lt;/font&gt;( &lt;font color="#ff0000"&gt;"[debug - 2]"&lt;/font&gt; ), MB_OK );&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;最初のメッセージは成功を返す。&lt;br&gt;---------------------------&lt;br&gt;[debug - 1]&lt;br&gt;---------------------------&lt;br&gt;UrlMkSetSessionOption: 0x00000000&lt;br&gt;---------------------------&lt;br&gt;OK&lt;br&gt;---------------------------&lt;/p&gt;
&lt;p&gt;二番目ののメッセージも成功を返す。&lt;br&gt;---------------------------&lt;br&gt;[debug - 2]&lt;br&gt;---------------------------&lt;br&gt;ObtainUserAgentString: 0x00000000&lt;br&gt;test user-agent&lt;br&gt;---------------------------&lt;br&gt;OK&lt;br&gt;---------------------------&lt;/p&gt;
&lt;p&gt;しかしながら、ウェブサイトにアクセスすると、サーバー変数は下記の値を返す:&lt;br&gt;&lt;strong&gt;&lt;font color="#006400"&gt;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;IE8 より前では下記の値を返す:&lt;br&gt;&lt;strong&gt;&lt;font color="#006400"&gt;test user-agent&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ひょっとしたら IE8 以降で User-Agent を変更するための手順が変更されたのか、とも思ったがバグの可能性が高い。&lt;/p&gt;
&lt;p&gt;この API は、urlmon.dll に含まれているため、一般プログラマからは何もできなさげ。&lt;br&gt;正式版までに解決してくれていることを願うばかり。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/166328.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>INI 編集ツール IniModifier を作成してみる (3)</title><link>http://blogs.wankuma.com/rapt/archive/2008/08/17/153287.aspx</link><pubDate>Sun, 17 Aug 2008 16:20:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2008/08/17/153287.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/153287.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2008/08/17/153287.aspx#Feedback</comments><slash:comments>235</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/153287.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/153287.aspx</trackback:ping><description>&lt;h1&gt;INI 編集ツール IniModifier を作成してみる (3)&lt;/h1&gt;
&lt;p&gt;過去の記事へのリンク：
&lt;br&gt;&lt;A href="http://blogs.wankuma.com/rapt/archive/2008/08/16/153180.aspx" title="INI 編集ツール IniModifier を作成してみる (1) へ"&gt;INI 編集ツール IniModifier を作成してみる (1)&lt;/a&gt;
&lt;br&gt;&lt;A href="http://blogs.wankuma.com/rapt/archive/2008/08/16/153188.aspx" title="INI 編集ツール IniModifier を作成してみる (2) へ"&gt;INI 編集ツール IniModifier を作成してみる (2)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
まずは、WTL::CRichEditCtrl のヘッダを見てみることにする。&lt;br&gt;
WTL は SDK のラッパであり、MFC とほぼ同機能のメソッドを持っているので迷ったら、MSDN で MFC と SDK のヘルプを見るのが常套手段。
&lt;/p&gt;
&lt;h2&gt;WTL::CRichEditCtrl&lt;/h2&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
&lt;span style="color:green;"&gt;// WTL::CRichEditCtrl (CRichEditCtrlT&amp;lt;ATL::CWindow&amp;gt;) の宣言&lt;/span&gt;
&lt;br&gt;&lt;span style="color:green;"&gt;// Constructors&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; CRichEditCtrl( &lt;span style="color:magenta;"&gt;HWND&lt;/span&gt; hWnd = &lt;span style="color:magenta;"&gt;NULL&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; CRichEditCtrl&amp;amp; &lt;span style="color:blue;"&gt;operator&lt;/span&gt; =( &lt;span style="color:magenta;"&gt;HWND&lt;/span&gt; hWnd );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;HWND&lt;/span&gt; Create( &lt;span style="color:magenta;"&gt;HWND&lt;/span&gt; hWndParent, ATL::_U_RECT rect = &lt;span style="color:magenta;"&gt;NULL&lt;/span&gt;, &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; szWindowName = &lt;span style="color:magenta;"&gt;NULL&lt;/span&gt;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwStyle = &lt;span style="color:red;"&gt;0&lt;/span&gt;, &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwExStyle = &lt;span style="color:red;"&gt;0&lt;/span&gt;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ATL::_U_MENUorID MenuOrID = &lt;span style="color:red;"&gt;0U&lt;/span&gt;, &lt;span style="color:magenta;"&gt;LPVOID&lt;/span&gt; lpCreateParam = &lt;span style="color:magenta;"&gt;NULL&lt;/span&gt; );
&lt;br&gt;
&lt;br&gt;&lt;span style="color:green;"&gt;// Attributes&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; GetWndClassName();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; GetLibraryName();
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetLineCount() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; GetModify() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SetModify( &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bModified = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; GetRect( &lt;span style="color:magenta;"&gt;LPRECT&lt;/span&gt; lpRect ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetOptions() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; SetOptions( &lt;span style="color:magenta;"&gt;WORD&lt;/span&gt; wOperation, &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwOptions );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// NOTE: first word in lpszBuffer must contain the size of the buffer!&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetLine( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nIndex, &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt; lpszBuffer ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetLine( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nIndex, &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt; lpszBuffer, &lt;span style="color:blue;"&gt;int&lt;/span&gt; nMaxLength ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; CanUndo() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; CanPaste( &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; nFormat = &lt;span style="color:red;"&gt;0&lt;/span&gt; ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; GetSel( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt;&amp;amp; nStartChar, &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt;&amp;amp; nEndChar ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; GetSel( CHARRANGE &amp;amp;cr ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetSel( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nStartChar, &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nEndChar );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetSel( CHARRANGE &amp;amp;cr );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetSelAll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetSelNone();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetDefaultCharFormat( CHARFORMAT&amp;amp; cf ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetSelectionCharFormat( CHARFORMAT&amp;amp; cf ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetEventMask() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; GetLimitText() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetParaFormat( PARAFORMAT&amp;amp; pf ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; ( _RICHEDIT_VER &amp;gt;= &lt;span style="color:red;"&gt;0x0200&lt;/span&gt; )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; GetSelText( &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt; lpstrBuff ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#else&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// RichEdit 1.0 EM_GETSELTEXT is ANSI only&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; GetSelText( &lt;span style="color:magenta;"&gt;LPSTR&lt;/span&gt; lpstrBuff ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#ifndef&lt;/span&gt; _ATL_NO_COM
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; GetSelTextBSTR( &lt;span style="color:magenta;"&gt;BSTR&lt;/span&gt;&amp;amp; bstrText ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; &lt;span style="color:blue;"&gt;defined&lt;/span&gt;( _WTL_USE_CSTRING ) || &lt;span style="color:blue;"&gt;defined&lt;/span&gt;( __ATLSTR_H__ )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; GetSelText( _CSTRING_NS::&lt;span style="color:magenta;"&gt;CString&lt;/span&gt;&amp;amp; strText ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;WORD&lt;/span&gt; GetSelectionType() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;COLORREF&lt;/span&gt; SetBackgroundColor( &lt;span style="color:magenta;"&gt;COLORREF&lt;/span&gt; cr );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;COLORREF&lt;/span&gt; SetBackgroundColor();&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// sets to system background&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetCharFormat( CHARFORMAT&amp;amp; cf, &lt;span style="color:magenta;"&gt;WORD&lt;/span&gt; wFlags );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetDefaultCharFormat( CHARFORMAT&amp;amp; cf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetSelectionCharFormat( CHARFORMAT&amp;amp; cf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetWordCharFormat( CHARFORMAT&amp;amp; cf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; SetEventMask( &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwEventMask );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetParaFormat( PARAFORMAT&amp;amp; pf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetTargetDevice( &lt;span style="color:magenta;"&gt;HDC&lt;/span&gt; hDC, &lt;span style="color:blue;"&gt;int&lt;/span&gt; cxLineWidth );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextLength() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetReadOnly( &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bReadOnly = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetFirstVisibleLine() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; EDITWORDBREAKPROCEX GetWordBreakProcEx() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; EDITWORDBREAKPROCEX SetWordBreakProcEx( EDITWORDBREAKPROCEX pfnEditWordBreakProcEx );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextRange( TEXTRANGE* pTextRange ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; ( _RICHEDIT_VER &amp;gt;= &lt;span style="color:red;"&gt;0x0200&lt;/span&gt; )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextRange( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nStartChar, &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nEndChar, &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt; lpstrText ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#else&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextRange( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nStartChar, &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nEndChar, &lt;span style="color:magenta;"&gt;LPSTR&lt;/span&gt; lpstrText ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; ( _RICHEDIT_VER &amp;gt;= &lt;span style="color:red;"&gt;0x0200&lt;/span&gt; )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetDefaultCharFormat( CHARFORMAT2&amp;amp; cf ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetCharFormat( CHARFORMAT2&amp;amp; cf, &lt;span style="color:magenta;"&gt;WORD&lt;/span&gt; wFlags );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetDefaultCharFormat( CHARFORMAT2&amp;amp; cf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetSelectionCharFormat( CHARFORMAT2&amp;amp; cf ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetSelectionCharFormat( CHARFORMAT2&amp;amp; cf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetWordCharFormat( CHARFORMAT2&amp;amp; cf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetParaFormat( PARAFORMAT2&amp;amp; pf ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetParaFormat( PARAFORMAT2&amp;amp; pf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; TEXTMODE GetTextMode() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetTextMode( TEXTMODE enumTextMode );
&lt;br&gt;&amp;nbsp; &amp;nbsp; UNDONAMEID GetUndoName() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; UNDONAMEID GetRedoName() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; CanRedo() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; GetAutoURLDetect() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetAutoURLDetect( &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bAutoDetect = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// this method is deprecated, please use SetAutoURLDetect&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; EnableAutoURLDetect( &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bEnable = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; SetUndoLimit( &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uUndoLimit );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SetPalette( &lt;span style="color:magenta;"&gt;HPALETTE&lt;/span&gt; hPalette );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextEx( GETTEXTEX* pGetTextEx, &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt; lpstrText ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextEx( &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt; lpstrText, &lt;span style="color:blue;"&gt;int&lt;/span&gt; nTextLen, &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwFlags = GT_DEFAULT, &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uCodePage = CP_ACP, &lt;span style="color:magenta;"&gt;LPCSTR&lt;/span&gt; lpDefaultChar = &lt;span style="color:magenta;"&gt;NULL&lt;/span&gt;, &lt;span style="color:magenta;"&gt;LPBOOL&lt;/span&gt; lpUsedDefChar = &lt;span style="color:magenta;"&gt;NULL&lt;/span&gt; ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextLengthEx( GETTEXTLENGTHEX* pGetTextLengthEx ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextLengthEx( &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwFlags = GTL_DEFAULT, &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uCodePage = CP_ACP ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; ( _RICHEDIT_VER &amp;gt;= &lt;span style="color:red;"&gt;0x0300&lt;/span&gt; )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetTextEx( SETTEXTEX* pSetTextEx, &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; lpstrText );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetTextEx( &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; lpstrText, &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwFlags = ST_DEFAULT, &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uCodePage = CP_ACP );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetEditStyle() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetEditStyle( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nStyle, &lt;span style="color:blue;"&gt;int&lt;/span&gt; nMask = &lt;span style="color:red;"&gt;-1&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetFontSize( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nFontSizeDelta );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; GetScrollPos( &lt;span style="color:magenta;"&gt;LPPOINT&lt;/span&gt; lpPoint ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SetScrollPos( &lt;span style="color:magenta;"&gt;LPPOINT&lt;/span&gt; lpPoint );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; GetZoom( &lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;amp; nNum, &lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;amp; nDen ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetZoom( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nNum, &lt;span style="color:blue;"&gt;int&lt;/span&gt; nDen );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetZoomOff();
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:green;"&gt;// Operations&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; LimitText( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nChars = &lt;span style="color:red;"&gt;0&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; LineFromChar( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nIndex ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;&lt;span style="color:magenta;"&gt;POINT&lt;/span&gt;&lt;/span&gt; PosFromChar( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nChar ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; CharFromPos( &lt;span style="color:magenta;"&gt;POINT&lt;/span&gt; pt ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; EmptyUndoBuffer();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; LineIndex( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nLine = &lt;span style="color:red;"&gt;-1&lt;/span&gt; ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; LineLength( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nLine = &lt;span style="color:red;"&gt;-1&lt;/span&gt; ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; LineScroll( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nLines, &lt;span style="color:blue;"&gt;int&lt;/span&gt; nChars = &lt;span style="color:red;"&gt;0&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ReplaceSel( &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; lpszNewText, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bCanUndo = &lt;span style="color:magenta;"&gt;FALSE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SetRect( &lt;span style="color:magenta;"&gt;LPCRECT&lt;/span&gt; lpRect );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; DisplayBand( &lt;span style="color:magenta;"&gt;LPRECT&lt;/span&gt; pDisplayRect );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; FindText( &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwFlags, FINDTEXT&amp;amp; ft ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; FindText( &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwFlags, FINDTEXTEX&amp;amp; ft ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; FormatRange( FORMATRANGE&amp;amp; fr, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bDisplay = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; FormatRange( FORMATRANGE* pFormatRange, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bDisplay = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; HideSelection( &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bHide = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt;, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bChangeStyle = &lt;span style="color:magenta;"&gt;FALSE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; PasteSpecial( &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uClipFormat, &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwAspect = &lt;span style="color:red;"&gt;0&lt;/span&gt;, HMETAFILE hMF = &lt;span style="color:red;"&gt;0&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; RequestResize();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; StreamIn( &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uFormat, EDITSTREAM&amp;amp; es );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; StreamOut( &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uFormat, EDITSTREAM&amp;amp; es );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; FindWordBreak( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nCode, &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nStartChar );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// Additional operations&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ScrollCaret();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; InsertText( &lt;span style="color:blue;"&gt;long&lt;/span&gt; nInsertAfterChar, &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; lpstrText, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bCanUndo = &lt;span style="color:magenta;"&gt;FALSE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; AppendText( &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; lpstrText, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bCanUndo = &lt;span style="color:magenta;"&gt;FALSE&lt;/span&gt; );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// Clipboard operations&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; Undo();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Clear();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Copy();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Cut();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Paste();
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// OLE support&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; IRichEditOle* GetOleInterface() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetOleCallback( IRichEditOleCallback* pCallback );
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; ( _RICHEDIT_VER &amp;gt;= &lt;span style="color:red;"&gt;0x0200&lt;/span&gt; )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; Redo();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; StopGroupTyping();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ShowScrollBar( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nBarType, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bVisible = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; ( _RICHEDIT_VER &amp;gt;= &lt;span style="color:red;"&gt;0x0300&lt;/span&gt; )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetTabStops( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nTabStops, &lt;span style="color:magenta;"&gt;LPINT&lt;/span&gt; rgTabStops );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetTabStops();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetTabStops( &lt;span style="color:blue;"&gt;const&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;amp; cxEachStop );&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// takes an 'int'&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;
これで大体何ができるか分かった。
あとは、実際に使用しそうで使ったことがないメソッドについて詳しくみていくことにする。
&lt;/p&gt;
&lt;h2&gt;GetLibraryName&lt;/h2&gt;
&lt;p&gt;リッチエディットコントロールを使用するには、最初にリッチエディットコントロールの DLL をロードしておかなければいけないらしい。
&lt;br&gt;リッチエディットコントロールの DLL 名はバージョンによって異なるので（Ver1.0 は RICHED32.DLL で、Ver2.0 以降は RICHED20.DLL）、このメソッドを使うことでその違いを CRichEditCtrl がプリプロセス時点で解決してくれる。
&lt;/p&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
&lt;span style="color:green;"&gt;// IniModifier.cpp&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt; &lt;span style="color:magenta;"&gt;WINAPI&lt;/span&gt; _tWinMain( &lt;span style="color:magenta;"&gt;HINSTANCE&lt;/span&gt;, &lt;span style="color:magenta;"&gt;HINSTANCE&lt;/span&gt;, &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt;, &lt;span style="color:blue;"&gt;int&lt;/span&gt; )
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;HMODULE&lt;/span&gt; hRich = ::LoadLibrary( CRichEditCtrl::GetLibraryName() );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// snip&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; ::FreeLibrary( hRich );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; nRet;
&lt;br&gt;}
&lt;/div&gt;
&lt;h2&gt;SetSelectionCharFormat&lt;/h2&gt;
&lt;p&gt;現在の選択のテキストの文字書式属性を設定する。
&lt;br&gt;なお、選択範囲がない場合は、以降の入力についての設定となる。
&lt;/p&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
&lt;span style="color:green;"&gt;// CRichEditCtrl m_rich;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:green;"&gt;// テキストを青色太字にして保護にする&lt;/span&gt;
&lt;br&gt;CHARFORMAT cf;
&lt;br&gt;cf.dwMask = CFM_PROTECTED | CFM_COLOR | CFM_BOLD;
&lt;br&gt;cf.dwEffects = CFE_PROTECTED | CFE_BOLD;
&lt;br&gt;cf.crTextColor = &lt;span style="color:magenta;"&gt;RGB&lt;/span&gt;( &lt;span style="color:red;"&gt;0&lt;/span&gt;, &lt;span style="color:red;"&gt;0&lt;/span&gt;, &lt;span style="color:red;"&gt;255&lt;/span&gt; );
&lt;br&gt;m_rich.SetSelectionCharFormat( cf );
&lt;/div&gt;
&lt;h2&gt;SetEventMask&lt;/h2&gt;
&lt;p&gt;親ウィンドウに送る通知メッセージを指定する。&lt;/p&gt;
&lt;dl style="line-height:130%;"&gt;
&lt;dt&gt;ENM_PROTECTED
 &lt;dd&gt;保護領域を編集しようとした時に WM_NOTIFY メッセージで EN_PROTECTED が通知されるようにする。
 &lt;br&gt;0 を返すと変更許可、非0 を返すと変更禁止とする。
 &lt;br&gt;&lt;code&gt;ENPROTECTED* pProtected = &lt;span style="color:blue;"&gt;reinterpret_cast&lt;/span&gt;&amp;lt; ENPROTECTED* &amp;gt;( &lt;span style="color:blue;"&gt;reinterpret_cast&lt;/span&gt;&amp;lt; LPNMHDR &amp;gt;( lParam ) );&lt;/code&gt; としたとき、
 &lt;br&gt;&lt;code&gt;pProtected-&amp;gt;msg&lt;/code&gt; に、この通知発生原因のメッセージ ID が入っている。
 &lt;br&gt;&lt;code&gt;pProtected-&amp;gt;chrg.cpMin&lt;/code&gt; と &lt;code&gt;pProtected-&amp;gt;chrg.cpMax&lt;/code&gt; に、この通知発生元のインデックス（リッチエディットコントロール先頭位置からのオフセット）が入っている。
&lt;dt&gt;ENM_KEYEVENTS
 &lt;dd&gt;キーボードイベントが発生した時に WM_NOTIFY メッセージで EN_MSGFILTER が通知されるようにする。
 &lt;br&gt;0 を返すと通常のイベントを処理する。非0 を返すと以降のイベント処理を無視する。
 &lt;br&gt;&lt;code&gt;MSGFILTER* pFilter = &lt;span style="color:blue;"&gt;reinterpret_cast&lt;/span&gt;&amp;lt; MSGFILTER* &amp;gt;( &lt;span style="color:blue;"&gt;reinterpret_cast&lt;/span&gt;&amp;lt; LPNMHDR &amp;gt;( lParam ) );&lt;/code&gt; としたとき、
 &lt;br&gt;&lt;code&gt;pFilter-&amp;gt;msg&lt;/code&gt; に、この通知発生原因のメッセージ ID が入っている。
&lt;dt&gt;ENM_MOUSEEVENTS
 &lt;dd&gt;マウスイベントが発生した時に WM_NOTIFY メッセージで EN_MSGFILTER が通知されるようにする。
 &lt;br&gt;EN_MSGFILTER の動作については、ENM_KEYEVENTS と同じ。
&lt;/dl&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
m_rich.SetEventMask( ENM_PROTECTED | ENM_KEYEVENTS | ENM_MOUSEEVENTS );
&lt;/div&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/153287.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>INI 編集ツール IniModifier を作成してみる (2)</title><link>http://blogs.wankuma.com/rapt/archive/2008/08/16/153188.aspx</link><pubDate>Sat, 16 Aug 2008 01:23:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2008/08/16/153188.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/153188.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2008/08/16/153188.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/153188.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/153188.aspx</trackback:ping><description>&lt;h1&gt;INI 編集ツール IniModifier を作成してみる (2)&lt;/h1&gt;
&lt;p&gt;過去の記事へのリンク：
&lt;br&gt;&lt;A href="http://blogs.wankuma.com/rapt/archive/2008/08/16/153180.aspx" title="INI 編集ツール IniModifier を作成してみる (1) へ"&gt;INI 編集ツール IniModifier を作成してみる (1)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
リソース配置が楽なのでダイアログベースで作ることにする。&lt;br&gt;
とりあえずリソースエディタで適当にコントロールを配置して、UI を決める。&lt;br&gt;
ダイアログの自動リサイズを実装するため、CDialogResize も継承しておく。&lt;br&gt;
&lt;/p&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
&lt;span style="color:blue;"&gt;class&lt;/span&gt; CMainDlg&lt;br&gt;
&amp;nbsp; &amp;nbsp; : &lt;span style="color:blue;"&gt;public&lt;/span&gt; CDialogImpl&amp;lt; CMainDlg &amp;gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; , &lt;span style="color:blue;"&gt;public&lt;/span&gt; CDialogResize&amp;lt; CMainDlg &amp;gt;&lt;br&gt;
{&lt;br&gt;
&lt;/div&gt;
&lt;p&gt;
テキストを編集したり色をつけたりしたいので、リッチエディットコントロールを使ってみようと思う。リッチエディットコントロールを使うのはこれが初めてだが、WTL のヘッダを見ていると結構いろいろできそうなので、せっかくなので調べながら作っていくことにする。&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;リソースエディタのイメージはこんな感じ↓&lt;/p&gt;
&lt;img src="http://rapt.wankuma.com/IniModifier_image01.png" width="545px" height="363px" alt="リソースエディタのイメージ" /&gt;&lt;br&gt;
&lt;p&gt;
リッチエディットコントロールは 2.0 を使うこととする。&lt;br&gt;
CDialogResize は atlframe.h&lt;br&gt;
CRichEditCtrl は atlctrls.h&lt;br&gt;
にそれぞれ定義されているので、stdafx.h は下記のようになった。
&lt;/p&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
&lt;span style="color:green;"&gt;// stdafx.h&lt;/span&gt;
&lt;br&gt;&lt;span style="color:green;"&gt;// Change these values to use different versions&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#define&lt;/span&gt; WINVER&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:red;"&gt;0x0500&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#define&lt;/span&gt; _WIN32_WINNT&amp;nbsp; &amp;nbsp; &lt;span style="color:red;"&gt;0x0501&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#define&lt;/span&gt; _WIN32_IE&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color:red;"&gt;0x0501&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#define&lt;/span&gt; _RICHEDIT_VER&amp;nbsp; &amp;nbsp;&lt;span style="color:red;"&gt;0x0200&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:green;"&gt;// WTL よりも ATL を優先する場合は、atlapp.h より前に include すること&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atlstr.h&amp;gt;&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atltypes.h&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atlbase.h&amp;gt;&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atlapp.h&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;extern&lt;/span&gt; CAppModule _Module;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atlcrack.h&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atlframe.h&amp;gt;&lt;/span&gt;&amp;nbsp; &lt;span style="color:green;"&gt;// CDialogResize&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atlctrls.h&amp;gt;&lt;/span&gt;&amp;nbsp; &lt;span style="color:green;"&gt;// CRichEditCtrl&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atldlgs.h&amp;gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color:green;"&gt;// CFileDialog&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;処理の関係上、文字セットは UNICODE ではなく、マルチバイト文字セット(MBCS) でビルドすることにする。&lt;/p&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
&lt;span style="color:green;"&gt;// stdafx.cpp&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if defined&lt;/span&gt;( _UNICODE ) || &lt;span style="color:blue;"&gt;defined&lt;/span&gt;( UNICODE )
&lt;br&gt;&lt;span style="color:blue;"&gt;#error&lt;/span&gt; This program doesn't assume unicode build.
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;
# ところで、なぜ &lt;code style="font-size:100%;"&gt;#error&lt;/code&gt; ディレクティブではマルチバイト文字が使えないんだろ。&lt;br&gt;
# ダブルクォーテーションで括ってやってもだめ。L&amp;quot;&amp;quot; としてもだめ。何かうまくいくようにしてくれるといいんだけど。
&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/153188.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>INI 編集ツール IniModifier を作成してみる (1)</title><link>http://blogs.wankuma.com/rapt/archive/2008/08/16/153180.aspx</link><pubDate>Sat, 16 Aug 2008 00:18:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2008/08/16/153180.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/153180.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2008/08/16/153180.aspx#Feedback</comments><slash:comments>209</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/153180.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/153180.aspx</trackback:ping><description>&lt;h1&gt;IniModifier&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://www.jrsoftware.org/isinfo.php" title="Inno Setup へ"&gt;Inno Setup&lt;/a&gt; のフロントエンドである ISTool の&lt;a href="http://rapt21.com/innosetup.php" title="ISTool の日本語言語ファイル配布ページへ"&gt;日本語言語ファイル&lt;/a&gt;作成をしたりしているが、INI 形式のファイルをアップデートが非常にめんどくさすぎるので何かツールを作成しようと思う。&lt;/p&gt;
&lt;p&gt;開発環境は以下の通り。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows XP sp2
&lt;li&gt;Visual C++ .NET 2003 sp1
&lt;li&gt;WTL 8.0
&lt;/ul&gt;
&lt;p&gt;要件仕様は下記の通りとする。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ファイルのエンコーディングは SJIS/UTF-8 に対応。（できれば EUC も対応。）
&lt;li&gt;セクション名・キー名で差分チェックを行う。
&lt;li&gt;Visual SourceSafe の比較画面のように見比べつつ編集もできるようにする。
&lt;li&gt;セクション：&lt;b style="color:black;"&gt;[太字表示]&lt;/b&gt;
&lt;li&gt;コメント：&lt;b style="color:green;"&gt;緑色表示&lt;/b&gt;
&lt;li&gt;追加されたセクション・キー：&lt;b style="color:blue;"&gt;青色表示&lt;/b&gt;
&lt;li&gt;削除されたセクション・キー：&lt;b style="color:red;"&gt;赤色表示&lt;/b&gt;
&lt;li&gt;削除されたキー：キーの先頭に &lt;code style="font-size:100%;"&gt;&amp;quot;&lt;span style="color:red; font-weight:bold;"&gt;;&amp;lt;DEL&amp;gt;:&lt;/span&gt;&amp;quot;&lt;/code&gt; を追加。
&lt;/ul&gt;
&lt;p&gt;IniModifier の完成イメージはこんな感じ↓&lt;/p&gt;
&lt;img src="http://rapt.wankuma.com/IniModifier_image00.png" width="545px" height="363px" alt="IniModifier の完成イメージ" /&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/153180.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>