プログラミング
| Jeans & Development | 電子ブロック工房 | 三日坊主 | フロントページ |
VB.NETでマシン語を使う [プログラミング]
2005年12月14日
現在のSFCは、Win32APIの殆どをVB.NET内で宣言する形になっている。これは、DynaWrapから脱却するための一つの方法であったのだが、逆にWin32API以外の関数をDLLから呼び出して実行することは出来ない(DynaWrapなら可能)。
そこで、やはり最終的にはDynaCall様の物をVB.NET内に構築して実行する形にしたいと思っている。これには、DynaCallの様なインラインアセンブラが必要である。
前に一度述べたように、こちらのページではインラインマシン語の使い方を紹介している。ただし、ver 2.0の.NET frameworkが必要で、これはまだβバージョンである。正式なver 2.0の登場が待てないので、別の形でインラインマシン語を利用する方法を考えてみた。
そこで、やはり最終的にはDynaCall様の物をVB.NET内に構築して実行する形にしたいと思っている。これには、DynaCallの様なインラインアセンブラが必要である。
前に一度述べたように、こちらのページではインラインマシン語の使い方を紹介している。ただし、ver 2.0の.NET frameworkが必要で、これはまだβバージョンである。正式なver 2.0の登場が待てないので、別の形でインラインマシン語を利用する方法を考えてみた。
WSHでWin32APIを呼び出す-その16 [プログラミング]
2005年12月10日
(←戻る)
Windowsフォームを用いた次のようなHello WorldプログラムがSFCで作成できるようになった。
今回の目玉としては、"Command1_click"という文字列を与えるだけで簡単にボタンのクリックイベントを登録できるところ。
実行画面

(追記)
このシリーズは、この記事をもって終了します。ここまで述べた一連のこととほとんど同じことは、SFC mini を用いれば行うことが出来ます。
Windowsフォームを用いた次のようなHello WorldプログラムがSFCで作成できるようになった。
option explicit
Dim SFC
Set SFC = CreateObject("dwtools.NET.SFC")
Execute SFC.Initialize
Execute SFC.Include("<WinForm>")
Dim Form1
Set Form1=new WinForm
call Form1.AddControl(0,"STATIC","List1", _
WS_CHILD+WS_VISIBLE+SS_CENTER, _
100,50,300,30, 0)
call Form1.AddControl(0,"BUTTON","Command1", _
WS_CHILD+WS_VISIBLE+BS_PUSHBUTTON, _
100,100,300,30, "Command1_click")
Form1.Init
Form1.Show
wscript.quit(Form1.MsgLoop)
Sub Command1_click(hwnd,message,wparam,lparam)
msgbox "Hello World!"
End Sub今回の目玉としては、"Command1_click"という文字列を与えるだけで簡単にボタンのクリックイベントを登録できるところ。
実行画面

(追記)
このシリーズは、この記事をもって終了します。ここまで述べた一連のこととほとんど同じことは、SFC mini を用いれば行うことが出来ます。
WSHでWin32APIを呼び出す-その15 [プログラミング]
2005年12月9日
(←戻る)
SFCの完成形がようやく見えてきた。番外編で述べた、複数のファイルに分かれていたツールの本体を一つのDLLにまとめることも終えたし、EnumWindows等のコールバック関数を扱うAPIも使用可能になった。また、ボタンやリストコントロールなども表示できることを確認した。現在の所、このような簡単なコード
で、次のようなウインドウが表示できる。

また、SFCの説明ページも完成した。
(続く)
SFCの完成形がようやく見えてきた。番外編で述べた、複数のファイルに分かれていたツールの本体を一つのDLLにまとめることも終えたし、EnumWindows等のコールバック関数を扱うAPIも使用可能になった。また、ボタンやリストコントロールなども表示できることを確認した。現在の所、このような簡単なコード
option explicit
Dim SFC
Set SFC = CreateObject("dwtools.NET.SFC")
Execute SFC.Initialize
Execute SFC.Include("<WinForm>")
Dim Form1
Set Form1=new WinForm
call Form1.AddControl(0,"STATIC","リストコントロール", _
WS_CHILD+WS_VISIBLE+SS_CENTER, _
100,50,300,30, 1)
call Form1.AddControl(0,"BUTTON","ボタンコントロール", _
WS_CHILD+WS_VISIBLE+BS_PUSHBUTTON, _
100,100,300,30, 2)
Form1.Init
Form1.Show
wscript.quit(Form1.MsgLoop)で、次のようなウインドウが表示できる。

また、SFCの説明ページも完成した。
(続く)
WSHでWin32APIを呼び出す-番外編 [プログラミング]
2005年11月27日
現在SFCをバージョンアップしている。VB.NETを使用した物に移行しており、順次必要ファイルをdwtools.NET.dllに統合中である。現在のところ(ver 0.3.0.2)、依存ファイルがdwtools.NET.dll, dwtools.dll, sfclodar.wsc, SFC.vbsの4つという、あまりかっこよくない状態になっているので、全ての機能をdwtools.NET.dll一つだけにまとめてしまう予定である。このうち、dwtools.dllはウィンドウプロシージャをこの方法でdwtools.NET.dllに取り込むという形で何とかなりそうで、あとは、sfcloader.wscによるSFC.vbsの読み込み部分の統合が残されているだけとなる。
VB.NETで関数ポインタの値を取得する2 [プログラミング]
2005年11月25日
VB.NETで関数ポインタの値を取得する [プログラミング]
2005年11月21日
VB6で用いられていたAddressOf演算子による関数ポインタの取得等は、.NETではデリゲートという、より高機能なものに取って代わられたらしい。現在制作中のSFC for vbscriptは.NETを利用したものに移行しつつあるが、ここでは相変わらず関数ポインタが必要である。VB.NETでの関数ポインタの取得について色々と調べてみた。
WSHでWin32APIを呼び出す-その14 [プログラミング]
2005年11月19日
(←戻る)
いままでWin32APIの呼び出しに、DynaWrapを用いていた。DynaWrapの再配布の条件などを知るために色々な方に質問してみたが、このツールのライセンスがどうなっているかよく分からない。制作者の方とも連絡が付かないそうである。DynaWrapを改変した物をWeb上に見かけるが、以上の理由からそういった改変や再配布が合法的なのかどうかよく分からない状況である。
そこで、DynaWrapから脱却することにした。Win32APIを呼び出す方法としては他に、VBなどでActiveXを作り、それを経由して行う方法が一般的なので、それをここでも用いることにした。
vbscript を書く度にActiveXをコンパイルし直すのではSFCをツールとして制作している意味がないので、殆ど全てのWin32APIを含むActiveXをVB.NETを用いて作成することにした。出来たDLLのサイズは約500kbで、実用の範囲内に収まった。SFC自体の使用方法は以前と殆ど変わらず、上手くアップグレードできたと思う。この時点での最新バージョンは、ver 0.3.0.2(.NET frameworkが必要)。ちなみに、DynaWrapを用いたものの最終バージョンは、ver 0.2.0 であり、こちらはDynaWrapが要る代りに.NETは必要ない。
(SFC ver 0.3.0.2 はこちらから)
(SFC ver 0.2.0 はこちらから)
2005-12-08追記
ver 0.3.0.2 は初期バージョンで、文字列の操作に不具合在り。 ver 0.3.1で修正されている。あと、ver 0.3.1は、ヘルプファイルも梱包。
(SFC ver 0.3.1 はこちらから)
(続く)
いままでWin32APIの呼び出しに、DynaWrapを用いていた。DynaWrapの再配布の条件などを知るために色々な方に質問してみたが、このツールのライセンスがどうなっているかよく分からない。制作者の方とも連絡が付かないそうである。DynaWrapを改変した物をWeb上に見かけるが、以上の理由からそういった改変や再配布が合法的なのかどうかよく分からない状況である。
そこで、DynaWrapから脱却することにした。Win32APIを呼び出す方法としては他に、VBなどでActiveXを作り、それを経由して行う方法が一般的なので、それをここでも用いることにした。
vbscript を書く度にActiveXをコンパイルし直すのではSFCをツールとして制作している意味がないので、殆ど全てのWin32APIを含むActiveXをVB.NETを用いて作成することにした。出来たDLLのサイズは約500kbで、実用の範囲内に収まった。SFC自体の使用方法は以前と殆ど変わらず、上手くアップグレードできたと思う。この時点での最新バージョンは、ver 0.3.0.2(.NET frameworkが必要)。ちなみに、DynaWrapを用いたものの最終バージョンは、ver 0.2.0 であり、こちらはDynaWrapが要る代りに.NETは必要ない。
(SFC ver 0.3.0.2 はこちらから)
(SFC ver 0.2.0 はこちらから)
2005-12-08追記
ver 0.3.0.2 は初期バージョンで、文字列の操作に不具合在り。 ver 0.3.1で修正されている。あと、ver 0.3.1は、ヘルプファイルも梱包。
(SFC ver 0.3.1 はこちらから)
(続く)
WSHでWin32APIを呼び出す-その13 [プログラミング]
2005年10月26日
(←戻る)
前の記事で、Malloc周りを変えたいと書いたが、その為のプログラムの変更を行っていてあることに気が付いた。ver 0.1.2.2 では、ユーザ定義型の変数用のメモリを確保するため、dwtools.dll のソースコードの冒頭部分で次のように記述している。
このままだと、このmBuff[65536]の部分がdllファイルに含まれてしまうため、dll が無駄に大きくなってしまう。つまり、128kb の部分に延々と0xFFが書かれたようなdllファイルが出来てしまうわけだ。
前の記事で、Malloc周りを変えたいと書いたが、その為のプログラムの変更を行っていてあることに気が付いた。ver 0.1.2.2 では、ユーザ定義型の変数用のメモリを確保するため、dwtools.dll のソースコードの冒頭部分で次のように記述している。
#include <windows.h>
unsigned short mBuff[65536]={0xFFFF};
int lastMBuff=65536;このままだと、このmBuff[65536]の部分がdllファイルに含まれてしまうため、dll が無駄に大きくなってしまう。つまり、128kb の部分に延々と0xFFが書かれたようなdllファイルが出来てしまうわけだ。