WSHでWin32APIを呼び出す-その4
2005年6月29日
(←戻る)
VBscript でDynaWarpを用いてWin32APIの呼び出しをする際、ユーザ定義型の構造体をどのようにして受け渡すのかを考えている。前回までの記事で、実際に使われている構造体のメモリ上の状態と同じ物をメモリ上に構築すれば良いということになった。
さて、構造体に含まれているInt型やLong型の値はそのままメモリ上に構築されるが、文字列型を含んでいる場合は文字列そのものではなく、文字列の入っているメモリへのポインタ値が入っている。
そこでまず、文字列へのポインタ値を取得する方法から考えた。
試行錯誤の結果、やはり自作のDLLを使うことになった。次のような、文字列を扱う最も簡単な関数を作成し、呼び出した。
このDLLを、DynaWrapによりVBscript上で次のように呼び出せば、"This is a test"という文字列へのポインタ値が得られる。
あとは、バイトアレイの様なものを文字列として構築し、その文字列を構造体としてDLLに与えればよい…と考えたのだが、そう簡単にはいかなかった。
(続く)
VBscript でDynaWarpを用いてWin32APIの呼び出しをする際、ユーザ定義型の構造体をどのようにして受け渡すのかを考えている。前回までの記事で、実際に使われている構造体のメモリ上の状態と同じ物をメモリ上に構築すれば良いということになった。
さて、構造体に含まれているInt型やLong型の値はそのままメモリ上に構築されるが、文字列型を含んでいる場合は文字列そのものではなく、文字列の入っているメモリへのポインタ値が入っている。
そこでまず、文字列へのポインタ値を取得する方法から考えた。
試行錯誤の結果、やはり自作のDLLを使うことになった。次のような、文字列を扱う最も簡単な関数を作成し、呼び出した。
LPCTSTR __stdcall RefOfString(LPCTSTR T)
{
return T;
}
{
return T;
}
このDLLを、DynaWrapによりVBscript上で次のように呼び出せば、"This is a test"という文字列へのポインタ値が得られる。
UserWrap.Register "xxxx.dll", "RefOfString", "I=s", "f=s", "R=l"
ret=UserWrap.RefOfString("This is a test")
ret=UserWrap.RefOfString("This is a test")
あとは、バイトアレイの様なものを文字列として構築し、その文字列を構造体としてDLLに与えればよい…と考えたのだが、そう簡単にはいかなかった。
(続く)