コンピューターのことなどを綴ったメモ (旧:目から鱗 w/SQLite)

Jeans & Development 電子ブロック工房 三日坊主 フロントページ

Vistaにおいて、VBScriptスクリプト中で管理者権限に移行する方法 [プログラミング]

2008年4月12日

SFC mini用の新しいinstall.vbsが完成。

option explicit
Dim wmi,os,value,wsh,sha,sfo
Set sfo=CreateObject("Scripting.FileSystemObject")

do while WScript.Arguments.Count=0 and WScript.Version>=5.7

  'Check if Vista
  Set wmi = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
  Set os = wmi.ExecQuery ("SELECT * FROM Win32_OperatingSystem")
  For Each value in os
    if left(value.Version,3)<6.0 then exit do 'Exit if not Vista
  Next

  'Run this script as admin.
  Set sha=CreateObject("Shell.Application")
  sha.ShellExecute "wscript.exe",""""+WScript.ScriptFullName+""" vista","","runas"

  WScript.Quit
loop

'Current directory may be moved to system32, maybe not.
Set wsh=CreateObject("WScript.Shell")
wsh.run "regsvr32.exe """+sfo.GetAbsolutePathName(WScript.ScriptFullName & "\..\" & "sfcmini.dll")+""""

Vistaかどうかのチェック方法として、『WSHのバージョンが5.7以上』かつ『Windowsのバージョンが6.0以上』で調べている。これに該当する場合、Shell.ApplicationオブジェクトのShellExecuteメソッドを利用して管理者権限でwscript.exeを起動しなおす(このとき、引数に『vista』を指定)。最後に、regsvr32.exeを実行して終了。

QIQを試してみた [プログラミング]

2008年4月7日

今度は、もどきではないクロージャの、PHPでの実装について。

先日の記事、『PHPでクロージャもどき』を書いた後、hsurさんからの指摘などもいただいて色々調べた結果、先の記事の方法ではcreate_functionを使う不便さを除けば、一般的なクロージャの機能は一通りそろえていることは分かった。

一方で、create_functionの不便さはいかんともしがたいと思っていた矢先、知ったのがこれ:
続々・Zend Engine Hack (クロージャもあるよ) (拡張モジュールもあるよ) - 讃容日記:

C++/CLIを使うか? [コンピューター・その他]

2008年4月6日

先日報告した、SFC miniのVistaでの不具合に付いてであるが、どうやらSFC miniがunmanagedコードであることが原因であるようだ。VistaではWSHのバージョンが上がって、managedコードでWSHが動いるらしい。managedコードからunmanagedのSFC miniを呼び出す事になる。それぞれ独立して動く分にはよいが、文字列の受け渡しなど、unmanagedがわからmanagedがわに情報を移動させた場合、managedがわがGCでunmanagedなメモリ領域を処理してしまうのかもしれない。

で、どうしたものかと色々調べた結果、おそらく解決策になるであろう方法を見つけた。

いままたC++が熱い!「C++/CLI」として大進化したVisual C++ 2005

プロの方々は今更何をとおっしゃるかも知れないけれど、私はこれを昨日知った。恐るべし、マイクロソフト。

Visual C++ でランタイム不要のDLLを作成する方法 [プログラミング]

2008年4月4日

備忘メモ:Visual C++ 2008でランタイム不要のDLLを作成する方法

Project
  -> Properties
    -> Configuration Properties
        -> C/C++
            -> Code Generation
                -> Runtime Library

この項目の中に、

・Multi-threaded (/MT)
・Multi-Threaded Debug (/MTd)
・Multi-Threaded DLL (/MD)
・Multi-Threaded Debug DLL

があるので、/MT もしくは、/MTd を選択する。

参考:MSDN

空飛ぶペンギン [General]

2008年4月1日

今年のエイプリルフールねたで、私の一番のお気に入りは、これ。
YouTubeの動画挿入のテストもかねて…。それにしても、うまく撮れてる。

ところで、ペンギンは本当に飛ぶ。私は、海遊館でペンギンが飛ぶところをちゃんとこの目で見た。

PHPで動的OOPもどき [プログラミング]

2008年3月26日

PHP5では、クラスで__call()メソッドが使えるので、JavaScriptみたいな動的オブジェクトが作れそう。

<?php

$obj=(object)$obj;
$obj->testfunc=create_function('$i','return $i+1;');
//echo $obj->testfunc(2);// Fatal Error
$f=&$obj->testfunc;
echo $f(2);// 3

$obj=new dynamic_obj;
$obj->testfunc=create_function('$i','return $i+1;');
$obj->testfunc2=create_function('$i','return $i+2;');
echo $obj->testfunc(2);// 3
echo $obj->testfunc2(2);// 4

$obj->__destruct=create_function('','echo "__destruct!";');//__destruct!

class dynamic_obj{
    public function __call($methodname,$args){
        return call_user_func_array($this->$methodname,$args);
    }
    public function __destruct(){
        if (isset($this->__destruct)) call_user_func($this->__destruct);
    }
}

実行結果

334__destruct!

どんなときに便利か、今は思いつかないけれど。

PHPでクロージャもどき [プログラミング]

2008年3月25日

クロージャとは何かと言う話。

これを知るため、Googleで『クローじゃ』もとい『クロージャ』で検索すると、最上位に出るのがこれ。

クロージャ - Wikipedia

これによると、

クロージャ (Closure) は、プログラミング言語において引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決する関数のことである。

とのこと。ちなみに、『クローじゃ』で検索すると、次のものが出る。

PHPでクローじゃもどき - odz buffer

JScriptでinputBoxを使う [プログラミング]

2008年3月25日

マイクロソフトの新しいシェル、PowerShellについて色々と見ていて、私自身が一番分かりやすい説明だと思ったのが、次の記事。

Windowsスクリプティング環境比較:PowerShell vs WSH

PowerShell自身について何か書くのは別の機会に譲るとして、これを読んで面白いことに気がついたので、メモ。この記事の中から、マイクロソフトの次のページにリンクされている。

Converting VBScript Commands to Windows PowerShell Commands

VBScriptでできることは一通りPowerShellでできるらしい。で、思い出したのが、inputBox。これは、WSHにおいてはVBScriptにだけ実装されている機能で、JScriptでは使えない。PowerShellではどうかと、調べてみた。

SFC miniのインストールがWindows Vistaで失敗する件について [プログラミング]

2008年3月21日

現在配布中のSFC mini ver 1.0.1をWindows Vistaにインストールしようとすると、次のようなエラーが出てインストールできません。

the call to DLLRegisterServer failed with error code 0x80004005

このエラーを回避するためには、次に述べるいずれかの方法を用いてください。

1)管理者としてコマンドプロンプトを開き、SFC mini ディレクトリに移動した後に、install-AMD.vbsもしくはinstall-INTEL.vbsを実行する。
2)MakeExeを用いてinstall-AMD.vbsもしくはinstall-INTEL.vbsをexeファイルに変換した後、このexeファイルを管理者として実行する。

いずれの方法でもインストール可能なはずです。

また、Windows Vistaのバグだと思われること(下記参照)が原因で、サンプルプログラムのいくつかが動きません。VBSファイルを少し改変することで、この不具合を回避することができます。例えば、WinSockClient.vbsの場合だと、2行目あたりを次のように変更してください。

dim code
code=CreateObject("SfcMini.tools").Include("<Winsock.vbs>")
Execute code

WinForm等のライブラリを用いているスクリプトについては、ライブラリ自身のVBSファイルを変更する必要があります。これについては、時期配布バージョンで対応する予定です。

(参考)

1)この不具合についてですが、COMからの戻り値である文字列を直接Executeした場合に、Execute自体は成功するけれども、その直後に不具合が発生するという状況です。ガベージコレクタ周りの不具合では無いかと考えています。WSHのこのような利用の仕方はまれなケースなので、Windows側でこのことについて改善されるかどうかは分かりません。

2)Windows Vistaでは、wscript.exeに対してDEPを無効にすることはできないようです。WinForm等を利用するスクリプトを実行する場合は、install-AMD.vbsを利用してください。

スパム対策ロードマップ [Nucleus]

2008年3月16日

スパム対策ロードマップを少し変更することを考えている。

Googleで『CAPTCHA』というキーで検索した場合に上位に出てくる記事に以下のものが有る。

CAPTCHAは愚策

CAPTCHAが人間に一手間とらせるのが嫌いと考えるのは私も同じで、だからこのサイトではProtectByMD5を採用している(JavaScriptを利用)のだが、この方法は上記サイトで提案している方法の一つである。ただ、心配されているとおり、ブラウザの機能をそのままスパムロボットが持ってしまった場合(実際には、これはそれほど難しくない)、そういったロボットにはJavaScriptの難しい計算は何の問題にもならなくなる。
<<前の記事   後の記事>>