「Any型」の追放に成功した
Any型の追放に成功した
これの続報。
この記事には、id:imihito さんからコメントをいただいていた。
曰く、
記事の
`Call MoveMemory(lpMemory, VarPtr(strText), lngSize)`
に関しては`VatPtr`を`StrPtr`にするとどうなるでしょうか?
と。
そもそもStrPtr
というものを知らなかった。
で、やってみた。
API関数の宣言部の書き換え
問題のAPI関数は、次のもの。
Private Declare Sub MoveMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (ByVal lpDest As Any, _ ByVal lpSource As Any, _ ByVal Length As Long)
メモリの書き込み先と、書き込み元のメモリアドレスの指定っぽい第1・2引数がナゾのAny
型指定になっている。こいつらを、Long
型に変える。
Private Declare Sub MoveMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (ByVal lpDest As Long, _ ByVal lpSource As Long, _ ByVal Length As Long)
呼び出し側コードの修正
そして、Clipboard
クラスのsetText
、getText
メソッド内で、MoveMemory
関数を呼び出している部分のコードを修正する。
リスト1 クラスモジュール
'setTextメソッド内' Call MoveMemory(lpDest:=pointerOfMemory, _ lpSource:=StrPtr(targetText), _ Length:=sizeOfText)
第2引数lpSource
にString
型の変数targetText
を渡していたのを、StrPtr(targetText)
に改めた。
リスト2 クラスモジュール
'getTextメソッド内' Call MoveMemory(lpDest:=StrPtr(targetText), _ lpSource:=pointerOfMemory, _ Length:=sizeOfText)
こちらは、
第1引数lpDest
にString
型の変数targetText
を渡していたのを、StrPtr(targetText)
に改めた。
いづれも、Any
型指定でString
型引数を渡していたのをLong
型に改めたことになる。
実行
次のコードで実行。
リスト3 標準モジュール
Public Sub test() Dim clpBoard As New Clipboard With clpBoard Call .setText("ち~んw") Debug.Print .getText End With End Sub
Clipboard
クラスのインスタンスを作成し、setText
メソッドによってクリップボードに「ち~んw」と書き込み、getText
メソッドでその「ち~んw」を取り出してイミディエイト・ウインドウに出力するだけのコード。
実行結果
おお! 動いた!
おわりに
ちなみに、StrPtr
ではなく、VarPtr
にすると、
このようにエラーとなり、そのまま終了すると、クリップボードが使えなくなる。
StrPtr
に戻して一度実行すると復活しましたが、ヒヤリとしましたw