DLL について

文書翻訳 文書翻訳
文書番号: 815065 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

この資料では、ダイナミック リンク ライブラリ (DLL) の概要と、DLL を使用するときに発生する可能性があるさまざまな問題について説明します。

また、独自の DLL を開発する際に考慮すべき高度な問題についても説明します。 DLL の概要としては、ダイナミック リンクの手法、DLL の依存関係、DLL エントリ ポイント、DLL 関数のエクスポート、DLL のトラブルシューティング ツールについて説明します。

この資料の最後では、DLL と Microsoft .NET Framework アセンブリとのハイレベルな比較を行います。

はじめに

この資料の対象製品として記載されている Microsoft Windows オペレーティング システムでは、その機能の多くがダイナミック リンク ライブラリ (DLL) によって提供されます。 また、これらの Windows オペレーティング システムの 1 つでプログラムを実行する際に、プログラムの機能の多くが DLL によって提供される場合があります。 たとえば、プログラムにさまざまなモジュールが多数含まれており、それらの各モジュールが DLL に含まれて配布されている場合があります。

DLL を使用することで、コードのモジュール化、コードの再利用、メモリ使用の効率化、ディスク領域の削減が促進されます。 これにより、オペレーティング システムおよびプログラムの読み込みや実行が速くなり、コンピュータ内で占めるディスク領域が小さくなります。

プログラムで DLL を使用している場合、依存関係と呼ばれる問題によってプログラムが実行されないことがあります。 プログラムで DLL が使用されると、依存関係が作成されます。 他のプログラムによってこの依存関係が上書きされ、破損すると、元のプログラムが正常に実行されない場合があります。

Microsoft .NET Framework の導入に伴い、アセンブリの使用によって、依存関係に関するほとんどの問題が解決されています。

詳細

DLL について

DLL は、同時に複数のプログラムで使用できるコードおよびデータを含むライブラリです。 たとえば、Windows オペレーティング システムでは、Comdlg32 DLL によって一般的なダイアログ ボックスに関連する機能が実行されます。 各プログラムは、この DLL に含まれる機能を使用して [ファイルを開く] ダイアログ ボックスを実装できます。 これによってコードの再利用が促進され、メモリを効率的に使用できます。

DLL を使用することで、プログラムを別々のコンポーネントにモジュール化できます。 たとえば、会計プログラムはモジュールごとに販売される場合があります。 各モジュールは、インストールされていれば、実行時にメイン プログラムに読み込むことができます。 モジュールが個々に分かれているため、プログラムの読み込み速度が速くなり、機能が要求された場合にのみ該当するモジュールが読み込まれます。

また、プログラムの他の部分に影響を及ぼさずに、各モジュールに更新プログラムを適用することが容易になります。 たとえば、給与支払プログラムを使用しており、税率が毎年変更されるとします。 これらの変更が DLL に限定されるものであれば、プログラム全体のビルドやインストールを再度行うことなく、更新プログラムを適用できます。

以下に、Windows オペレーティング システムに DLL として実装されているファイルの例を挙げます。
  • ActiveX コントロール (.ocx) ファイル
    ActiveX コントロールには、予定表から日付を選択するための予定表コントロールなどがあります。
  • コントロール パネル (.cpl) ファイル
    .cpl ファイルには、コントロール パネルに配置されるアイテムなどがあります。 各アイテムは、特殊な DLL です。
  • デバイス ドライバ (.drv) ファイル
    デバイス ドライバには、プリンタでの印刷を制御するプリンタ ドライバなどがあります。

DLL のメリット

ここでは、プログラムで DLL を使用した場合のメリットについて説明します。
  • 使用するリソースが少ない
    複数のプログラムで同じ関数ライブラリを使用している場合、DLL はディスクおよび物理メモリに読み込まれるコードの重複を削減できます。 これにより、フォアグラウンドで実行されているプログラムだけでなく、Windows オペレーティング システムで実行されている他のプログラムについても、パフォーマンスが大幅に改善される場合があります。
  • モジュラー アーキテクチャが促進される
    DLL を使用することで、モジュラー プログラムの開発が促進されます。 これにより、複数の言語バージョンを必要とする大きなプログラム、またはモジュラー アーキテクチャを必要とするプログラムの開発が容易になります。 モジュラー プログラムの例として、実行時に多数のモジュールが動的に読み込まれる可能性がある会計プログラムが挙げられます。
  • 配置およびインストールが容易になる
    DLL 内の関数の更新または修正が必要になった場合、DLL の配置およびインストールの際にプログラムを DLL に再リンクする必要がありません。 また、複数のプログラムで同じ DLL を使用している場合は、複数のプログラムがすべて更新または修正されます。 定期的に更新または修正されるサードパーティの DLL を使用している場合、このメリットを受ける頻度が高くなるといえます。

DLL の依存関係

プログラムまたは DLL で、他の DLL 内の DLL 関数を使用している場合、依存関係が作成されます。 これによってプログラムは独立ではなくなり、依存関係が壊れた場合に問題が発生することがあります。 たとえば、以下のいずれかの状況によって、プログラムを実行できなくなることがあります。
  • 依存する DLL が新しいバージョンにアップグレードされた。
  • 依存する DLL が修正された。
  • 依存する DLL が以前のバージョンによって上書きされた。
  • 依存する DLL がコンピュータから削除された。
これらの状況は、一般に DLL の競合と呼ばれています。 下位互換性が強制適用されていない場合、プログラムが正常に実行されないことがあります。

依存関係の問題を最小限に抑えるために、Microsoft Windows 2000 およびそれ以降の Windows オペレーティング システムでは、以下の変更が導入されています。
  • Windows ファイル保護 (WFP)
    Windows ファイル保護では、権限のないエージェントがシステムの DLL を更新または削除することをオペレーティング システムで防ぎます。 そのため、プログラムのインストールが、システム DLL として定義されている DLL を削除または更新しようとすると、Windows ファイル保護機能は有効なデジタル署名があるかどうかを確認します。
  • プライベート DLL
    プライベート DLL を使用すると、共有 DLL に対して行われた変更による影響をプログラムが受けないようにできます。 プライベート DLL は、バージョン固有の情報または空の .local ファイルを使用して、プログラムで使用される DLL のバージョンを適用します。 プライベート DLL を使用するには、プログラムのルート フォルダで DLL を探します。 次に、新しいプログラム用に、バージョン固有の情報を DLL に追加します。 古いプログラムには、空の .local ファイルを使用します。 各メソッドは、プログラムのルート フォルダにあるプライベート DLL を使用するようにオペレーティング システムに通知します。

DLL のトラブルシューティング ツール

DLL に関する問題のトラブルシューティングのために、いくつかのツールが用意されています。 ここでは、そのうちの一部のツールを紹介します。

Dependency Walker

Dependency Walker ツールは、プログラムで使用されているすべての依存 DLL を再帰的にスキャンします。 Dependency Walker でプログラムを開くと、Dependency Walker は次のようなチェックを行います。
  • 欠落している DLL をチェックする。
  • 有効でないプログラム ファイルまたは DLL をチェックする。
  • インポート関数とエクスポート関数が一致するかどうかをチェックする。
  • 循環依存エラーをチェックする。
  • 他のオペレーティング システム向けであるために有効でないモジュールをチェックする。
Dependency Walker を使用することで、プログラムが使用しているすべての DLL を文書化できます。 これは、将来発生する可能性のある DLL の問題の防止や解決に役立つことがあります。 Dependency Walker は、Microsoft Visual Studio 6.0 のインストール時に、次のディレクトリに配置されます。
drive\Program Files\Microsoft Visual Studio\Common\Tools

DLL Universal Problem Solver

DLL Universal Problem Solver (DUPS) ツールは、DLL 情報の監査、比較、文書化、および表示に使用されます。 DUPS ツールは、以下のユーティリティで構成されています。
  • Dlister.exe
    コンピュータのすべての DLL を列挙し、テキスト ファイルまたはデータベース ファイルに情報を記録します。
  • Dcomp.exe
    2 つのテキスト ファイルに列挙された DLL を比較し、その相違点を格納した 3 つめのテキスト ファイルを作成します。
  • Dtxt2DB.exe
    Dlister.exe ユーティリティおよび Dcomp.exe ユーティリティを使用して作成されたテキスト ファイルを dllHell データベースに読み込みます。
  • DlgDtxt2DB.exe
    Dtxt2DB.exe ユーティリティのグラフィカル ユーザー インターフェイス (GUI) バージョンを提供します。
DUPS ツールの関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
247957 [SAMPLE] DUPS.exe を使用して DLL の互換性に関する問題を解決する方法

DLL Help データベース

DLL Help データベースは、Microsoft ソフトウェア製品によってインストールされた特定のバージョンの DLL を見つけるのに役立ちます。 DLL Help データベースの詳細については、次のマイクロソフト Web サイトを参照してください。
http://support.microsoft.com/dllhelp/

DLL の開発

ここでは、独自の DLL を開発する際に考慮すべき問題と要件について説明します。

DLL の種類

アプリケーションに DLL を読み込むと、2 つのリンク手法によって、エクスポートされた DLL 関数を呼び出すことができます。 この 2 つの手法とは、ロード時のダイナミック リンクおよび実行時のダイナミック リンクです。
ロード時のダイナミック リンク
ロード時のダイナミック リンクでは、アプリケーションは、ローカル関数に似た、エクスポートされた DLL 関数に対して、明示的な呼び出しを行います。 ロード時のダイナミック リンクを使用するには、アプリケーションをコンパイルおよびリンクする際に、ヘッダー (.h) ファイルおよびインポート ライブラリ (.lib) ファイルを提供します。 このとき、リンカは DLL の読み込みに必要な情報をシステムに提供し、読み込み時にエクスポートされた DLL 関数の場所を解決します。
実行時のダイナミック リンク
実行時のダイナミック リンクでは、アプリケーションは LoadLibrary 関数または LoadLibraryEx 関数を呼び出して、実行時に DLL を読み込みます。 DLL が正常に読み込まれると、GetProcAddress 関数を使用して、呼び出そうとしているエクスポートされた DLL 関数のアドレスを取得します。 実行時のダイナミック リンクを使用する場合は、インポート ライブラリ ファイルを必要としません。

ロード時のダイナミック リンクを使用する場合、および実行時のダイナミック リンクを使用する場合のアプリケーションの要件は、以下の通りです。
  • スタートアップのパフォーマンス
    アプリケーションの最初のスタートアップ パフォーマンスが重要な場合は、実行時のダイナミック リンクを使用する必要があります。
  • 使いやすさ
    ロード時のダイナミック リンクでは、エクスポートされた DLL 関数はローカル関数に似ています。 そのため、これらの関数の呼び出しが簡単になります。
  • アプリケーション ロジック
    実行時のダイナミック リンクでは、必要に応じてアプリケーションを分岐して、別々のモジュールを読み込むことができます。 これは、複数言語のバージョンを開発するときに重要です。

DLL のエントリ ポイント

DLL を作成する際に、オプションでエントリ ポイント関数を指定できます。 エントリ ポイント関数は、プロセスまたはスレッドが DLL にアタッチまたはデタッチされるときに呼び出されます。 エントリ ポイント関数を使用して、DLL で必要な場合にデータ構造を初期化したり破棄したりできます。 また、アプリケーションがマルチスレッドの場合、スレッド ローカル記憶域 (TLS) を使用して、エントリ ポイント関数内の各スレッドにプライベートなメモリを割り当てることができます。 以下に、DLL エントリ ポイント関数のコード例を示します。
BOOL APIENTRY DllMain(
HANDLE hModule,	// Handle to DLL module
	DWORD ul_reason_for_call,	// Reason for calling function
	LPVOID lpReserved ) // Reserved
{
	switch ( ul_reason_for_call )
	{
		case DLL_PROCESS_ATTACHED:
		// A process is loading the DLL.
		break;
		case DLL_THREAD_ATTACHED:
		// A process is creating a new thread.
		break;
		case DLL_THREAD_DETACH:
		// A thread exits normally.
		break;
		case DLL_PROCESS_DETACH:
		// A process unloads the DLL.
		break;
	}
	return TRUE;
}
エントリ ポイント関数が FALSE 値を返したとき、ロード時のダイナミック リンクを使用している場合は、アプリケーションは起動しません。 実行時のダイナミック リンクを使用している場合は、個々の DLL のみが読み込まれません。

エントリ ポイント関数は、単純な初期化タスクの実行のみとし、他の DLL の読み込み関数や終了関数を呼び出さないでください。 たとえば、エントリ ポイント関数では、LoadLibrary 関数または LoadLibraryEx 関数を直接的または間接的に呼び出すことは避けてください。 また、プロセスの終了時に FreeLibrary 関数を呼び出さないでください。

: マルチスレッド アプリケーションでは、データの破損を防ぐため、DLL グローバル データへのアクセスが同期化される (スレッド セーフである) ようにしてください。 これを行うには、TLS を使用して、各スレッドに一意のデータを提供します。

DLL 関数のエクスポート

DLL 関数をエクスポートするには、エクスポートされる DLL 関数に関数キーワードを追加するか、またはエクスポートされる DLL 関数を記載したモジュール定義 (.def) ファイルを作成することができます。

関数キーワードを使用するには、エクスポートする各関数を次のキーワードで宣言する必要があります。
__declspec(dllexport)
エクスポートされた DLL 関数をアプリケーションで使用するには、インポートする各関数を次のキーワードで宣言する必要があります。
__declspec(dllimport)
通常、define ステートメントおよび ifdef ステートメントを持つ 1 つのヘッダー ファイルを使用して、エクスポート ステートメントとインポート ステートメントを区別します。

モジュール定義ファイルを使用して、エクスポートされる DLL 関数を宣言することもできます。 モジュール定義ファイルを使用する場合は、エクスポートされる DLL 関数に関数キーワードを追加する必要はありません。 モジュール定義ファイルでは、DLL の LIBRARY ステートメントおよび EXPORTS ステートメントを宣言します。 以下に、定義ファイルのコード例を示します。
// SampleDLL.def
//
LIBRARY "sampleDLL"
EXPORTS
  HelloWorld

サンプル DLL およびアプリケーション

Microsoft Visual C++ 6.0 では、[Win32 Dynamic-Link Library] プロジェクト タイプまたは [MFC AppWizard (dll)] プロジェクト タイプを選択することで、DLL を作成できます。

次のコードは、Visual C++ で [Win32 Dynamic-Link Library] プロジェクト タイプを使用して作成された DLL の例です。
// SampleDLL.cpp
//
#include "stdafx.h"
#define EXPORTING_DLL
#include "sampleDLL.h"
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}
void HelloWorld()
{
	MessageBox( NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK);
}
// File: SampleDLL.h
//
#ifndef INDLL_H
#define INDLL_H
#ifdef EXPORTING_DLL
extern __declspec(dllexport) void HelloWorld() ;
#else
extern __declspec(dllimport) void HelloWorld() ;
#endif
#endif
次のコードは、SampleDLL DLL 内のエクスポートされた DLL 関数を呼び出す [Win32 Application] プロジェクトの例です。
// SampleApp.cpp 
//
#include "stdafx.h"
#include "sampleDLL.h"
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{ 	
	HelloWorld();
	return 0;
}
: ロード時のダイナミック リンクでは、SampleDLL プロジェクトをビルドするときに作成される SampleDLL.lib インポート ライブラリをリンクする必要があります。

実行時のダイナミック リンクでは、次のようなコードを使用して、SampleDLL.dll というエクスポートされた DLL 関数を呼び出します。
...
typedef VOID (*DLLPROC) (LPTSTR);
...
HINSTANCE hinstDLL;
DLLPROC HelloWorld;
BOOL fFreeDLL;
hinstDLL = LoadLibrary("sampleDLL.dll");
if (hinstDLL != NULL)
{
    HelloWorld = (DLLPROC) GetProcAddress(hinstDLL, "HelloWorld");
    if (HelloWorld != NULL)
        (HelloWorld);
    fFreeDLL = FreeLibrary(hinstDLL);
}
...
SampleDLL アプリケーションをコンパイルしてリンクする際、Windows オペレーティング システムは、以下の場所で SampleDLL DLL を検索します。検索はここに記載された順に行われます。
  1. アプリケーション フォルダ
  2. 現在のフォルダ
  3. Windows システム フォルダ

    : GetSystemDirectory 関数は、Windows システム フォルダのパスを返します。
  4. Windows フォルダ

    : GetWindowsDirectory 関数は、Windows フォルダのパスを返します。

.NET Framework アセンブリ

Microsoft .NET および .NET Framework の導入に伴い、アセンブリの使用によって、DLL に関するほとんどの問題が解決されています。 アセンブリは、.NET の共通言語ランタイム (CLR) の制御下で実行される機能の論理的な単位です。 物理的には、アセンブリは .dll または .exe ファイルとして存在します。 しかし、内部的には、アセンブリは Microsoft Win32 DLL とは大きく異なります。

アセンブリ ファイルには、アセンブリ マニフェスト、タイプ メタデータ、Microsoft Intermediate Language (MSIL) コード、およびその他のリソースが含まれています。 アセンブリ マニフェストには、アセンブリが自己記述的であるために必要なすべての情報を提供するアセンブリ メタデータが含まれています。 アセンブリ マニフェストには、以下の情報が含まれています。
  • アセンブリ名
  • バージョン情報
  • カルチャ情報
  • 厳密な名前の情報
  • ファイルのアセンブリ一覧
  • 型参照の情報
  • 参照および依存アセンブリの情報
アセンブリに含まれている MSIL コードは、直接実行できません。 MSIL コードの実行は CLR によって管理されています。 デフォルトでは、アセンブリの作成時には、アセンブリはアプリケーションに対してプライベートです。 共有アセンブリを作成するには、アセンブリに厳密な名前を割り当て、そのアセンブリをグローバル アセンブリ キャッシュに公開する必要があります。

ここでは、アセンブリの機能をいくつか挙げ、Win32 DLL の機能と比較して説明します。
  • 自己記述的
    アセンブリを作成すると、CLR がアセンブリを実行するために必要なすべての情報がアセンブリ マニフェストに含まれます。 アセンブリ マニフェストには、依存アセンブリの一覧が含まれます。 そのため、CLR は、アプリケーションで使用される一貫したアセンブリのセットを維持することができます。 Win32 DLL では、共有 DLL を使用するときにアプリケーションで使用される DLL のセットとの一貫性を維持できません。
  • バージョン管理
    アセンブリ マニフェストでは、CLR によってバージョン情報が記録および適用されます。 また、バージョン ポリシーによってバージョン固有の使用方法が適用されます。 Win32 DLL では、バージョン管理をオペレーティング システムによって強制適用することはできません。 代わりに、DLL の下位互換性を保証する必要があります。
  • Side-by-Side 配置
    アセンブリでは、Side-by-Side 配置がサポートされています。 アプリケーションごとに、同じアセンブリの異なるバージョンを使用できます。 TQ で確認して修正しました。">Windows 2000 以降では、アプリケーション フォルダ内に DLL を配置することで、Side-by-Side 配置をサポートしています。 また、Windows ファイル保護により、権限のないエージェントがシステムの DLL を上書きまたは置き換えることを防ぎます。
  • 自己完結と分離
    アセンブリを使用して開発されたアプリケーションは、自己完結的で、コンピュータで実行されている他のアプリケーションとは分離できます。 この機能により、ゼロインパクトのインストールを作成できます。
  • 実行
    アセンブリは、アセンブリ マニフェストで提供され、CLR によって制御されるセキュリティ許可の下で実行されます。
  • 言語に依存しない
    アセンブリは、サポートされている .NET 言語のいずれかを使用して開発できます。 たとえば、Microsoft Visual C# でアセンブリを開発し、Microsoft Visual Basic .NET プロジェクトでアセンブリを使用できます。

関連情報

DLL および .NET Framework アセンブリの詳細については、次のマイクロソフト Web サイトを参照してください。
DLL Help データベース
http://support.microsoft.com/dllhelp

DLL Hell の終焉
http://msdn.microsoft.com/ja-jp/library/ms811694.aspx

アプリケーションで共有する Side-by-Side コンポーネントの実装 (拡張)
http://msdn.microsoft.com/ja-jp/library/ms811700.aspx

Windows XP で分離アプリケーションと Side-by-Side アセンブリをビルドし、サービスを提供する方法
http://msdn.microsoft.com/ja-jp/library/ms997620.aspx

.NET Framework による導入の単純化と DLL Hell の解消
http://msdn.microsoft.com/ja-jp/library/ms973843.aspx/

.NET Framework 開発者ガイド : 共通言語ランタイムのアセンブリ
http://msdn.microsoft.com/ja-jp/library/hk5f40ct.aspx

実行時のダイナミック リンク
http://msdn.microsoft.com/ja-jp/library/ms685090.aspx

スレッド ローカル ストレージ
http://msdn.microsoft.com/ja-jp/library/ms686749.aspx

プロパティ

文書番号: 815065 - 最終更新日: 2009年5月29日 - リビジョン: 5.9
この資料は以下の製品について記述したものです。
  • Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
  • Microsoft Windows Server 2003, Datacenter Edition for Itanium-Based Systems
  • Microsoft Windows Server 2003, Datacenter x64 Edition
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Enterprise Edition for Itanium-based Systems
  • Microsoft Windows Server 2003, Enterprise x64 Edition
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows Server 2003, Standard x64 Edition
  • Microsoft Windows Server 2003, Web Edition
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Datacenter Server
  • Microsoft Windows 2000 Server
  • Microsoft Windows XP Professional
  • Microsoft Windows XP Home Edition
  • Microsoft Windows XP Media Center Edition
  • Microsoft Windows XP Tablet PC Edition
  • Microsoft Windows 2000 Professional
  • Microsoft Windows NT 4.0
  • Microsoft Windows NT Workstation 4.0 Developer Edition
  • Microsoft Windows NT Workstation 3.51
  • Microsoft Windows 98 Second Edition
  • Microsoft Visual Studio .NET 2003 Professional Edition
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
  • Microsoft Visual Studio .NET 2003 Academic Edition
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual Studio .NET 2002 Enterprise Architect
  • Microsoft Visual Studio .NET 2002 Enterprise Developer
  • Microsoft Visual Studio .NET 2002 Academic Edition
  • Microsoft Visual Studio 6.0 Professional Edition
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft Visual Studio 2005 Express Edition
  • Microsoft Visual Studio 2005 Professional Edition
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Office XP Professional
  • Microsoft Office XP Small Business Edition
  • Microsoft Office XP Standard
  • Microsoft Office Home Edition 2003
  • Microsoft Office Professional Edition 2003
  • Microsoft Office Small Business Edition 2003
  • Microsoft Office Standard Edition 2003
キーワード:?
kbxplatform kbtshoot kbdebug kbdll kbinfo KB815065
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com