チュートリアル: Windows API の呼び出し (Visual Basic)Walkthrough: Calling Windows APIs (Visual Basic)

Windows API は、Windows オペレーティング システムの一部であるダイナミック リンク ライブラリ (DLL) です。Windows APIs are dynamic-link libraries (DLLs) that are part of the Windows operating system. 独自の同等のプロシージャを記述することが困難な場合は、これらを使用してタスクを実行します。You use them to perform tasks when it is difficult to write equivalent procedures of your own. たとえば、Windows には FlashWindowEx という名前の関数が用意されていて、これを使用すると、アプリケーションのタイトル バーを交互に明るい色合いと暗い色合いにすることができます。For example, Windows provides a function named FlashWindowEx that lets you make the title bar for an application alternate between light and dark shades.

ご自身のコードで Windows API を使用する利点は、既に記述され、使用されるのを待っている便利な関数が多数含まれているため、開発時間を節約できることです。The advantage of using Windows APIs in your code is that they can save development time because they contain dozens of useful functions that are already written and waiting to be used. 欠点として、Windows API は処理が容易でなく、問題が発生したときに困難な状況になることがあります。The disadvantage is that Windows APIs can be difficult to work with and unforgiving when things go wrong.

Windows API は、相互運用性の特別なカテゴリを表しています。Windows APIs represent a special category of interoperability. Windows API にマネージド コードは使用されておらず、組み込みのタイプ ライブラリはありません。また、使用するデータ型は Visual Studio で使用するものとは異なります。Windows APIs do not use managed code, do not have built-in type libraries, and use data types that are different than those used with Visual Studio. これらの違いにより、また、Windows API は COM オブジェクトではないことから、Windows API および .NET Framework との相互運用性は、プラットフォーム呼び出し (PInvoke) を使用して実現されます。Because of these differences, and because Windows APIs are not COM objects, interoperability with Windows APIs and the .NET Framework is performed using platform invoke, or PInvoke. プラットフォーム呼び出しは、DLL に実装されたアンマネージド関数をマネージド コードから呼び出すことを可能にするサービスです。Platform invoke is a service that enables managed code to call unmanaged functions implemented in DLLs. 詳細については、「アンマネージド DLL 関数の処理」を参照してください。For more information, see Consuming Unmanaged DLL Functions. Visual Basic で PInvoke を使用するには、Declare ステートメントを使用するか、DllImport 属性を空のプロシージャに適用します。You can use PInvoke in Visual Basic by using either the Declare statement or applying the DllImport attribute to an empty procedure.

Windows API 呼び出しは、過去においては Visual Basic プログラミングの重要な部分でしたが、Visual Basic .NET ではほとんど必要ありません。Windows API calls were an important part of Visual Basic programming in the past, but are seldom necessary with Visual Basic .NET. 可能な限り、Windows API 呼び出しではなく .NET Framework のマネージド コードを使用してタスクを実行するようにしてください。Whenever possible, you should use managed code from the .NET Framework to perform tasks, instead of Windows API calls. このチュートリアルでは、Windows API を使用することが必要な場合のために、情報を示します。This walkthrough provides information for those situations in which using Windows APIs is necessary.

注意

次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。The Visual Studio edition that you have and the settings that you use determine these elements. 詳細については、「IDE をカスタマイズする」をご覧ください。For more information, see Personalizing the IDE.

Declare を使用した API 呼び出しAPI Calls Using Declare

Windows API を呼び出す最も一般的な方法は、Declare ステートメントを使用することです。The most common way to call Windows APIs is by using the Declare statement.

DLL プロシージャを宣言するにはTo declare a DLL procedure

  1. 呼び出す関数の名前と引数、引数の型、戻り値、さらに、その関数を含む DLL の名前と場所を特定します。Determine the name of the function you want to call, plus its arguments, argument types, and return value, as well as the name and location of the DLL that contains it.

    注意

    Windows API の詳細については、プラットフォーム SDK Windows API の Win32 SDK ドキュメントを参照してください。For complete information about the Windows APIs, see the Win32 SDK documentation in the Platform SDK Windows API. Windows API で使用する定数の詳細については、プラットフォーム SDK に付属している Windows.h などのヘッダー ファイルを調べてください。For more information about the constants that Windows APIs use, examine the header files such as Windows.h included with the Platform SDK.

  2. [ファイル] メニューの [新規作成] をクリックし、次に [プロジェクト] をクリックして、新しい Windows アプリケーション プロジェクトを開きます。Open a new Windows Application project by clicking New on the File menu, and then clicking Project. [新しいプロジェクト] ダイアログ ボックスが表示されます。The New Project dialog box appears.

  3. Visual Basic プロジェクト テンプレートの一覧から [Windows アプリケーション] を選択します。Select Windows Application from the list of Visual Basic project templates. 新しいプロジェクトが表示されます。The new project is displayed.

  4. DLL を使用するクラスまたはモジュールに、次の Declare 関数を追加します。Add the following Declare function either to the class or module in which you want to use the DLL:

    Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" (
        ByVal hWnd As Integer,
        ByVal txt As String,
        ByVal caption As String,
        ByVal Typ As Integer) As Integer
    

Declare ステートメントの各部Parts of the Declare Statement

Declare ステートメントには、次の要素が含まれます。The Declare statement includes the following elements.

Auto 修飾子Auto modifier

Auto は、共通言語ランタイムの規則 (または、指定されている場合はエイリアス名) に従って、メソッド名に基づいて文字列を変換するようにランタイムに指示する修飾子です。The Auto modifier instructs the runtime to convert the string based on the method name according to common language runtime rules (or alias name if specified).

Lib キーワードと Alias キーワードLib and Alias keywords

Function キーワードの後の名前は、インポートされた関数にアクセスするためにプログラムで使用する名前です。The name following the Function keyword is the name your program uses to access the imported function. これは、呼び出す関数の実際の名前と同じにすることができます。または、任意の有効なプロシージャ名を使用し、Alias キーワードを使って呼び出す関数の実際の名前を指定することもできます。It can be the same as the real name of the function you are calling, or you can use any valid procedure name and then employ the Alias keyword to specify the real name of the function you are calling.

Lib キーワードを指定し、その後に、呼び出す関数を含む DLL の名前と場所を指定します。Specify the Lib keyword, followed by the name and location of the DLL that contains the function you are calling. Windows システム ディレクトリにあるファイルのパスを指定する必要はありません。You do not need to specify the path for files located in the Windows system directories.

呼び出す関数の名前が有効な Visual Basic プロシージャ名ではない場合、またはアプリケーション内の他の項目の名前と競合する場合は、Alias キーワードを使用します。Use the Alias keyword if the name of the function you are calling is not a valid Visual Basic procedure name, or conflicts with the name of other items in your application. 呼び出す関数の名前を Alias で示します。Alias indicates the true name of the function being called.

引数とデータ型の宣言Argument and Data Type Declarations

引数とそのデータ型を宣言します。Declare the arguments and their data types. Windows で使用されるデータ型は Visual Studio のデータ型に対応していないため、この部分は難しくなる可能性があります。This part can be challenging because the data types that Windows uses do not correspond to Visual Studio data types. Visual Basic では、引数を互換性のあるデータ型に変換すること ("マーシャリング" と呼ばれるプロセス) によって、さまざまな処理が自動的に行われます。Visual Basic does a lot of the work for you by converting arguments to compatible data types, a process called marshaling. System.Runtime.InteropServices 名前空間に定義されている MarshalAsAttribute 属性を使用して、引数のマーシャリング方法を明示的に制御できます。You can explicitly control how arguments are marshaled by using the MarshalAsAttribute attribute defined in the System.Runtime.InteropServices namespace.

注意

以前のバージョンの Visual Basic では、パラメーターを As Any と宣言することができました。これは、任意のデータ型のデータを使用できることを意味します。Previous versions of Visual Basic allowed you to declare parameters As Any, meaning that data of any data type could be used. Visual Basic では、すべての Declare ステートメントで特定のデータ型を使用する必要があります。Visual Basic requires that you use a specific data type for all Declare statements.

Windows API の定数Windows API Constants

定数を組み合わせた引数もあります。Some arguments are combinations of constants. たとえば、このチュートリアルに示されている MessageBox API では、メッセージ ボックスの表示方法を制御する Typ という整数の引数を使用できます。For example, the MessageBox API shown in this walkthrough accepts an integer argument called Typ that controls how the message box is displayed. これらの定数の数値を確認するには、WinUser.h ファイルの #define ステートメントを調べます。You can determine the numeric value of these constants by examining the #define statements in the file WinUser.h. 通常、数値は 16 進数で表示されるので、加算や 10 進数への変換には電卓を使用した方がよいかもしれません。The numeric values are generally shown in hexadecimal, so you may want to use a calculator to add them and convert to decimal. たとえば、感嘆符のスタイルを示す定数 MB_ICONEXCLAMATION 0x00000030 と、[はい] と [いいえ] のスタイルを示す定数 MB_YESNO 0x00000004 を組み合わせる場合は、これらの数値を加算して 0x00000034 または 10 進数の 52 という結果を得ることができます。For example, if you want to combine the constants for the exclamation style MB_ICONEXCLAMATION 0x00000030 and the Yes/No style MB_YESNO 0x00000004, you can add the numbers and get a result of 0x00000034, or 52 decimal. 10 進数の結果を直接使用することもできますが、これらの値をアプリケーションで定数として宣言し、Or 演算子を使用して組み合わせることをお勧めします。Although you can use the decimal result directly, it is better to declare these values as constants in your application and combine them using the Or operator.

Windows API 呼び出しの定数を宣言するにはTo declare constants for Windows API calls
  1. 呼び出す Windows 関数のドキュメントを参照してください。Consult the documentation for the Windows function you are calling. 使用する定数の名前と、定数の数値が含まれている .h ファイルの名前を確認します。Determine the name of the constants it uses and the name of the .h file that contains the numeric values for these constants.

  2. メモ帳などのテキスト エディターを使用してヘッダー (.h) ファイルの内容を表示し、使用する定数に関連付けられている値を見つけます。Use a text editor, such as Notepad, to view the contents of the header (.h) file, and find the values associated with the constants you are using. たとえば、MessageBox API では、定数 MB_ICONQUESTION を使用して、メッセージ ボックスに疑問符を表示します。For example, the MessageBox API uses the constant MB_ICONQUESTION to show a question mark in the message box. MB_ICONQUESTION の定義は WinUser.h にあり、次のように表示されます。The definition for MB_ICONQUESTION is in WinUser.h and appears as follows:

    #define MB_ICONQUESTION 0x00000020L

  3. クラスまたはモジュールに同等の Const ステートメントを追加して、これらの定数をアプリケーションで使用できるようにします。Add equivalent Const statements to your class or module to make these constants available to your application. 次に例を示します。For example:

    Const MB_ICONQUESTION As Integer = &H20
    Const MB_YESNO As Integer = &H4
    Const IDYES As Integer = 6
    Const IDNO As Integer = 7
    
DLL プロシージャを呼び出すにはTo call the DLL procedure
  1. Button1 という名前のボタンをプロジェクトのスタートアップ フォームに追加し、それをダブルクリックしてコードを表示します。Add a button named Button1 to the startup form for your project, and then double-click it to view its code. そのボタンに対応するイベント ハンドラーが表示されます。The event handler for the button is displayed.

  2. 追加したボタンの Click イベント ハンドラーにコードを追加して、プロシージャを呼び出し、適切な引数を指定します。Add code to the Click event handler for the button you added, to call the procedure and provide the appropriate arguments:

    Private Sub Button1_Click(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles Button1.Click
    
        ' Stores the return value.
        Dim RetVal As Integer
        RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox",
            MB_ICONQUESTION Or MB_YESNO)
    
        ' Check the return value.
        If RetVal = IDYES Then
            MsgBox("You chose Yes")
        Else
            MsgBox("You chose No")
        End If
    End Sub
    
  3. F5 キーを押して、プロジェクトを実行します。Run the project by pressing F5. メッセージ ボックスに YesNo の両方の応答ボタンが表示されます。The message box is displayed with both Yes and No response buttons. どちらかをクリックします。Click either one.

データ マーシャリングData Marshaling

Visual Basic では、パラメーターと戻り値のデータ型が Windows API 呼び出し用に自動的に変換されますが、MarshalAs 属性を使用すると、API で想定されるアンマネージド データ型を明示的に指定できます。Visual Basic automatically converts the data types of parameters and return values for Windows API calls, but you can use the MarshalAs attribute to explicitly specify unmanaged data types that an API expects. 相互運用マーシャリングの詳細については、「相互運用マーシャリング」を参照してください。For more information about interop marshaling, see Interop Marshaling.

API 呼び出しで Declare と MarshalAs を使用するにはTo use Declare and MarshalAs in an API call
  1. 呼び出す関数の名前と引数、データ型、戻り値を特定します。Determine the name of the function you want to call, plus its arguments, data types, and return value.

  2. MarshalAs 属性へのアクセスを簡単にするために、次の例に示すように、クラスまたはモジュールのコードの先頭に Imports ステートメントを追加します。To simplify access to the MarshalAs attribute, add an Imports statement to the top of the code for the class or module, as in the following example:

    Imports System.Runtime.InteropServices
    
  3. 使用するクラスまたはモジュールに、インポートされる関数の関数プロトタイプを追加し、MarshalAs 属性をパラメーターまたは戻り値に適用します。Add a function prototype for the imported function to the class or module you are using, and apply the MarshalAs attribute to the parameters or return value. 次の例では、型 void* が想定される API 呼び出しを AsAny としてマーシャリングしています。In the following example, an API call that expects the type void* is marshaled as AsAny:

    Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" (
        ByVal x As Short,
        <MarshalAsAttribute(UnmanagedType.AsAny)>
            ByVal o As Object)
    

DllImport を使用した API 呼び出しAPI Calls Using DllImport

DllImport 属性により、タイプ ライブラリを使用せずに DLL 内の関数を呼び出す第 2 の方法が提供されます。The DllImport attribute provides a second way to call functions in DLLs without type libraries. DllImportDeclare ステートメントを使用するのとほぼ同等ですが、関数の呼び出し方法をより詳細に制御できます。DllImport is roughly equivalent to using a Declare statement but provides more control over how functions are called.

DllImport は、ほとんどの Windows API 呼び出しで使用できます。ただし、その呼び出しで共有 ("静的" とも呼ばれる) メソッドを参照している場合に限ります。You can use DllImport with most Windows API calls as long as the call refers to a shared (sometimes called static) method. クラスのインスタンスを必要とするメソッドは使用できません。You cannot use methods that require an instance of a class. Declare ステートメントとは異なり、DllImport 呼び出しでは MarshalAs 属性を使用できません。Unlike Declare statements, DllImport calls cannot use the MarshalAs attribute.

DllImport 属性を使用して Windows API を呼び出すにはTo call a Windows API using the DllImport attribute

  1. [ファイル] メニューの [新規作成] をクリックし、次に [プロジェクト] をクリックして、新しい Windows アプリケーション プロジェクトを開きます。Open a new Windows Application project by clicking New on the File menu, and then clicking Project. [新しいプロジェクト] ダイアログ ボックスが表示されます。The New Project dialog box appears.

  2. Visual Basic プロジェクト テンプレートの一覧から [Windows アプリケーション] を選択します。Select Windows Application from the list of Visual Basic project templates. 新しいプロジェクトが表示されます。The new project is displayed.

  3. Button2 という名前のボタンをスタートアップ フォームに追加します。Add a button named Button2 to the startup form.

  4. Button2 をダブルクリックして、フォームのコード ビューを開きます。Double-click Button2 to open the code view for the form.

  5. DllImport へのアクセスを簡単にするために、スタートアップ フォーム クラスのコードの先頭に Imports ステートメントを追加します。To simplify access to DllImport, add an Imports statement to the top of the code for the startup form class:

    Imports System.Runtime.InteropServices
    
  6. フォームの End Class ステートメントの前に空の関数を宣言し、その関数に MoveFile という名前を指定します。Declare an empty function preceding the End Class statement for the form, and name the function MoveFile.

  7. 関数宣言に Public および Shared 修飾子を適用し、Windows API 関数で使用される引数に基づいて MoveFile のパラメーターを設定します。Apply the Public and Shared modifiers to the function declaration and set parameters for MoveFile based on the arguments the Windows API function uses:

    Public Shared Function MoveFile(
        ByVal src As String,
        ByVal dst As String) As Boolean
        ' Leave the body of the function empty.
    End Function
    

    ご自身の関数には任意の有効なプロシージャ名を使用できます。DllImport 属性で、DLL 内の名前を指定します。Your function can have any valid procedure name; the DllImport attribute specifies the name in the DLL. また、それによってパラメーターと戻り値の相互運用マーシャリングも処理されるため、API で使用されているデータ型に似た Visual Studio データ型を選択できます。It also handles interoperability marshaling for the parameters and return values, so you can choose Visual Studio data types that are similar to the data types the API uses.

  8. 空のクラスに DllImport 属性を適用します。Apply the DllImport attribute to the empty function. 最初のパラメーターは、呼び出す関数を含む DLL の名前と場所です。The first parameter is the name and location of the DLL containing the function you are calling. Windows システム ディレクトリにあるファイルのパスを指定する必要はありません。You do not need to specify the path for files located in the Windows system directories. 2 番目のパラメーターは、Windows API 内の関数の名前を指定する名前付き引数です。The second parameter is a named argument that specifies the name of the function in the Windows API. この例では、DllImport 属性によって、MoveFile への呼び出しを KERNEL32.DLL 内の MoveFileW に強制的に転送しています。In this example, the DllImport attribute forces calls to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL. MoveFileW メソッドにより、src パスから dst パスにファイルをコピーします。The MoveFileW method copies a file from the path src to the path dst.

    <DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True,
        CharSet:=CharSet.Unicode, ExactSpelling:=True,
        CallingConvention:=CallingConvention.StdCall)>
    Public Shared Function MoveFile(
        ByVal src As String,
        ByVal dst As String) As Boolean
        ' Leave the body of the function empty.
    End Function
    
  9. 関数を呼び出すコードを Button2_Click イベント ハンドラーに追加します。Add code to the Button2_Click event handler to call the function:

    Private Sub Button2_Click(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles Button2.Click
    
        Dim RetVal As Boolean = MoveFile("c:\tmp\Test.txt", "c:\Test.txt")
        If RetVal = True Then
            MsgBox("The file was moved successfully.")
        Else
            MsgBox("The file could not be moved.")
        End If
    End Sub
    
  10. Test.txt という名前のファイルを作成し、ハード ドライブの C:\Tmp ディレクトリに配置します。Create a file named Test.txt and place it in the C:\Tmp directory on your hard drive. Tmp ディレクトリは、必要に応じて作成してください。Create the Tmp directory if necessary.

  11. F5 キーを押してアプリケーションを起動します。Press F5 to start the application. メイン フォームが表示されます。The main form appears.

  12. [Button2] をクリックします。Click Button2. ファイルを移動できた場合、"ファイルが正常に移動しました" というメッセージが表示されます。The message "The file was moved successfully" is displayed if the file can be moved.

関連項目See also