フォーラム: "Main";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];
ダウン
Dll s 似ている枝を探す
← →
HELP ME PLZ (2001-12-15 18:22) [0]はじめてDLLを使用してDLL-shkiから関数を呼び出す方法を教えてください
← →
Oleg Gashev (2001-12-15 18:35) [1]DLLの呼び出し
トピックグループ
DLLで定義されたルーチンを呼び出す前に、それらをインポートする必要があります。 これには、2つの方法があります。外部プロシージャまたは関数を宣言する方法、またはWindows APIを直接呼び出す方法です。 どちらの方法を使用しても、ルーチンは実行時までアプリケーションにリンクされません。 これは、プログラムをコンパイルするときにDLLが存在する必要がないことを意味します。 また、ルーチンをインポートする試みのコンパイル時検証がないことも意味します。
Object Pascalは、DLLからの変数のインポートをサポートしていません。
静的荷重
プロシージャまたは関数をインポートする最も簡単な方法は、外部ディレクティブを使用して宣言することです。 たとえば、
手順DoSomething; 外部「MYLIB.DLL」;
この宣言をプログラムに含めると、プログラムの起動時にMYLIB.DLLが一度読み込まれます。 プログラムの実行中、識別子DoSomethingは常に同じDLL内の同じエントリポイントを参照します。
インポートされたルーチンの宣言は、それらが呼び出されるプログラムまたはユニットに直接配置できます。 ただし、メンテナンスを簡素化するために、外部宣言を別の「インポートユニット」に収集できます。このインポートユニットには、DLLとのインターフェイスに必要な定数と型も含まれます。 (DelphiのWindowsユニットが良い例です。)インポートユニットを使用する他のモジュールは、その中で宣言されたルーチンを呼び出すことができます。
外部宣言の詳細については、外部宣言を参照してください。
Windows API呼び出しによる動的ロード。
← →
Oleg Gashev (2001-12-15 18:36) [2]-------------------------------------------------- ---------------
LoadLibrary
LoadLibrary関数は、指定された実行可能モジュールを呼び出しプロセスのアドレス空間にマップします。
HINSTANCE LoadLibrary(
LPCTSTR lpLibFileName //実行可能モジュールのファイル名のアドレス
);
パラメーター
lpLibFileName
実行可能モジュール(.DLLまたは.EXEファイルのいずれか)を指定するヌル終了ストリングを指します。 指定された名前はモジュールのファイル名であり、モジュール定義(.DEF)ファイルのLIBRARYキーワードで指定されているライブラリモジュール自体に保存されている名前とは関係ありません。
文字列がパスを指定しているが、指定されたディレクトリにファイルが存在しない場合、関数は失敗します。
パスが指定されておらず、ファイル拡張子が省略されている場合、デフォルトのライブラリ拡張子.DLLが追加されます。 ただし、ファイル名の文字列には末尾の文字(。)を含めることができます。これは、モジュール名に拡張子がないことを示すためです。 パスが指定されていない場合、関数は次の順序でファイルを検索します。
1。 アプリケーションのロード元のディレクトリ。
2。 現在のディレクトリ。
3。 Windows 95:Windowsシステムディレクトリ。 GetSystemDirectory関数を使用して、このディレクトリのパスを取得します。
Windows NT:32ビットのWindowsシステムディレクトリ。 GetSystemDirectory関数を使用して、このディレクトリのパスを取得します。 このディレクトリの名前はSYSTEM32です。
4。 Windows NT:16ビットのWindowsシステムディレクトリ。 このディレクトリのパスを取得するWin32関数はありませんが、検索されます。 このディレクトリの名前はSYSTEMです。
5。 Windowsディレクトリ。 GetWindowsDirectory関数を使用して、このディレクトリのパスを取得します。
6。 PATH環境変数にリストされているディレクトリ。
最初に検索されるディレクトリは、呼び出しプロセスの作成に使用されるイメージファイルを含む1つのディレクトリです(詳細については、CreateProcess関数を参照してください)。 これにより、プロセスのインストール済みディレクトリをPATH環境変数に追加することなく、プロセスに関連付けられたプライベートダイナミックリンクライブラリ(DLL)ファイルを見つけることができます。
関数がライブラリモジュールファイルへの完全修飾パスを取得すると、呼び出しプロセスに現在ロードされているライブラリモジュールの完全パスと(独立して)パスが比較されます。 これらのライブラリには、プロセスの起動時にロードされたライブラリと、以前にLoadLibraryによってロードされたものの、FreeLibraryによってアンロードされていないものが含まれます。 パスが既にロードされているモジュールのパスと一致する場合、関数はモジュールの参照カウントをインクリメントし、そのライブラリのモジュールハンドルを返します。
戻り値
関数が成功した場合、戻り値はモジュールへのハンドルです。
関数が失敗した場合、戻り値はNULLです。 拡張エラー情報を取得するには、GetLastErrorを呼び出します。
備考
LoadLibraryを使用してDLLモジュールをマップし、GetProcAddressで使用してDLL関数のアドレスを取得できるハンドルを返すことができます。 LoadLibraryは、他の実行可能モジュールをマップするためにも使用できます。 たとえば、関数は.EXEファイルを指定して、FindResourceまたはLoadResourceで使用できるハンドルを取得できます。
モジュールハンドルは、グローバルまたは継承可能ではありません。 1つのプロセスによるLoadLibraryの呼び出しは、別のプロセスが使用できるハンドルを生成しません
ページ: 1 全枝
フォーラム: "Main";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];
メモリ:0.57 MB
時間:0.026 c