[C++] 継承クラスでの、仮想関数による再定義(オーバーライド)と、普通の関数の再定義(隠ぺい)の違い

よくある仮想関数を使ったポリモーフィズム(多様性)の例とは少し違うけど
(複数の種類の派生クラスのアドレスを、親クラスのポインタに代入するやつ)、
メソッドをオーバーライドした場合と、隠ぺいした場合の動作の違いを例示すると、
こんな感じのソースになる。 続きを読む

WM_SIZEを処理するとCDialogResizeが動かない?

最近、簡潔さとヘッダだけで動く手軽さ、動作の速さに出力バイナリの小ささから、
ATL/WTLに若干ハマっている。

WM_SIZEを処理するとCDialogResizeが動かないという
初歩的すぎるミスを犯したのでメモメモ。

続きを読む

VBA / VBS で正規表現による関数を使った置き換え

JScriptのString.replaceメソッドは非常に便利だ。
置き換え文字列に、「文字列」ではなく「関数」が使えるところが意外と使える。

"test0 test1".replace(
    /\w+(\d)/g,
    function($0,$1){return (Number($1)+1).toString();})

てな具合に。

普段はWSHではVBSなんぞ使ったりしないが、
たまにどうしてもVBAやVBSを使わなくてはならない場合がある。
そんなときにそれっぽい動作をする様なのを、
不完全ながら自作してみた。

続きを読む

WSHで強制的にcscriptで起動させつつエラーは出す

JScriptで、ダブルクリックしたときにコマンドプロンプトで強制的に起動するとき
こんな感じで起動してやると、
Echoがたくさんあっても大変なことにならず、
しかもエラーコードもしっかり返すことができる。

function CRun(){
    if (!(/CSCRIPT\.EXE/i).test(WScript.FullName)){
        var WshShell = new ActiveXObject("WScript.Shell");
        var strParam = "";
        for (var i = 0; i < WScript.Arguments.Count(); i++){
            strParam += " \"" + WScript.Arguments(i).replace("\"", "\"\"") + "\"";
        }
        WScript.Quit(WshShell.Run("cmd.exe /v:on /s /c \"cscript.exe //nologo \""
            + WScript.ScriptFullName + "\"" 
            + strParam + " & pause & exit /b !ERRORLEVEL!\"", 8, true));
    }
}
CRun();
WScript.Echo("CScript!");
WScript.Quit(8);

環境変数の遅延展開をつかって、ERRORLEVELを戻しているのがミソ。
これで、エラーが起きたときの処理もできる。
私は業務を軽減するツールとか作るときに割とよく使う。