月別アーカイブ: 2008年3月

新しいクラスを作る(7) ― PInvoke

概要

New-Class.ps1 を使い、PowerShell から Win32API を呼び出します。

用例

Beep 関数を使って音を鳴らします。

PS> New-Class Class11 {

>>     PInvokeMethod public, static stdcall bool kernel32.dll Beep([UInt32], [UInt32])

>> }

>>

 

PS> [Class11]::Beep(262, 500)

方法

PInvokeMethod は次のように指定します。

PInvokeMethod <属性> <呼び出し規約> <戻り値の型> <ライブラリ名> <メソッド名> <パラメータ型リスト> <キャラクタセット> <エントリ名>

<属性> には、static を含める必要があります。Win32API はオブジェクトインスタンスを受け取らないからです。

<呼び出し規約> は、ほとんどの場合 stdcall で構いません。特に指定のある場合は変更してください。

<ライブラリ名> には、その API 関数が収められているダイナミックリンクライブラリを指定します。

<メソッド名> は、通常、その API 関数と同じものを使ってください。もし別の名前を使いたい場合には、<エントリ名> に API 関数の名前を指定してください。

<キャラクタセット> は、auto, ansi, unicode から選択してください。デフォルトは auto です。

新しいクラスを作る(6) ― インターフェース

概要

New-Class.ps1 でインターフェースを実装する方法を解説します。

用例

IDisposable インターフェースを実装するクラス Class10 を作成します。

PS> New-Class Class10 -Interface([IDisposable]) {
>>     Method public, virtual void Dispose @() {
>>         Write-Host 'Now disposed.'
>>     }
>> }
>>

NameSpace Name BaseType
——— —- ——–
  Class10 System.Object

PS> $o = New-Object Class10
PS> $o.Dispose()
Now disposed.

方法

用例のように、「-Interface」パラメータに実装するインターフェースの配列を渡し、必要なメソッドを実装します。メソッドは「public, virtual」でなくてはなりません。

新しいクラスを作る(5) ― メソッド

概要

次のスクリプトにより、PowerShell で使える新しいクラスを作ることができます。詳しい作り方を 新しいクラスを作る(1) より少しずつ解説していますので、順にご覧ください。今回は、メソッドの作り方を解説します。

ダウンロード

メソッドの定義

メソッドは次のように定義します。

Method <属性> <戻り値の型> <メソッド名> <パラメータ型リスト> <実装>

<属性> には、 public, private, static のいずれかを指定できます。複数指定する場合には、「public, static」のように、カンマで区切って指定します。

<戻り値の型> には、型名を指定します。<実装> スクリプトブロック内で出力されたオブジェクトは、この型にキャストされ、戻り値となります。

<パラメータ型リスト> は、たとえば「([int], [string])」のように指定します。この場合、int 型の第一引数は $args[1] に代入され、 string 型の第二引数は $args[2] に代入されます。$args[0] には、オブジェクトインスタンスが代入されます。

用例

次の用例では、int 型の引数を二つ受取り、その合計を返すメソッド Plus を持つクラス Class9 を定義します。

PS> New-Class Class9 {
>>     Method public int Plus([int], [int]) {
>>         $args[1] + $args[2]
>>     }
>> }
>>

NameSpace Name BaseType
——— —- ——–
  Class9 System.Object

PS> $o = New-Object Class9
PS> $o.Plus(1234, 567)
1801