<?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>C/C++</title><link>http://blogs.wankuma.com/rapt/category/711.aspx</link><description>C/C++</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>[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>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><item><dc:creator>RAPT</dc:creator><title>環境変数をシステムに通知する方法</title><link>http://blogs.wankuma.com/rapt/archive/2007/11/20/109414.aspx</link><pubDate>Tue, 20 Nov 2007 12:02:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2007/11/20/109414.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/109414.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2007/11/20/109414.aspx#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/109414.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/109414.aspx</trackback:ping><description>&lt;P&gt;メモ。&lt;BR&gt;&lt;A title=環境変数をシステムに通知する方法 href="http://support.microsoft.com/kb/104011/ja"&gt;[KB104011] 環境変数をシステムに通知する方法&lt;/A&gt;&lt;/p&gt;

&lt;p&gt;※レジストリを書き換えたあと、再起動なしに設定反映する方法。&lt;/P&gt;
&lt;PRE style="BORDER-RIGHT: green 3px double; PADDING-RIGHT: 5px; BORDER-TOP: green 3px double; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: green 3px double; COLOR: black; PADDING-TOP: 5px; BORDER-BOTTOM: green 3px double; BACKGROUND-COLOR: white"&gt;&lt;SPAN style="COLOR: #ff00ff"&gt;DWORD&lt;/SPAN&gt; dwReturnValue = &lt;SPAN style="COLOR: #ff0000"&gt;0&lt;/SPAN&gt;;
&lt;SPAN style="COLOR: #ff00ff"&gt;BOOL&lt;/SPAN&gt; bSuccess = &lt;SPAN style="COLOR: #0000ff"&gt;static_cast&lt;/SPAN&gt;&amp;lt; &lt;SPAN style="COLOR: #ff00ff"&gt;BOOL&lt;/SPAN&gt; &amp;gt;( ::SendMessageTimeout
(
      HWND_BROADCAST
    , WM_SETTINGCHANGE
    , &lt;SPAN style="COLOR: #ff0000"&gt;0&lt;/SPAN&gt;
    , &lt;SPAN style="COLOR: #0000ff"&gt;reinterpret_cast&lt;/SPAN&gt;&amp;lt; &lt;SPAN style="COLOR: #ff00ff"&gt;LPARAM&lt;/SPAN&gt; &amp;gt;( &lt;FONT color=#ff00ff&gt;_T&lt;/FONT&gt;( &lt;FONT color=#ff0000&gt;"Environment"&lt;/FONT&gt; ) )
    , SMTO_ABORTIFHUNG
    , &lt;SPAN style="COLOR: #ff0000"&gt;5000&lt;/SPAN&gt;
    , &amp;amp;dwReturnValue
) );
&lt;/PRE&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/109414.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>[Vista] 自分が現在、昇格実行されているか</title><link>http://blogs.wankuma.com/rapt/archive/2007/06/12/80414.aspx</link><pubDate>Tue, 12 Jun 2007 11:02:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2007/06/12/80414.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/80414.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2007/06/12/80414.aspx#Feedback</comments><slash:comments>34</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/80414.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/80414.aspx</trackback:ping><description>&lt;H1&gt;Vista で自分が現在、昇格実行されているかを調査するコード&lt;/H1&gt;
&lt;P&gt;VC++.NET 2003 にて動作確認済み。&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: blue 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: blue 1px solid; PADDING-LEFT: 5px; BACKGROUND: #ffffff; PADDING-BOTTOM: 5px; BORDER-LEFT: blue 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: blue 1px solid; FONT-FAMILY: monospace"&gt;&lt;SPAN style="COLOR: #008000"&gt;// Microsoft SDK v6 WinNT.h （最新の SDK を入れている方は、この部分は不要です。）&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR: #0000ff"&gt;#define&lt;/SPAN&gt; TokenElevationType&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;static_cast&lt;/SPAN&gt;&amp;lt; TOKEN_INFORMATION_CLASS &amp;gt;( &lt;SPAN style="COLOR: #ff0000"&gt;18&lt;/SPAN&gt; )&lt;BR&gt;&lt;SPAN style="COLOR: #0000ff"&gt;typedef&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;enum&lt;/SPAN&gt; _TOKEN_ELEVATION_TYPE {&lt;BR&gt;&amp;nbsp; &amp;nbsp; TokenElevationTypeDefault = &lt;SPAN style="COLOR: #ff0000"&gt;1&lt;/SPAN&gt;,&lt;BR&gt;&amp;nbsp; &amp;nbsp; TokenElevationTypeFull,&lt;BR&gt;&amp;nbsp; &amp;nbsp; TokenElevationTypeLimited,&lt;BR&gt;} TOKEN_ELEVATION_TYPE, *PTOKEN_ELEVATION_TYPE;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="COLOR: #008000"&gt;// 昇格が必要か&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt; IsNeedHigher()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; &amp;nbsp; OSVERSIONINFO ovi = { &lt;SPAN style="COLOR: #0000ff"&gt;sizeof&lt;/SPAN&gt; ovi };&lt;BR&gt;&amp;nbsp; &amp;nbsp; ::GetVersionEx( &amp;amp;ovi );&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; ( ovi.dwPlatformId != VER_PLATFORM_WIN32_NT || ovi.dwMajorVersion &amp;lt; &lt;SPAN style="COLOR: #ff0000"&gt;6&lt;/SPAN&gt; ) {&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #ff00ff"&gt;HMODULE&lt;/SPAN&gt; hLib = ::LoadLibrary( &lt;SPAN style="COLOR: #ff00ff"&gt;_T&lt;/SPAN&gt;( &lt;SPAN style="COLOR: #ff0000"&gt;"advapi32.dll"&lt;/SPAN&gt; ) );&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; ( hLib == &lt;SPAN style="COLOR: #ff00ff"&gt;NULL&lt;/SPAN&gt; ) {&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;typedef&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff00ff"&gt;BOOL&lt;/SPAN&gt; ( *LPFNOPENPROCESSTOKEN )( &lt;SPAN style="COLOR: #ff00ff"&gt;HANDLE&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #ff00ff"&gt;DWORD&lt;/SPAN&gt;, PHANDLE );&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;typedef&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff00ff"&gt;BOOL&lt;/SPAN&gt; ( *LPFNGETTOKENINFORMATION )( &lt;SPAN style="COLOR: #ff00ff"&gt;HANDLE&lt;/SPAN&gt;, TOKEN_INFORMATION_CLASS, &lt;SPAN style="COLOR: #ff00ff"&gt;LPVOID&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #ff00ff"&gt;DWORD&lt;/SPAN&gt;, PDWORD );&lt;BR&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; LPFNOPENPROCESSTOKEN lpfnOpenProcessToken = &lt;SPAN style="COLOR: #0000ff"&gt;reinterpret_cast&lt;/SPAN&gt;&amp;lt; LPFNOPENPROCESSTOKEN &amp;gt;( ::GetProcAddress( hLib, &lt;SPAN style="COLOR: #ff0000"&gt;"OpenProcessToken"&lt;/SPAN&gt; ) );&lt;BR&gt;&amp;nbsp; &amp;nbsp; LPFNGETTOKENINFORMATION lpfnGetTokenInformation = &lt;SPAN style="COLOR: #0000ff"&gt;reinterpret_cast&lt;/SPAN&gt;&amp;lt; LPFNGETTOKENINFORMATION &amp;gt;( ::GetProcAddress( hLib, &lt;SPAN style="COLOR: #ff0000"&gt;"GetTokenInformation"&lt;/SPAN&gt; ) );&lt;BR&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; ( lpfnOpenProcessToken == &lt;SPAN style="COLOR: #ff00ff"&gt;NULL&lt;/SPAN&gt;&amp;nbsp;|| lpfnGetTokenInformation == &lt;SPAN style="COLOR: #ff00ff"&gt;NULL&lt;/SPAN&gt; ) {&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ::FreeLibrary( hLib );&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt; bResult = &lt;SPAN style="COLOR: #0000ff"&gt;true&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #ff00ff"&gt;HANDLE&lt;/SPAN&gt; hToken = &lt;SPAN style="COLOR: #ff00ff"&gt;NULL&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; ( lpfnOpenProcessToken( ::GetCurrentProcess(), TOKEN_QUERY, &amp;amp;hToken ) ) {&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #ff00ff"&gt;DWORD&lt;/SPAN&gt; dwLength = &lt;SPAN style="COLOR: #ff0000"&gt;0&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TOKEN_ELEVATION_TYPE tet;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lpfnGetTokenInformation( hToken, TokenElevationType, &amp;amp;tet, &lt;SPAN style="COLOR: #0000ff"&gt;sizeof&lt;/SPAN&gt; tet, &amp;amp;dwLength );&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ::CloseHandle( hToken );&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; ( tet != TokenElevationTypeLimited ) {&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bResult = &lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;;&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; ::FreeLibrary( hLib );&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; bResult;&lt;BR&gt;}&lt;BR&gt;&lt;/DIV&gt;
&lt;P&gt;if ( lpfnOpenProcessToken == NULL &lt;SPAN style="COLOR: #0000ff"&gt;||&lt;/SPAN&gt; lpfnGetTokenInformation == NULL ) {&lt;/P&gt;
&lt;P&gt;のところ、条件式が &lt;SPAN style="COLOR: #0000ff"&gt;&amp;amp;&amp;amp;&lt;/SPAN&gt; になっていたのは間違い。 &lt;SPAN style="COLOR: #0000ff"&gt;||&lt;/SPAN&gt; じゃないとだめですよね。&lt;/P&gt;
&lt;P&gt;ってことで修正しました。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/80414.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>localtime の罠</title><link>http://blogs.wankuma.com/rapt/archive/2007/01/28/59391.aspx</link><pubDate>Sun, 28 Jan 2007 03:27:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2007/01/28/59391.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/59391.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2007/01/28/59391.aspx#Feedback</comments><slash:comments>435</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/59391.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/59391.aspx</trackback:ping><description>&lt;p&gt;Cランタイムの標準関数 localtime() について。&lt;br&gt;
これは時刻をタイムゾーンに合わせて現地時刻に変換したもの取得するものだが、&lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; を返すことがある。&lt;br&gt;
これを忘れてエラーチェックを忘れるとランタイムエラーでプログラムが強制終了してしまう。&lt;br&gt;&lt;/p&gt;
&lt;p&gt;日時を取得する別の手段として、Windows API で処理することができる。&lt;br&gt;
こちらは、localtime() 関数と違って、年数や月数の調整が不要で変数名も分かりやすいのでオススメなのだ。&lt;br&gt;&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='#0000ff'&gt;void&lt;/font&gt; test1()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#ff00ff'&gt;TCHAR&lt;/font&gt; szNow[ &lt;font color='#ff0000'&gt;100&lt;/font&gt; ] = { &lt;font color='#ff0000'&gt;0&lt;/font&gt; };&lt;br&gt;
&amp;nbsp; &amp;nbsp; time_t long_time;&lt;br&gt;
&amp;nbsp; &amp;nbsp; time( &amp;amp;long_time );&lt;br&gt;
&amp;nbsp; &amp;nbsp; tm* t = localtime( &amp;amp;long_time );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#0000ff'&gt;if&lt;/font&gt; ( t != &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// Cランタイムを使用&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wsprintf( szNow, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;%04d/%02d/%02d %02d:%02d:%02d&amp;quot;&lt;/font&gt; )&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;font color='#ff0000'&gt;1900&lt;/font&gt; + t-&amp;gt;tm_year&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;font color='#ff0000'&gt;1&lt;/font&gt; + t-&amp;gt;tm_mon&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_mday&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_hour&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_min&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_sec );&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#0000ff'&gt;else&lt;/font&gt; {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// Windows API を使用&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SYSTEMTIME st;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ::GetLocalTime( &amp;amp;st );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wsprintf( szNow, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;%04d/%02d/%02d %02d:%02d:%02d&amp;quot;&lt;/font&gt; )&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wYear&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wMonth&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wDay&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wHour&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wMinute&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wSecond );&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; ::MessageBox( &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt;, szNow, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;現在時刻&amp;quot;&lt;/font&gt; ), MB_OK );&lt;br&gt;
}&lt;br&gt;&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;ところで、例えば１週間前の日時を取得したいときはどうするのだろうか。&lt;br&gt;
今の日時が &lt;font color='#ff0000'&gt;8&lt;/font&gt; 日以降なら問題ない。-&lt;font color='#ff0000'&gt;7&lt;/font&gt; すればいいだけなのだから。&lt;br&gt;
しかしながらこの方法はそのまま採用できない。&lt;br&gt;
実際には、&lt;font color='#ff0000'&gt;1&lt;/font&gt;～&lt;font color='#ff0000'&gt;7&lt;/font&gt; 日の場合も検討に入れねばならず、月の計算やうるう年など複雑な計算を要することもあるからである。&lt;br&gt;&lt;/p&gt;
&lt;p&gt;さて、Cランタイムを使って処理する場合、tm 構造体の中身を編集して、mktime() 関数を呼び出すと&lt;br&gt;
その値を再構成してくれる。その値が &lt;font color='#ff0000'&gt;0&lt;/font&gt; 以下であっても適切に変換してくれるので便利だ。&lt;br&gt;&lt;/p&gt;
&lt;p&gt;ところが、これを Windows API だと、うまい方法が見当たらない。&lt;br&gt;
今の所、一度 FILETIME に変換して &lt;font color='#ff0000'&gt;100&lt;/font&gt; ナノ秒単位で加減して、SYSTEMTIME に再変換する&lt;br&gt;
といった手順で計算しているけど、もっと良い方法はないのだろうか。&lt;br&gt;&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='#0000ff'&gt;void&lt;/font&gt; test2()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#ff00ff'&gt;TCHAR&lt;/font&gt; szNow[ &lt;font color='#ff0000'&gt;100&lt;/font&gt; ] = { &lt;font color='#ff0000'&gt;0&lt;/font&gt; };&lt;br&gt;
&amp;nbsp; &amp;nbsp; time_t long_time;&lt;br&gt;
&amp;nbsp; &amp;nbsp; time( &amp;amp;long_time );&lt;br&gt;
&amp;nbsp; &amp;nbsp; tm* t = localtime( &amp;amp;long_time );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#0000ff'&gt;if&lt;/font&gt; ( t != &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// Cランタイムを使用&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t-&amp;gt;tm_mday -= &lt;font color='#ff0000'&gt;7&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; long_time = mktime( t );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t = localtime( &amp;amp;long_time );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color='#0000ff'&gt;if&lt;/font&gt; ( t != &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wsprintf( szNow, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;%04d/%02d/%02d %02d:%02d:%02d&amp;quot;&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='#ff0000'&gt;1900&lt;/font&gt; + t-&amp;gt;tm_year&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;font color='#ff0000'&gt;1&lt;/font&gt; + t-&amp;gt;tm_mon&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_mday&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_hour&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_min&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_sec );&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='#0000ff'&gt;if&lt;/font&gt; ( t == &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// Windows API を使用&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SYSTEMTIME st;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ::GetLocalTime( &amp;amp;st );&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FILETIME ft;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color='#ff00ff'&gt;ATLVERIFY&lt;/font&gt;( ::SystemTimeToFileTime( &amp;amp;st, &amp;amp;ft ) );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color='#0000ff'&gt;__int64&lt;/font&gt; nTime = &lt;font color='#0000ff'&gt;__int64&lt;/font&gt;( ft.dwHighDateTime ) &amp;lt;&amp;lt; &lt;font color='#ff0000'&gt;32&lt;/font&gt; | ft.dwLowDateTime;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nTime -= &lt;font color='#ff0000'&gt;10000000ULL&lt;/font&gt; &lt;font color='#008000'&gt;/*100ns*/&lt;/font&gt; * &lt;font color='#ff0000'&gt;60&lt;/font&gt; &lt;font color='#008000'&gt;/*sec*/&lt;/font&gt; * &lt;font color='#ff0000'&gt;60&lt;/font&gt; &lt;font color='#008000'&gt;/*min*/&lt;/font&gt; * &lt;font color='#ff0000'&gt;24&lt;/font&gt; &lt;font color='#008000'&gt;/*hour*/&lt;/font&gt; * &lt;font color='#ff0000'&gt;7&lt;/font&gt; &lt;font color='#008000'&gt;/*day*/&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ft.dwHighDateTime = &lt;font color='#ff00ff'&gt;DWORD&lt;/font&gt;( nTime &amp;gt;&amp;gt; &lt;font color='#ff0000'&gt;32&lt;/font&gt; );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ft.dwLowDateTime = &lt;font color='#ff00ff'&gt;DWORD&lt;/font&gt;( nTime &amp;amp; &lt;font color='#ff0000'&gt;0xFFFFFFFF&lt;/font&gt; );&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color='#ff00ff'&gt;ATLVERIFY&lt;/font&gt;( ::FileTimeToSystemTime( &amp;amp;ft, &amp;amp;st ) );&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wsprintf( szNow, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;%04d/%02d/%02d %02d:%02d:%02d&amp;quot;&lt;/font&gt; )&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wYear&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wMonth&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wDay&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wHour&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wMinute&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wSecond );&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; ::MessageBox( &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt;, szNow, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;1週間前の時刻&amp;quot;&lt;/font&gt; ), MB_OK );&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;※なお、上記サンプルでは time() 関数で現在時刻を取得しているので、&lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; になることはまずないと思われるが、&lt;br&gt;
時間をファイルに読み書きしている場合に不正な時刻変換を行なおうとしてしまうことがありうる。&lt;br&gt;
実はそれこそが不正終了の一因だったりして(^^;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/59391.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>