チュートリアル: 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 との相互運用性と、プラットフォーム呼び出しまたは PInvoke を使用して .NET Framework が実行されます。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. 可能な限り、.NET Framework のマネージコードを使用して、Windows API 呼び出しの代わりにタスクを実行する必要があります。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 を使用する定数の詳細については、Windows.h、Platform SDK に含まれているなどのヘッダー ファイルを調べてください。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. これらの定数の数値を確認するには、ファイルの #define ステートメントを調べます。You can determine the numeric value of these constants by examining the #define statements in the file WinUser.h. 通常、数値は16進数で表示されるので、電卓を使用して追加したり、decimal に変換したりすることができます。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、Yes/No style MB_YESNO 0x00000004 の定数を結合する場合は、数値を加算して、0x00000030 または 52 decimal の結果を取得できます。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. メッセージボックスには、 [はい] と [ いいえ] の両方のボタンが表示されます。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.

呼び出しが共有 (場合によっては静的) メソッドを参照している限り、ほとんどの Windows API 呼び出しで DllImport を使用できます。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. PublicShared 修飾子を関数宣言に適用し、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 に強制的に転送されます。DLL.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