コンピューターのことなどを綴ったメモ (旧:目から鱗 w/SQLite)
| Jeans & Development | 電子ブロック工房 | 三日坊主 | フロントページ |
WSHでWin32APIを呼び出す-その10 [プログラミング]
2005年7月7日
あとは、WndProcスクリプトファイル名の指定と、トラックすべきメッセージの指定であるが、こちらの方はそれほど難しくはない。これらの機能のため、DLLに次の関数を追加した。
char WndProcScript[256]="wscript.exe wndproc.vbs";
void __stdcall DwSetWndProcScript( char* T )
{
int i;
for (i=0;i<256;i++)
if ( (WndProcScript[i]=T[i])==0) break;
}
unsigned long TrackHandle[256];
unsigned long TrackMsg[256];
int TrackNum=0;
long __stdcall DwSetTrackedHandleMsg(unsigned long hWnd, unsigned long uiMsg)
{
if (256<=TrackNum) return 0;
TrackNum++;
TrackHandle[TrackNum]=hWnd;
TrackMsg[TrackNum]=uiMsg;
return -1;
}
void __stdcall DwClearTrackedHandleMsg()
{
TrackNum=0;
}日本語の文字化け [Nucleus]
2005年7月7日
検索にはかかるのだが、問題が一つ。googleの検索結果表示画面では、日本語が文字化けしているのである。問題はスキンのヘッダにありと思い、htmlのソースを見てみると、<head>のところで、
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
となっていた。これは問題なので早速
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
に変更したが、これでいいのかな?
WSHでWin32APIを呼び出す-その9 [プログラミング]
2005年7月7日
前回までに製作した、dwtools.dllは、『Hello, World!』プログラムに特化したものであり、まだまだ汎用性は低い。現段階では、少なくとも次のような問題が有る。
1)ユーザ定義の構造体を引数に持つAPIを呼び出した際、そのAPIからの戻り値が構造体に収められている場合に、それを取り出す事が出来ない。
2)WndProcで、WM_PAINT, WM_DESTROY以外のメッセージをトラック出来ない。
3)WndProcで呼び出されるスクリプトのファイル名が、wndproc.vbsに限られている。
4)wndproc.vbsで、グローバル変数・スタティック変数を使用することが出来ない。
5)WndProc以外のコールバック処理(EnumXXXX等)が行えない。
これらの内、1)-3)は、解決可能である。4)については、グローバル変数の内容をファイルに保存する形にすれば解決できる(他にも手があるかもしれない)。5)については、DLLの中に新たにコールバック関数を作成するしか手がないが、よく使う『EnumWindows』あたりを実装しておけば、あとは殆ど必要無いのではなかろうか(VB ver4 以前では不可能な機能であったわけだし)。
そこでまず、1)-3)について対処することにした。
WSHでWin32APIを呼び出す-その8 [プログラミング]
2005年7月5日
前回までの記事で、VBscriptとDynaWrapに簡単で汎用的なDLLを加えることで、WinAPIによりウインドウを表示させることが出来た。最後にいよいよ、『Hello, World!』の表示である。これには、コールバック関数の処理をしなければならない。
wscript.exeの実行により開始されたプロセスは、スクリプトの実行用にスレッドを一つ走らせている。前回の記事のtest.vbsでは、新規ウインドウの作成によりスレッドの制御が例のコールバック関数に移るわけであるが、このコールバック関数が終了しない限りスレッドの制御がスクリプトの実行に戻ることはないようである。例えば、『コールバック関数の中でSleep関数の呼び出しを繰り返すようにループさせておき、一度スクリプトに制御を移す。続けて、このスクリプトの実行結果をなにかしらの形で捕らえた時にSleep関数のループから抜け出す。』といったことを試してみたが、全く駄目であった。
WSHでWin32APIを呼び出す-その7 [プログラミング]
2005年7月4日
前回までの記事で、ユーザー定義型の構造体を引数に持つWinAPIを呼び出せるようになった。引き続き、VBで出来た『Hello, World!』プログラムを見てみよう。
Option Explicit Type POINTAPI x As Long y As Long End Type
前回詰まったここの部分は、解決した。続きは…
Const SW_SHOW = 5 (略) Declare Function LoadIcon Lib "user32" Alias "LoadIconA" _ (ByVal hInstance As Long, ByVal lpIconName As String) As Long (略) Private g_chAppName As String Private g_chClassName As String Private p_hInstance As Long, p_hPreInst As Long Private p_pchCmdLine As String, p_iCmdShow As Integer
ここまでは問題なし。Main()関数を見てみる。
Sub Main() 'WinMainと互換性を持たせるための記述 p_hInstance = App.hInstance p_hPreInst = App.PrevInstance p_pchCmdLine = Command p_iCmdShow = SW_SHOW g_chAppName = "TestApplication" 'アプリケーションの名前 g_chClassName = "TestWndClass" 'ウィンドウクラス名 If InitApplication(p_hInstance, AddressOf WndProc) = True Then
一番大きな問題はこの行にある。VBscriptでは、『AddressOf 』は使えない。
ドライブ:Alingsås [Driving]
2005年7月3日
街を少し散歩し、外れにあるNolhagaという場所まで行った。ここにはちょっとした宮殿(かなり小さい)があり、庭もきれいにしてある。フランスの庭園をこぢんまりさせた感じで、なかなか良い。7月は金曜日の夕方にジャズのコンサートがあるらしいので、また来ることになりそうだ。
この公園の周りには小さな運河が沢山あって、住宅街の中も運河が通っている。運河沿いの家はどこも小さなボートを持っていて、たまたま見かけた風景では、買い物袋を座席に載せてモーターボートがゆっくり進んでいた。何とも優雅な買い物だこと。
帰りに少しトラブル(というほどのものでもないが)。にわか雨に遭ったので、木下でしばしの雨宿りをした。普段なら無駄な時間の過ごし方というところだが、週末の小旅行でのこういった出来事は、コレはコレでよいものである。
WSHでWin32APIを呼び出す-その6 [プログラミング]
2005年7月1日
前回までの記事で、ANSI文字列を自作DLL内で確保したメモリ領域に構築し、そのANSI文字列に対するポインタをVBscriptに渡すことに成功した。今回はいよいよ、ユーザ定義型の構造体を引数に持つWin32APIの呼び出しである。テストとして、comdlg32.dllにある、GetOpenFileNameを呼び出してみた。このAPIはOPENFILENAME構造体を使用している。
WSHでWin32APIを呼び出す-その5 [プログラミング]
2005年6月30日
VBscriptとDynaWrapで、ユーザ定義型の構造体を因数に持つWin32APIを呼び出す方法を考えている。前回までで、文字列に対するポインタを呼び出すことを解決しなければいけないという結論になった。ここで新たな問題が発生した。
下にdnyawrapNt.zipに含まれているMsgBox.vbsから実行部分だけを抜粋した。
UserWrap.Register "USER32.DLL", "MessageBoxA", "I=HsSu", _
"f=s", "R=l"
UserWrap.MessageBoxA Null, "MessageBox (ANSI)", _
"From DynaWrap Object", 3
このスクリプトの実行結果は、次の様になる。

このスクリプトに少し改変を加えたのが次である。
Set UserWrap = CreateObject("DynamicWrapper")
UserWrap.Register "USER32.DLL", "MessageBoxA", "I=HsSu", _
"f=s", "R=l"
T="MessageBox (ANSI)"
UserWrap.MessageBoxA Null, T, _
"From DynaWrap Object", 3
このスクリプトの実行結果は次のようになった。

なんと、この場合文字列のAPIへの受け渡しがうまく行っていない。
WSHでWin32APIを呼び出す-その4 [プログラミング]
2005年6月29日
VBscript でDynaWarpを用いてWin32APIの呼び出しをする際、ユーザ定義型の構造体をどのようにして受け渡すのかを考えている。前回までの記事で、実際に使われている構造体のメモリ上の状態と同じ物をメモリ上に構築すれば良いということになった。
さて、構造体に含まれているInt型やLong型の値はそのままメモリ上に構築されるが、文字列型を含んでいる場合は文字列そのものではなく、文字列の入っているメモリへのポインタ値が入っている。
そこでまず、文字列へのポインタ値を取得する方法から考えた。
WSHでWin32APIを呼び出す-その3 [プログラミング]
2005年6月29日
先のVB バージョンのプログラムを順に見てゆき、VBscriptとの互換性を考えてみることにする。
Type POINTAPI
x As Long
y As Long
End Type
2行目でいきなりつまずいてしまった。『Type...End Type ステートメント』はVBscriptには含まれていない機能である。どのように解決すればよいだろうか。


