...

墜懇嘉轟響 ま 窮こゞて、 r」サ鮮へι

by user

on
Category: Documents
13

views

Report

Comments

Transcript

墜懇嘉轟響 ま 窮こゞて、 r」サ鮮へι
`C"
7
9‐
3‐
1/4
9-3 Win32 APl
Win32 API
標準 DLLと 呼ばれる特別な DLLの 総称です。
(Windows APplicatiOn
Win32 APIに アクセスすることで、
この レッスンでは、
標準 DLLを 使用 して vlsu● l Basicァ プリケー シ ヨン
の機能を拡張 します。
Pr08摯 `■鳩 Interfacc)
Visual Basicか ら
呼び出す ことが可能 な
3つ の 主 要 WIndOws DLI
Windowsオ ペ レーテ イ ン グ シス テ ム
(Windows 95/98お よび Windows NT)の 32ビ ツトバ ー ジ ョンに は 、
Keme132と い う標 準 DLLが あ ります 。
Uscr32、 GD132、
Windows APlは 、 これ らの DLLで 構 成 され て い ます 。
これ らの DLLに よ り、Windows APIの ほ とん どの 機 能 が提 供 され ます 。
(1)User32 DLL
(2)GD132 DLL
Windowsの
これ ら3つ のDLL以 外 に
コン トロール、お よび
一ダイアログボ ック スタ答理オ る。
Windows 95お よび
Windo、 vs NTに は
描 画 、 フ オ ン ト、 メ タフ アイ ル な どの
多くのDLLが あり、
タラフイツク出力を管理1す る。
t3D Kemc132 D肌
それ らの DLLを 使用する ことで
visual Basicア プリケーシ ヨン
の機能を拡張できます。
メモ リの管理、 リツースの管理、
その他 の低 レベルでのオペ レーティング機能な ど、
オペレーテイングシステムのFス クを管理卜乞。
Win32 APIを 使用す ると
Wlndowsオ ペ レー テ イ ン グ シ ス テ ム 内 で 使 用 す る
関数ヽ直接アクセスできます。
Win32 APIの 使用の利点
以 下 の処 理 を実 行 で き ます 。
visua Basicは 強力 な総合プ ログラミング言語です。
(│)visual BasiCで は
しかしi vI:ud
不可能 なタスクの実行
Basic oム
笹な構能でも
対 応 しきれ な い 要 求 が あ ります 。
る開発 ツールでは、
2)パ フたニマンスの向上 DLLの 作成 に使用す
多 くあ場合、高速 で効率的な
コー ド乞ふ 成できます。
この コー ドは、パフオーマ ンス面で
ニ
Visual Basicの コ ドに優 ることが しば しばあ ります。
DLLは 独 立 した フ ア イ ル な の で 、
DLLだ けを更新することができます。
呼び出し元のアプリケーシヨンを
再 コンパイルする必要 はあ りません。
これは、標準DLLと
COM DLLの どちらにも当てはまります。
APIの 使用方法 について
用意 されているッール
COMと
Win32 APIの 相異点
O APIに 付 属 の文 書
レ
パテ イ製APIの リフアレィスマニユアι
②サード
⑥ VisualBasicの APIゞ ユーア
IAI COMコ ンポーネント
lBI Win32 AΠ
ォー トメーシ ヨンにより
wordな どのアプリケーシ ヨンの
Win32 APIな どの 標準DLLを 使用す る場合
メソッドや顎●パテ セ慣行する場合
「
coMを 介 して
wOrdが
提供するプロシージヤ製唾
壺亜Dン す。
ほとんどのアプリケーシヨンは
COM D比 を
理 電⊥ど三主。
墜懇嘉轟響ま窮こ
ι
?
ゞて
r」 サ
鮮へ
、
直接関数を(蚕画E>す 。
標 準 DLLは 、COMイ ンター フエイ
wOrdや Excclと 同 ふ 亀 プ は
1対 応 してい ないので、
^に windOws APIに アクセスで きません。
標準DLLに は タイプライプラリが
ないため、
プ ロパ テ イの詳 細 が 含 まれ ます 。
Visual Basic D眺
は
COMべ
ス の DLLで す 。
標準
Dじ
を
visua Basicで は
作 成 で き ませ ん 。
ォブジェク トプラウザや
`
自動メ )ヾ 表示 など
の機能は使用で きません。
標準 DLLが 必要な場合は、
Microsoft ViSual C++な ど、
別 の開発 ツール を使用 して作成 します
しかし、COM DLLが 籍薄q DILを 使用しなければ
ならないこともあります。
使用できないために、
MCS'
Win32 APlに よる
アプリケー ションの機能 と
Win32 APIを 使用すると
パ フォーマンスを強化できます。
ω 驚 i:[、
[∬
1)DLL関 数 を宣言する。
Win32 APIの 使用方法
2)DLL関 数 を呼び出す。
アプリケーシヨンやシステムに障害が発生する可能性があります。
アプリケーシヨンは、必ず保存してならテストしてくださいo
│
(1)DLLの 宣言
dPnvatel Declare Fundon nalnc ttb"I昴
■
"ぴ 響
"滅獅
“
Private oeclare Function CetWindowsDirectory Lib ''kerne1 32'' Alia
しong
Private Sub cndFind‖ i ndows_Cllck()
Din stlWinDir As String
Din lngLen As Long
'そ の文字列長 を渡す
_
lngLen = GetWindowsDi rectory(strWi nDi r, Len(strWinDir))
.GetWi ndowsDi rectory関 数 と Left関 数 の
'戻 り値 を使用 して、残 りのヌ ル文字 を
'す べて削除する
strWi nDi r ‐ Left(strwinDir, lngLen)
D「Lを 宣言す るには、
DLLの
ByVai nsize As Long)As
strWinDir = Stri ng(255, 0)
'関 数 を呼 び出 し、 strWinDir変 数 と
クラスモジユールで宣言するには、
ユア
あ使用方法
''GetWindowsDi rectoryA''(ByVal lpBuffer As String, 二
'文 字列 変数 をヌル文字で理 め、DLLに 渡す
DLLプ ロシージヤをフォームまたは
Priv“ eで 官言する必要があ ります。
I APIピ
カ レ ン トWindOwsデ イ レク トリ を見 つ け ます 。
び]llargL⇒ llAs,日
通常は、標準 モジュールを使用 して宣言 します。
標準 モジュールで宣言 したDLLは 、既定で は PtCbl、 cで 、
Vヽ ual Ba● cア プリケー ション内のどこか らで も呼び出せ ます。
`
して
ユ ー ザ ー の コ ン ピュ ー タ上 の
│
Pr市 atc
自分が記述 するコー ドで
そのプロシージャを使用できます
tll)9CtWindwSDirectow関 数 t使 用
'[Alias・ a″ as12ame・ ][(argliSt)]
bllaη び
または
[PuЫ
呼び出 し
visual Basicの プロシージャと同様に、
を宣言すれば、
あ らか じめプ ロシージヤの位置 を指定 し、
プロシージャを呼 び出す引数 を宣言 してお く必要があ ります。
PubliC P‖ Vatel Declare Sub pamc Lib"″
〔
(2)DLLの
DLLプ ロシージャ
COM DLLの 場合 とは異な り、標準 DLLを 使用す る場合は、
Declarcス テー トメン ト
構文
ヘ
この レッスンでは、Wh32 API DLLを 使用す る方法のみを説明 します。
ア プ リケ ニ シ ョ ン の 拡 張
DLLの
9-〕・
・■
Dcclareス テー トメン トを
strWinDi r = strWinDir & ''¥"
MsgBox ''Windows is in ・ & strWinDir
End Sub
DLLプ ロシー ジャの
呼び出 しについては
APIピ ユーアを使用すると、
宣言 をコピー して
認電ぶ瀾器潔tFttttl
詳細 については、
「DI Lプ ロシージャヘの文字列の引き渡 し」
MSDNラ イプラリで
または
モジュール に貼 り付ける
ことができるので、
「DLLプ ロシージヤヘの
その他の情報の引き渡し」
を参照してください。
DLL関 数の宣言で誤 りを犯す
可能性が減少 します。
図 9.9 APIビ ューア
図99に APIピ ユーアの表示例 を示 します。
尋
」
軍夕
彗
孔:話死
:│
l Windowsの
[ス ター ト]ボ タン
クリック
41ビ blな
ム]メ ニユー か ら
[プ ログラ
[MicrOSOft
Vi:ual Ba:ic 6 0]、
LM,P"11Ч
ール
里ヒ
――[APIビ ]― ア
または一 [プ ログラム]メ ニ■ から
「
澤択
[Mに rosoi Vヽ ual Studlo 6 9]、
ー
ル
6oツ
smd。
」
誌:。 ltvi品
[金 お
]
]
ユで
、
一
ア
ス
ー
ニ
ユ
か
ら一― キ
月メ
蒙1北
オ
の順 に ポ イ ン トし、
[フ
:イ
lテ
選択
るほか、
APIピ ユ ア では、 O APIテ キス トフアイルを直接利用す
・
―スフ
ータ
が
② テキス トファイルをデ
4きt織
デー タベ=ス を作成す ると、
mdbデ ータベースフアイルが作成 されます。
その後は、APIビ ユーアの使用 時 に
mdbフ ァイルをロー ドで きるようにな ります。
ボ
タ
イ
'レ ち
く
開
] 陣 ツ驚
∵鰐を
ザ
ダイアログボツクス
4[有 効 な項 目]
―― 目的の プロシージヤ名
リス トボ ツクスで、
[追 加]ボ
タン
選択
一―― をのプロシージャを
す
]
[選 択 された項 目
クリック
リス トボツクスに追加
[追
[有 効な項目]
リス トボ ツクスに
win32 APIの リス ト表示
― ダ12宣 冨方法を
下の‐
口
]ボ タン
ヵ
]で 、
[適 用範囲
5[コ ピー]ボ タン 一
クリック
選択 できます。
追加 したAPIを
クリップボー ドにコピー
―一 目的のモジュール に
ステー トメ ン トを
貼 り付け
6 Dcclarc
tul〕
貼 り付けたCetWindOwsDirecow関 数
Private Declare Function CetWindowsDirectory Lib ''kerne1 32'' All as
"GetWi ndows01 rectoryA'。
(ByVal lpBuffer As String, _
ByVal nSize As Long)As Long
し
意∼
l
‐
]
の順 にポ イン トし、
'C6qノ
'望
2 AHビ
引数を渡す方法 を考慮する必要があ ります。
│・
2υ
°滉や鶴
,。
MC'D
9‐ 3-3/4
コー′
″ヾックプロシージヤの作成
コールバ ック
プロシージヤ
一部 のWindows API関 数 に対 しては、
引 数 と して
関数 ポ イ ンタ を
渡す必要があ ります。
関 数 小 4・ /グ
[よ
、
ジ ヤのような
ユーザ ー定義のプロシージヤの
Visual Basicプ ロシ
この ようなVヽ u7al
Basicプ
Willdows DLLに 渡す場合 に利用 します。
引数 と して
ア ドレスを
ロ シージャのことを呼びます。
これは、外部のDLLか ら呼び出されるプロシーィヤです。
DLLで は、 コ ル バ ックプロシージヤを使用 して
ク ライア ン トに情報 を通知 または提供 します。
ユl
AddreSsOf演
算子
Visual Basicで は、
コールバ ックプ ロシージャ
AddressOf演 算子 を使用 して
DLLに 渡
のア ドレスを
AddressOf演 算子 を使用 して
します 。
ポインタを
Window APlに 渡 します。
ポインタによって、
コールバ ックプ ロシージ ャメモ リ上の
位置 を
APIは 認識できます。
コールバ ックプロシージヤは
標準 モジユール内に置 く必要があ り、
正 しい構文で記述 しなけれ ばな りません。
Visual B¨ icに おける
① visudBa● c側 ?
コールバ ック
プ ロシージヤの働 き
図 910
Win32 APIの
SctTimcr関 数 が 呼 び 出 され 、
CallTimerプ ロシージャでは
② AddresSOf演 算子 を使 って
MyCallBackプ ロシージャの
夫
´も,ヽ し
SetTimcr関 数へ渡 されます。
ア ドレス(ポ イ ンタ)が
`“ ',,
の
MyCallBackプ ロシージャが 、
C)ViSual BaSc側
タイマー によって
指定間隔 で呼び出されます。
④ MyCallBackプ ロシージヤでは、
次 に WIn32 APIの
図9.10 Visual Baslcの コールバックプロシージャ
KlllTimerが 呼 び 出 され 、
⑤
L2〕
EnumWhdows関 数
イマーを停止 し、
リソースを解放 します。
lタ
EnumWindows関 数 は
列 挙 関数 で 、
シ ステ ム 上 で 開 か れ て い るす べ て の ウ ィ ン ドウの ハ ンドル を リ ス トで き ます 。
T:%liお 11'命
に等
EnumWindowsは
(例 )EnumWind owsの
Dcclareス テー トメン ト
説哺
visual Basic側 の コー ドか ら呼 び 出 す こ とに な ります 。
Declare Function EnunWindows lib "user32" _
(ByVal lpEnunFunc aS Long. 8yva1 lParam as Long)As Long
覧初 の 引 数 (lpEnumFunc)
① EnumWhlowsは
に渡 され た 関数 を
コールバ ックプ ロ シ ー ジャ と して
繰 り返 し呼 び出す こ とに よって
機能 します。
② EnumWindOwsは
卜 薩﹂ド
⑥
コールバ ックプロシー ジャを
開いているウイン ドウ
のハ ン ドルを
呼 び出すたびに、
そのプロシー ジャに渡 します。
EnumWindows関 数 の
最 初 の引 数 と して
ユーザー定義の i
コールバ ックプロシージ ャを
︲
渡す必要があ ります。
0興)ゴ ールバックプロシージヤとして
たとえば、
値 をリス トボ ックスに追加 した り、
hWnd値 をウィン ドウ名に変換 する
などのアクシヨンを実行する関数を
記述で きます。
9→
_4/4
実習 :コ ールバックプロシージヤの作成
し、
この実習では、最初 に新規 の Visual Basicプ ロジエク トを作成
数と
ら
EnumChildWindows関
ユーアを使
USer32
DLLか
APlビ
用 して
を追加します。
しetwindowTeXt関 数
次にコールバツクプロシーイlt作瑾レてヽ
EnumChildWindOW,関
そ の ア ドレ ス を
数 に 渡 します 。
フオーム■?す べてのコントロール名がリストボツクスに表示さ4ま す。
アプリケーシヨンでは、
コントロールを
図 9.11 実習用 フ ォームのレイアウト
1.新 しいプロジエタ ト
(標 準
Fomlに 譴勁ロ
EXE)を 開きます。
2以 下のコントロールを 一
Forlnl lこ
i自
ListBox
CheckBoX
‐
OptionButton
カロ
CommandButton
3 コマ ン ドボタンの
に設 定
&List WindOWS
cmdLIstWindows
AP:ビ ューアを使用して
WindowS APlを inn
フォームは
図911の ようになります。
Capionプ ロパテ イ
ォブジェク ト名
[7ア イ冽
2[テ キ ス ト API
…… [Win32apil卜 1]ボ タ ン
卜77イ ル
レ キ
メ■ ユー な ら 一
L APIピ ユ ー ァ で 、 一
澤択
亀
フ ァイル を開 く]
ク リック
ダ イ ア ロ グ ポ ツクス 表示
3.[有 効な項 目]
リス トボ ツクスで
一
_
.選 択
用 範 囲
甲
]で
一 ‐ [追 ヵ口]ボ
一― [適 用範囲]で ‐
[Private]選 択
5[コ ピ ]ボ タン ーー 選本した?暉 彎 ろオ
ト
2イ
タリッタ
[Public]選 択
選択
[GetWindOWTCXtl
4
‐
[EnumChidWindOWS]―
ー
プロシージヤが
[選 択 された項 目]
リス トボツクスに追加
タン
クリツタ
[追 加]ボ
メントが
クリップボー ドにコピー │れ ます
クリツク
、 _ [標 準モジュールの追加トー‐[開 く]ず タン
クリツク
ロ
■
ク
ト
ジ
] [標 準モジユール]
[タ
6 Visual Basicで
メニユーか ら
7
コピ し た宣言 を、一
の順に選択 して
一般宣言 セクシヨンに以下のような宣言が追加 されます。
新規標準 モジユールの 一― 宣言 を貼 り付けるには、
一般宣言 セクシ ヨン
に貼,付 け
ctr tt vキ
[編 集i'ニ ユニあ [貼 り付け]
ー を押すか、
をクリック
Private Declare Function EnunChildWindows Lib "aser32" _
(ByVal hWndParent As Longi _
ByVa1 lpEnumFunc As Long, ByVa1 lParam As Long)As Long
Private Declare Function cetWindowText Lib ''user32'' _
Alias ''GOtWindowTextA" (3yval hwnd As Long, _
ByVal ]pString As String, ByV1l cch As Long)As Lon0
い
[11巌
レ`ツク
コープ
プロシージャを作成
を
更師け 九
■
i蓋 鼻ン
島
1新 しい
―
・ [ツ ール]メ ニューか ら
[プ ロシージャの追加]
標準 コー ドモジユール
選択
を開いている状態で、
2 EnumCallBaokと い う
Publicな
Function
プ ロ シー ジ ャ 選 択
[OK]ボ
‐―― EnumCallBackプ ロ シー ジ ャ
タン
ク リ ツク
の ひ な形 が 追 加 され るの で 、
甲省
ず蔦
ま
、
ξ
^相
trて
以下の ように引数と戻 り値を指定 します。
Public Function EnumCal18ack(ByVal hWndChild As Long, _
lean
ByVal dum As Long)As p。 。
End Function
MSDNの ドキュメン トに
:多
記載 されてい ます。
[ζ
特に コールバ ック
プ ロシージヤは、
引数 の数や型、
また戻 り値 の型が
正 しく記述 されないと、
以 下 の コー ドを EnumCallBackプ ロ シ ー ジ ャ に追 加 します 。
メモ リ保護違反 などの
実行 エ ラーを起 こし、
VisuJ Basic自 体が異常終了す る
場合があ ります。
Publlc Function EnunCallBack()
Din lngs12e As Long
Din strPadString As String
strPadString = String(255, 0)
lngSize = GetWindowText(hWndChild. _
strPadString, Len(strPadStri ng))
strPadStri ng = LeftS(strPadString, lngSize)
Forml しistl Addlten strPadString
EnumCall Back = True
End Function
WindOWS APl
l Fonnlで
___
コ マ ン ドボ タ ン を
ダブルクリッタ
を呼び出す
CmdListWindoWS_Cllckイ
一
以下のコー ドを追加
ベ ン トに
Private Sub cndLlstWindowS_Cllck()
Dlm binRtn As Boolean
blnRtn = EnunChildWindows(Forml hwnd,_
人ddressof EnumCal]Back, o)
2 プロジェクトを __〔 YPractceVCh09]
PJAPI vbpと
して
フォルダに保存し、
―― ァプリケーシヨン
をテスト
順
でや 、
Fly UP