Comments
Description
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と して フォルダに保存し、 ―― ァプリケーシヨン をテスト 順 でや 、