<?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>Software</title><link>http://blogs.wankuma.com/youchi/category/1082.aspx</link><description>Software</description><managingEditor>ゆーち</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>ゆーち</dc:creator><title>XAMPP 1.7.4インストール</title><link>http://blogs.wankuma.com/youchi/archive/2011/07/24/201220.aspx</link><pubDate>Sun, 24 Jul 2011 01:47:00 GMT</pubDate><guid>http://blogs.wankuma.com/youchi/archive/2011/07/24/201220.aspx</guid><wfw:comment>http://blogs.wankuma.com/youchi/comments/201220.aspx</wfw:comment><comments>http://blogs.wankuma.com/youchi/archive/2011/07/24/201220.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/youchi/comments/commentRss/201220.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/youchi/services/trackbacks/201220.aspx</trackback:ping><description>64bit Windows 7 な環境でXAMPP 1.7.4をインストールしたら、コンパネ起動時に&lt;br /&gt;
XAMPP Component Status Check failure [3]&lt;br /&gt;
ってエラーがでてました。&lt;br /&gt;
&lt;br /&gt;
ぐぐった結果レジストリを次のように編集したらうまくいったので、メモ。&lt;br /&gt;
&lt;br /&gt;
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\xampp]&lt;br /&gt;
Install_Dir=C:\\xampp&lt;br /&gt;
&lt;br /&gt;
（c:\xamppとなっているところを、C:\\xamppに変更しました）
&lt;img src ="http://blogs.wankuma.com/youchi/aggbug/201220.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ゆーち</dc:creator><title>Windowのサブクラス化</title><link>http://blogs.wankuma.com/youchi/archive/2011/06/18/200100.aspx</link><pubDate>Sat, 18 Jun 2011 23:39:00 GMT</pubDate><guid>http://blogs.wankuma.com/youchi/archive/2011/06/18/200100.aspx</guid><wfw:comment>http://blogs.wankuma.com/youchi/comments/200100.aspx</wfw:comment><comments>http://blogs.wankuma.com/youchi/archive/2011/06/18/200100.aspx#Feedback</comments><slash:comments>183</slash:comments><wfw:commentRss>http://blogs.wankuma.com/youchi/comments/commentRss/200100.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/youchi/services/trackbacks/200100.aspx</trackback:ping><description>お久しぶりのWIN32ですｗ。&lt;br /&gt;
&lt;br /&gt;
とあるプログラムで、ウィンドウハンドルをサブクラス化してたんですな。&lt;br /&gt;
サブクラスといっても、オブジェクト指向的な用語ではなく、Windows独特なので、知らない人も多いかもｗ&lt;br /&gt;
&lt;br /&gt;
ウィンドウのメッセージを処理するプロシージャを置き換えて別の挙動をさせたいときに使うワザとでもいいましょうか。&lt;br /&gt;
&lt;br /&gt;
こんな実装です。&lt;br /&gt;
&lt;pre&gt;
WNDPROC oldProc = ::GetWindowLong( WinHandle, GWL_WNDPROC );
::SetWindowLong( WinHandle, GWL_WNDPROC, (WNDPROC)&amp;MyProc );
&lt;/pre&gt;
その後、GetWindowLongPtr とか SetWindowLongPtr を使いましょうなどという別名みたいな推奨があったんですが、キャストが少なくなる程度でそれほど便利だとは思ってませんでした。&lt;/ br&gt;
&lt;br /&gt;
自前のプロシージャでは、自分が処理するメッセージ以外を元のウィンドウに処理させます。&lt;br /&gt;
&lt;pre&gt;
LRESULT CALLBACK MyProc( HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
 if(Msg==自前処理)
 {
   return foo();
 }
 return ::CallWindowProc( oldProc, Wnd, Msg, wParam lParam );
}
&lt;/pre&gt;
こんな具合です。&lt;br /&gt;
&lt;br /&gt;
処理が必要なくなったときは、同様に SetWindowLong を使って、ウィンドウプロシージャを元に戻しておきます。&lt;br /&gt;
::SetWindowLong( WinHandle, GWL_WNDPROC, oldProc );&lt;br /&gt;
&lt;br /&gt;
と、そこに問題が。&lt;br /&gt;
アプリケーションの起動後にサブクラスした状態で、別の常駐プロセスが同様にサブクラス化をするんです。&lt;br /&gt;
&lt;br /&gt;
本来、プロシージャのチェインは、&lt;br /&gt;
「MyProc」－「oldProc」&lt;br /&gt;
のつながりになっているわけで、このまま終了時に戻せば問題なかったわけです。&lt;br /&gt;
&lt;br /&gt;
別のプロセスが同様にサブクラス化をすると、プロシージャのチェインがこうなります。&lt;br /&gt;
「別プロセス」－「MyProc」－「oldProc」&lt;br /&gt;
&lt;br /&gt;
この状態で自前部分の終了処理が実施されてしまうと、別プロセスは ::CallWindowProc で MyProc を呼び出してしまい、アクセス違反で異常終了してしまいます。&lt;br /&gt;
&lt;br /&gt;
サブクラス化を実施する手順と解除する手順が正しくないと必ずこうなってしまうわけです。&lt;br /&gt;
こりゃ困ったよ。&lt;br /&gt;
&lt;br /&gt;
で、結論。&lt;br /&gt;
SetWindowSubclass&lt;br /&gt;
RemoveWindowSubclass&lt;br /&gt;
DefSubclassProc&lt;br /&gt;
というAPIが追加されてました。&lt;br /&gt;
&lt;br /&gt;
Windows 2000 SP4 以降にしか対応してませんが、十分でしょうｗ&lt;br /&gt;
&lt;br /&gt;
ま、苦労しましたよ（笑




&lt;img src ="http://blogs.wankuma.com/youchi/aggbug/200100.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ゆーち</dc:creator><title>ソフトの導入は男性主導なのかな？</title><link>http://blogs.wankuma.com/youchi/archive/2011/06/07/199690.aspx</link><pubDate>Tue, 07 Jun 2011 11:02:00 GMT</pubDate><guid>http://blogs.wankuma.com/youchi/archive/2011/06/07/199690.aspx</guid><wfw:comment>http://blogs.wankuma.com/youchi/comments/199690.aspx</wfw:comment><comments>http://blogs.wankuma.com/youchi/archive/2011/06/07/199690.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/youchi/comments/commentRss/199690.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/youchi/services/trackbacks/199690.aspx</trackback:ping><description>メールソフト Becky!で、メールの宛先に敬称をつけたりできるプラグインを公開してます&lt;br /&gt;
過去にもここに書いたけど、BkReplyer ってんです。&lt;br /&gt;
いちおう、&lt;a href="http://bit.ly/fgnZ6z" target="blank"&gt;「ここ」&lt;/a&gt;にリンク貼っときます。よろぴこ。&lt;br /&gt;
&lt;br /&gt;
たくさんの方々に使っていただいていますが、ちょっと気づいたことがあります。&lt;br /&gt;
登録された方の９５％の方が男性なんですなぁ。&lt;br /&gt;
ビジネスメール中心で使われるプラグインだからなのかな？&lt;br /&gt;
とも思うけど、なんとなく Becky! そのものを使う人に女性が少ないのではないかと・・・&lt;br /&gt;
&lt;br /&gt;
ダウンロードしてユーザー登録して使う必要のあるソフトウエアが、女性に敬遠されがちなのではないだろうか、と思ったのでした。&lt;br /&gt;
&lt;br /&gt;
考えてみると、あちきも女性のＰＣにいろいろソフトを導入してあげることが多いような気がするなぁ。&lt;br /&gt;
どんなソフトが便利だっつう情報は男性から手に入れることが、はるかに多いし・・・&lt;br /&gt;
&lt;br /&gt;
ということで。&lt;br /&gt;
世の男性諸君。使ってる便利なソフトをお隣の女性に教えて差し上げましょうね。&lt;br /&gt;
&lt;br /&gt;
久しぶりに書いたら、またとりとめのない内容になっちまった。orz
&lt;img src ="http://blogs.wankuma.com/youchi/aggbug/199690.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ゆーち</dc:creator><title>SVNリポジトリが壊れちゃってるんですが・・・</title><link>http://blogs.wankuma.com/youchi/archive/2010/12/02/195438.aspx</link><pubDate>Thu, 02 Dec 2010 12:50:00 GMT</pubDate><guid>http://blogs.wankuma.com/youchi/archive/2010/12/02/195438.aspx</guid><wfw:comment>http://blogs.wankuma.com/youchi/comments/195438.aspx</wfw:comment><comments>http://blogs.wankuma.com/youchi/archive/2010/12/02/195438.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/youchi/comments/commentRss/195438.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/youchi/services/trackbacks/195438.aspx</trackback:ping><description>SVNクライアント側で更新しようとすると&lt;br /&gt;
REPORT(URL:******):Could not read chunk size:&lt;br /&gt;
Secure connection truncated(https://****)&lt;br /&gt;
ってなエラーで更新できません。&lt;br /&gt;
&lt;br /&gt;
SVNサーバにある、VisualSVN Server Manager を起動して、問題となっているリポジトリのフォルダをクリックすると、Server Manager が固まってしまいます。&lt;br /&gt;
ＷＥＢで調べてみると、Linuxサーバのお話ばっかりのようで。&lt;br /&gt;
ＳＶＮサーバは Windows マシン(Win7)なんですなぁ。&lt;br /&gt;
&lt;br /&gt;
むーん・・・このリポジトリを復活させることはできないものだろうか・・・&lt;br /&gt;
こまったぞー・・・&lt;br /&gt;

&lt;img src ="http://blogs.wankuma.com/youchi/aggbug/195438.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ゆーち</dc:creator><title>ＣｕｔｅにＱｔ</title><link>http://blogs.wankuma.com/youchi/archive/2010/08/18/192404.aspx</link><pubDate>Wed, 18 Aug 2010 14:38:00 GMT</pubDate><guid>http://blogs.wankuma.com/youchi/archive/2010/08/18/192404.aspx</guid><wfw:comment>http://blogs.wankuma.com/youchi/comments/192404.aspx</wfw:comment><comments>http://blogs.wankuma.com/youchi/archive/2010/08/18/192404.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/youchi/comments/commentRss/192404.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/youchi/services/trackbacks/192404.aspx</trackback:ping><description>福岡でＱｔ勉強会を開催します。&lt;br /&gt;
&lt;br /&gt;
２０１０年９月４日（土曜日）&lt;br /&gt;
１５：００～１８：００&lt;br /&gt;
&lt;br /&gt;
今後の進め方も含めた、第０回勉強会です。&lt;br /&gt;
&lt;br /&gt;
あちきが参加する＝宴会も実施する。&lt;br /&gt;
ってことで、どぞ興味のある方はご参加ください。&lt;br /&gt;
&lt;br /&gt;
こちらで募集してます。&lt;br /&gt;
http://atnd.org/events/7338&lt;br /&gt;&lt;img src ="http://blogs.wankuma.com/youchi/aggbug/192404.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ゆーち</dc:creator><title>SendInput API でマルチバイト文字</title><link>http://blogs.wankuma.com/youchi/archive/2010/07/26/191637.aspx</link><pubDate>Mon, 26 Jul 2010 12:43:00 GMT</pubDate><guid>http://blogs.wankuma.com/youchi/archive/2010/07/26/191637.aspx</guid><wfw:comment>http://blogs.wankuma.com/youchi/comments/191637.aspx</wfw:comment><comments>http://blogs.wankuma.com/youchi/archive/2010/07/26/191637.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/youchi/comments/commentRss/191637.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/youchi/services/trackbacks/191637.aspx</trackback:ping><description>keybd_event 使って２バイト系文字列を処理するのって、結構大変だったんだよね・・・&lt;br /&gt;
いつの間にか、SendInput なるＡＰＩができているらしく、UNICODEで処理できるようになってました。&lt;br /&gt;
&lt;br /&gt;
つうことで、書き上げたモジュールをさらしておきます。&lt;br /&gt;
&lt;pre&gt;
#include &amp;lt;windows.h&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;string&amp;gt;

// マルチバイト文字用(CP_ACP固定ｗ)
void KeyInput( const char *Text_ )
{
  std::wstring  wstr;
  int length = ::MultiByteToWideChar( CP_ACP, 0, Text_, -1, NULL, 0 );
  if( length == 0 )
  {
    return;
  }
  else
  {
    wstr.resize( length );
    ::MultiByteToWideChar( CP_ACP, 0, Text_, -1, &amp;wstr[ 0 ], length );
  }
  std::vector&amp;lt;INPUT&amp;gt;  inputs;
  for( int i = 0; i &lt; length; i++ )
  {
    for( int j = 0; j &lt; 2; j++ )
    {
      INPUT input;
      input.type        = INPUT_KEYBOARD;
      input.ki.wVk      = 0;
      input.ki.wScan      = wstr[ i ];
      input.ki.time     = 0;
      input.ki.dwExtraInfo  = 0;
      input.ki.dwFlags    = KEYEVENTF_UNICODE;
      if( j != 0 )
      {
        input.ki.dwFlags  |= KEYEVENTF_KEYUP;
      }
      inputs.push_back( input );
    }
  }
  ::SendInput( length * 2, &amp;inputs[ 0 ], sizeof( INPUT ) );
  return;
}

// VK_xxx 用
void VKeyInput( int *VKeys_, int Count_ )
{
  std::vector&amp;lt;INPUT&amp;gt;  inputs;
  for( int i = 0; i &lt; Count_; i++, VKeys_++ )
  {
    for( int j = 0; j &lt; 2; j++ )
    {
      INPUT input;
      input.type        = INPUT_KEYBOARD;
      input.ki.wVk      = *VKeys_;
      input.ki.wScan    = ::MapVirtualKey( *VKeys_, 0 );
      input.ki.time     = 0;
      input.ki.dwExtraInfo  = 0;
      input.ki.dwFlags    = KEYEVENTF_SCANCODE;
      if( j != 0 )
      {
        input.ki.dwFlags  |= KEYEVENTF_KEYUP;
      }
      inputs.push_back( input );
    }
  }
  ::SendInput( Count_ * 2, &amp;inputs[ 0 ], sizeof( INPUT ) );
  return;
}
&lt;/pre&gt;
動作検証するとき、デバッガでブレークポイントを貼ると、フォーカスがソース上に移るので、ソースが書き変わっちゃって困った（笑）&lt;img src ="http://blogs.wankuma.com/youchi/aggbug/191637.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ゆーち</dc:creator><title>スタックとヒープ</title><link>http://blogs.wankuma.com/youchi/archive/2010/07/24/191536.aspx</link><pubDate>Sat, 24 Jul 2010 13:42:00 GMT</pubDate><guid>http://blogs.wankuma.com/youchi/archive/2010/07/24/191536.aspx</guid><wfw:comment>http://blogs.wankuma.com/youchi/comments/191536.aspx</wfw:comment><comments>http://blogs.wankuma.com/youchi/archive/2010/07/24/191536.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/youchi/comments/commentRss/191536.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/youchi/services/trackbacks/191536.aspx</trackback:ping><description>一時的に使用する文字列のための領域を new TCHAR[n] delete []とか、malloc(n), free() を繰り返し使うのは処理効率が落ちると思ってしまいます。&lt;br /&gt; 
せせこましい時代を過ごしてしまったものだから（笑）&lt;br /&gt;
&lt;br /&gt;
最近、よくこんな書き方をします。&lt;br /&gt;
&lt;pre&gt;
void foo( size_t Length_ )
{
  char buffer[ 512 ];
  char *data = ( Length_ &lt; sizeof( buffer ) ) ? buffer : new char[ Length_ ];

  // data について処理

  if( data != buffer )
  {
    delete [] data;
  }
}
&lt;/pre&gt;
わずかな領域のために確保と解放を繰り返すってのを避けられるはずだ、って思ってしまうんですなぁ。&lt;br /&gt;
（笑）&lt;img src ="http://blogs.wankuma.com/youchi/aggbug/191536.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ゆーち</dc:creator><title>【C++】dynamic_cast でポインタの安全性を確認できる？</title><link>http://blogs.wankuma.com/youchi/archive/2010/06/11/190028.aspx</link><pubDate>Fri, 11 Jun 2010 10:49:00 GMT</pubDate><guid>http://blogs.wankuma.com/youchi/archive/2010/06/11/190028.aspx</guid><wfw:comment>http://blogs.wankuma.com/youchi/comments/190028.aspx</wfw:comment><comments>http://blogs.wankuma.com/youchi/archive/2010/06/11/190028.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/youchi/comments/commentRss/190028.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/youchi/services/trackbacks/190028.aspx</trackback:ping><description>こんなコードばっかりあるわけですよ。&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;
int Foo( SomeClass *Src_ ){
  int value;
  if( Src_ != NULL ){
    value = Src_-&gt;Value;
  }else{
    value = -1;
  }
  return value;
}
&lt;/pre&gt;
&lt;br /&gt;
Src_ が NULL かどうかはチェックできてるけど、妙な値だったりするとアウトですよね。&lt;br /&gt;
そこでこんな風に書いてみた。&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;
int Foo( SomeClass *Src_ ){
  int value;
  SomeClass *src = dynamic_cast＜SomeClass *＞( Src_ );
  if( src != NULL ){
    value = src-&gt;Value;
  }else{
    value = -1;
  }
  return value;
}
&lt;/pre&gt;
&lt;br /&gt;
こうすると、もうちょっとましなチェックができることになるのかな？&lt;br /&gt;
&lt;br /&gt;
＃もちろん RTTI 有効でコンパイルっての前提です。&lt;br /&gt;
&lt;img src ="http://blogs.wankuma.com/youchi/aggbug/190028.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ゆーち</dc:creator><title>SUBST って Substance の略なのかな？</title><link>http://blogs.wankuma.com/youchi/archive/2010/05/31/189596.aspx</link><pubDate>Mon, 31 May 2010 18:16:00 GMT</pubDate><guid>http://blogs.wankuma.com/youchi/archive/2010/05/31/189596.aspx</guid><wfw:comment>http://blogs.wankuma.com/youchi/comments/189596.aspx</wfw:comment><comments>http://blogs.wankuma.com/youchi/archive/2010/05/31/189596.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/youchi/comments/commentRss/189596.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/youchi/services/trackbacks/189596.aspx</trackback:ping><description>_MAX_PATH ってのが 260 で定義されてるんだけど、ご存じの通り今のファイルシステムはそれ以上の長さのパス名が利用できます。&lt;br /&gt;
日本語のファイル名などが使われてるとよけいに長くなったりします。&lt;br /&gt;
&lt;br /&gt;
広く利用されている圧縮解凍のＤＬＬを使ってみると、パス名の領域に _MAX_PATH を使っているらしく、長いパス名が使われるとスタックを破壊したりするものがあるようです。&lt;br /&gt;
バグとして指摘されました(´･ω･`)&lt;br /&gt;
セキュリティホールとも言えますな・・・&lt;br /&gt;
&lt;br /&gt;
もちろん、カレントディレクトリを変更し、相対パスをつかって処理するという方法もありますが、複数のドライブ間に関わるケースとか後始末とかがややこしすぐる。&lt;br /&gt;
ってことで、SUBST コマンドと同様に動作するプログラムを作って対応しますた。&lt;br /&gt;
作業用に作ったフォルダを、単一ドライブとして割り当てておいて、ファイルを処理した後割り当てを解除するってな方法です&lt;br /&gt;
それはそれで妙なんだけどね（笑）&lt;br /&gt;
&lt;br /&gt;
とりあえず、うまく行くようになりましたので、書き上げたモジュールをさらしておきます。&lt;br /&gt;
どこかのだれかが重宝してくれるかもしれないしね・・・ｗ&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;
//=========================================================================
//  Substance Drive
//=========================================================================
#include &lt;windows.h&gt;
#include "TChar.h"
#include "SubstanceDrive.h" // プロトタイプの宣言
#pragma warning( disable : 4996  )
//=========================================================================
// 空きのドライブを取得する(-1=なし,0=A,1=B,...)
int  GetUsableDrive( int StartDrive_ )
{
    // 使用可能なドライブマップを取得 
    DWORD map = ::GetLogicalDrives();
    // 利用可能マップの後段からドライブNoを取得 
    int drive = StartDrive_;
    DWORD mask = ( 0x01 &lt;&lt; drive );
    for( ; mask != 0; mask &gt;&gt;= 1, drive-- )
    {
        if( ( map &amp; mask ) == 0 )
        {
            break;
        }
    }
    return ( drive &lt; 0 ) ? -1 : drive;
}
// 任意ドライブの割り当て
int Substance( const TCHAR *Path_ )
{
    int drive;
    int startDrive = 25;    // Z:
    // 空きドライブを見つけて割り当ててみる
    while( ( drive = GetUsableDrive( startDrive ) ) != -1 )
    {
        if( Substance( drive, Path_ ) == true )
        {
            return drive;
        }
        // エラーなら利用可能なドライブまで探し続ける
        startDrive = drive - 1;
    }
    return -1;
}
// 指定ドライブの割り当て
bool Substance( const int Drive_, const TCHAR *Path_ )
{
    TCHAR   drv[ 4 ];
    drv[ 0 ] = Drive_ + 'A';
    drv[ 1 ] = ':';
    drv[ 2 ] = '\0';
    BOOL rc = ::DefineDosDevice( 0, drv, Path_ ); 
    return rc != FALSE;
}
// 割り当てドライブの解除
bool RemoveSubstance( const int Drive_ )
{
    TCHAR   drv[ 4 ];
    drv[ 0 ] = Drive_ + 'A';
    drv[ 1 ] = ':';
    drv[ 2 ] = '\0';
    TCHAR   path[ _MAX_PATH ];
    BOOL rc = ::QueryDosDevice( drv, path, sizeof( path ) );
    if( rc == FALSE )
    {
        return false;
    }
    rc = ::DefineDosDevice( DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE | DDD_RAW_TARGET_PATH, drv, path );
    return rc != FALSE;
}
// ドライブ名に割り当てられているパス名を取得する
bool GetSubstancePath( const int Drive_, TCHAR *Path_, int Length_ )
{
    TCHAR   drv[ 4 ];
    drv[ 0 ] = Drive_ + 'A';
    drv[ 1 ] = ':';
    drv[ 2 ] = '\0';
    TCHAR   path[ _MAX_PATH ];
    BOOL rc = ::QueryDosDevice( drv, path, sizeof( path ) );
    if( rc == FALSE )
    {
        return false;
    }
    // 割り当てドライブの先頭に "\??\" などが付加されるので、取り除く
    TCHAR   *dvp = _tcschr( path, ':' );
    if( dvp != NULL )
    {
        _tcsncpy( Path_, dvp - 1, Length_ );
    }
    else
    {
        _tcsncpy( Path_, path, Length_ );
    }
    return true;
}
// パス名で割り当てられているドライブを取得する(-1=なし,0=A,1=B,...)
int  GetSubstance( const TCHAR *Path_ )
{
    if( Path_ == NULL )
    {
        return -1;
    }
    // Path_ の終端が '\\' の場合、比較の長さが変わるので変更する
    size_t  cmpLength = _tcslen( Path_ );
    if( cmpLength == 0 )
    {
        return -1;
    }
    if( Path_[ cmpLength -1 ] == '\\' )
    {
        cmpLength--;
    }
    // 使用可能なドライブマップを取得
    DWORD map = GetLogicalDrives();
    int   drive = 25;
    for( DWORD mask = ( 0x011 &lt;&lt; drive ); mask != 0; mask &gt;&gt;= 1, drive-- )
    {
        TCHAR   path[ _MAX_PATH ];
        if( GetSubstancePath( drive, path, sizeof( path ) ) == true )
        {
            size_t  len = _tcslen( path );
            if( 0 &lt; len )
            {
                if( path[ len -1 ] == '\\' )
                {
                    path[ len -1 ] = '\0';
                }
            }
            if( _tcsncmp( path, Path_, max( cmpLength, len ) ) == 0 )
            {
                return drive;
            }
        }
    }
    return -1;
}
&lt;/pre&gt;
&lt;img src ="http://blogs.wankuma.com/youchi/aggbug/189596.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ゆーち</dc:creator><title>DialogBoxをクラス化してみたところ</title><link>http://blogs.wankuma.com/youchi/archive/2010/05/30/189560.aspx</link><pubDate>Sun, 30 May 2010 17:19:00 GMT</pubDate><guid>http://blogs.wankuma.com/youchi/archive/2010/05/30/189560.aspx</guid><wfw:comment>http://blogs.wankuma.com/youchi/comments/189560.aspx</wfw:comment><comments>http://blogs.wankuma.com/youchi/archive/2010/05/30/189560.aspx#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://blogs.wankuma.com/youchi/comments/commentRss/189560.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/youchi/services/trackbacks/189560.aspx</trackback:ping><description>WIN32のダイアログボックスでメッセージマップを実現してみるってことで次のようなクラスをこさえたんですな。&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;
class SDialog : public SWinControl  // SWinControl は HWND のラッパークラスね。
{
protected:
    static SDialog  *Self; // ※ここ。
    const HMODULE   Module;
    const UINT  ResourceId;
private:
    SDialog();
    static  BOOL CALLBACK SDialogProc( HWND Handle_, UINT Message_, WPARAM Wparam_, LPARAM Lparam_ );
    virtual BOOL DialogProc( HWND Handle_, UINT Message_, WPARAM Wparam_, LPARAM Lparam_ );

// 派生クラスでメッセージマップ
#define BEGIN_DLG_MESSAGE_MAP   \
    virtual BOOL DialogProc( HWND Handle_, UINT Message_, WPARAM Wparam_, LPARAM Lparam_ ) \
    {   \
        switch( Message_ ){ \
//
#define DLG_MESSAGE_HANDLER( message, proc ) \
            case (message):{    \
                return (proc)( Handle_, Message_, Wparam_, Lparam_ );   \
            } \
            break;  \
//
#define END_DLG_MESSAGE_MAP \
            default:    \
                break;  \
        }   \
        return 0; \
    }
//
public:
    SDialog( HMODULE Handle_, HWND Parent_, UINT ResourceId_ );
    virtual ~SDialog();
    int  ShowModal();
};
&lt;/pre&gt;
んでもって、実装はこんな感じ&lt;br /&gt;
&lt;pre&gt;
// ダイアログプロシージャのエントリポイント
BOOL CALLBACK SDialog::SDialogProc( HWND Handle_, UINT Message_, WPARAM Wparam_, LPARAM Lparam_ )
{
    SDialog *userdata   = (SDialog *)::GetWindowLong( Handle_, GWL_USERDATA );
    if( userdata == NULL )
    {
        userdata        = SDialog::Self;
        ::SetWindowLong( Handle_, GWL_USERDATA, (LONG)SDialog::Self );
        SDialog::Self   = NULL; //　ねんのためｗ
    }
    SDialog *self       = dynamic_cast＜SDialog *＞( userdata );
    if( self != NULL )
    {
        return self-&gt;DialogProc( Handle_, Message_, Wparam_, Lparam_ );
    }
    return FALSE;
}

BOOL SDialog::DialogProc( HWND Handle_, UINT Message_, WPARAM Wparam_, LPARAM Lparam_)
{
    return FALSE;
}
int  SDialog::ShowModal()
{
    SDialog::Self   = this; // ※ここ。
    return ::DialogBox( Module, MAKEINTRESOURCE( ResourceId ), Parent, (DLGPROC)&amp;SDialogProc );
}
&lt;/pre&gt;
※ここ。って書いているところが苦肉の策（笑）&lt;br /&gt;
派生クラスに virtual BOOL DialogProc(); が実装できるようにするのが目的なんですが、DialogBox API で渡せるのが static なメソッドなため、オブジェクトを示す位置を渡せないんですなぁ。&lt;br /&gt;
&lt;br /&gt;
とりあえず、動いてるけど、なんとまぁみっともない・・・（笑）&lt;br /&gt;
複数の派生ダイアログが動作するようにしたいってところがミソです。&lt;br /&gt;
&lt;br /&gt;
ほかに良い方法ないかなぁ・・・と。&lt;br /&gt;&lt;img src ="http://blogs.wankuma.com/youchi/aggbug/189560.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>