VC++ダイナミックリンクライブラリ(DLL)プログラミング深入浅出(一)Win 32 Static Library


http://www.pconline.com.cn/pcedu/empolder/gj/vc/index.html
 
 
1.概論まずDLL(Dynamic Linkable Library)の概念を述べて、あなたは簡単にDLLを倉庫と見なすことができて、それはあなたに直接使うことができる変数、関数あるいはクラスを提供します.倉庫の発展史において「ライブラリレス-静的リンクライブラリ-動的リンクライブラリ」の時代を経験した.
静的リンクライブラリと動的リンクライブラリはコードを共有する方法であり、静的リンクライブラリを使用すると、libのコマンドは、希望するかどうかにかかわらず、最終的に生成されたEXEファイルに直接含まれます.しかし、DLLを使用する場合、このDLLは最終EXEファイルに含まれる必要はなく、EXEファイルの実行時にEXEとは独立したDLLファイルを「動的」に参照およびアンインストールすることができる.静的リンク・ライブラリと動的リンク・ライブラリの別の違いは、静的リンク・ライブラリに他の動的リンク・ライブラリまたは静的ライブラリを含めることはできませんが、動的リンク・ライブラリに他の動的または静的リンク・ライブラリを含めることもできます.動的リンクライブラリについては,(1)DLLの作成は具体的なプログラミング言語やコンパイラとは関係なく,約束されたDLLインタフェース仕様や呼び出し方式に従えば,様々な言語で作成されたDLLが互いに呼び出されるという概念を確立する必要がある.例えばWindowsが提供するシステムDLL(WindowsのAPIを含む)は、Visual Basic、Visual C++またはDelphiであるかを問わず、どの開発環境でも呼び出されます.(2)ダイナミックリンクライブラリはWindowsディレクトリの下にあるシステム32フォルダにkernel 32が随所に見られる.dll、user32.dllとgdi 32.dll、windowsのほとんどのAPIはこれらのDLLに含まれています.kernel32.dllの関数は主にメモリ管理とプロセススケジューリングを処理します.user32.dllの関数は主にユーザーインタフェースを制御する.gdi32.dllの関数はグラフィックの操作を担当します.一般的なプログラマーはMessageBoxのような関数を使ったことがあるが、実際にはuser 32に含まれている.dllというダイナミックリンクライブラリにあります.DLLは私たちにとってよく知られていないことがわかります.(3)VCダイナミックリンクライブラリの分類Visual C++は、Non-MFC DLL(非MFCダイナミックライブラリ)、MFC Regular DLL(MFCルールDLL)、MFC Extension DLL(MFC拡張DLL)の3種類のDLLをサポートする.非MFCダイナミックライブラリはMFCクラスライブラリ構造を採用せず、その導出関数は標準的なCインタフェースであり、非MFCまたはMFCで作成されたアプリケーションに呼び出されることができる.MFCルールDLLは、CWinAppから継承されたクラスを含むが、メッセージループはない.MFC拡張DLLは、MFCクラスライブラリで作成されたアプリケーションでのみ呼び出されるMFCのダイナミックリンクバージョンで作成されます.
本文の幅が長いため、内容が多いので、まず本文を読む関連事項を説明する必要があります.以下、問答形式で提供します.問:本文は主にどんな内容を説明しますか.答え:本文はDLLプログラミングの各方面を詳しく紹介して、努力して本文を勉強し終わってDLLに対して比較的に全面的に掌握することができて、そして大多数のDLLプログラムを編纂することができます.問:本文をどう思いますか.答:本文の各テーマの説明にはソースコードルーチンが付属しており、ダウンロードできます(各プロジェクトはWINRARで圧縮されています).これらのルーチンはすべて筆者が作成し、VC++6.0でデバッグした.もちろん本文を読むのは読者の最終目的ではなく、読者は自ら実践してこそDLLの奥義を本当に掌握することができる.問:本文を学ぶにはどのような基礎知識が必要ですか.答え:Cをマスターして、大体C++をマスターして、MFCの知識を少し理解すれば、簡単に本文を読むことができます.2.静的リンクライブラリの静的リンクライブラリの説明は本稿の重点ではありませんが、DLLを具体的に説明する前に、静的リンクライブラリの例を通じて、「ライブラリ」の概念を迅速に構築することができます.
図1のように、VC++6.0においてlibTestという名前のstatic libraryプロジェクトをnewし(ここをクリックして本プロジェクトアタッチメントをダウンロード)、libを新規作成する.hとlib.cpp 2つのファイルlib.hとlib.cppのソースコードは以下の通りです.
//ファイル:lib.h
#ifndef LIB_H
#define LIB_H
    extern "C" int add(int x,int y);//   C  、         
#endif

//ファイル:lib.cpp
#include "lib.h"
int add(int x,int y)
{
    return x + y;
}

 
この工事をコンパイルすると1つ得られた.libファイル、このファイルはaddの機能を提供する関数ライブラリです.ヘッダファイルと.libファイルがユーザーにコミットされると、ユーザーはその中のadd関数を直接使用することができます.標準Turbo C 2.0のCライブラリ関数(scanf、printf、memcpy、strcpyなど)は、この静的ライブラリから来ています.
 
このライブラリの使い方を見てみましょう.libTestプロジェクトがあるワークスペース内でnewのlibCallプロジェクトを見てみましょう.libCallプロジェクトにはmainが1つしか含まれていません.cppファイル.静的リンクライブラリの呼び出し方法を示します.ソースコードは次のとおりです.
 
#include <stdio.h>
#include "..\lib.h"
#pragma comment( lib, "..\\debug\\libTest.lib" ) //          
int main(int argc, char* argv[])
{
   printf( "2 + 3 = %d", add( 2, 3 ) );
}

 
静的リンクライブラリの呼び出しはこのように簡単で、私たちは毎日使っているかもしれませんが、私たちはこの概念を理解していません.コード中の#pragma comment(lib,"..\debug\libTest.lib")とは、本ファイルが生成することを意味する.OBjファイルはlibTestとする.libは一緒に接続されています.pragma commentで指定しない場合は、図2のようにVC++で直接設定できます.tools、options、directories、library filesメニューまたはオプションを選択して、ライブラリファイルパスを入力します.図2の赤い輪の部分は私たちが追加したlibTestです.libファイルのパス.
図2 VCにおけるライブラリファイルパスの設定
この静的リンクライブラリの例は,ライブラリ関数がどのようにしてどこから来たのかを少なくとも理解させる.(1)ライブラリは怪物ではなく、ライブラリを記述するプログラムと一般的なプログラムの違いは大きくないが、ライブラリは単独で実行できない.(2)ライブラリは他のプログラムに呼び出すことができるものを提供し,他のプログラムが呼び出すには何らかの方法で呼び出す必要がある.以上、静的リンクライブラリの分析から得られたライブラリに対する愚かな概念は、動的リンクライブラリに直接導入することができ、動的リンクライブラリと静的リンクライブラリの作成と呼び出しの違いは、ライブラリの外部インタフェースの定義と呼び出し方式にわずかな違いがある.
 
3.ライブラリのデバッグと表示各種類のDLLの詳細な説明に入る前に、ライブラリファイルのデバッグと表示方法を紹介する必要があります.次のセクションから多くの例のエンジニアリングに直面するからです.ライブラリファイルは単独では実行できないため、F 5(debugモードの実行開始)またはCTRL+F 5(実行)を押すと、図3に示すダイアログボックスがポップアップされ、ユーザに実行可能ファイルのパスを入力してライブラリ関数の実行を開始するように要求される.このとき、ライブラリを呼び出すEXEファイルのパスを入力すると、ライブラリをデバッグできます.デバッグのテクニックは、一般的なアプリケーションエンジニアリングのデバッグと同じです.
図3ライブラリのデバッグと「実行」
通常、ライブラリエンジニアリングとアプリケーションエンジニアリング(呼び出しライブラリのエンジニアリング)を同じVCワークスペースに配置し、アプリケーションエンジニアリングのみをデバッグし、アプリケーションエンジニアリング呼び出しライブラリの関数の文にブレークポイントを設定し、実行後にF 11を押すと、ライブラリの関数に単一ステップで入ります.第2節のlibTestとlibCall工事は同じ作業区に置かれ,その工事構造は図4に示す.
図4ライブラリエンジニアリングと呼び出しライブラリのエンジニアリングを同じワークスペースに入れてデバッグする
上記のデバッグ方法は、静的リンクライブラリと動的リンクライブラリで一致します.したがって、本明細書で提供されるダウンロードのすべてのソースコードには、ライブラリエンジニアリングと呼び出しライブラリのエンジニアリングが含まれており、両方がワークスペースに含まれており、筆者がこのようなパッケージダウンロードを提供する意図である.
 
ダイナミックリンクライブラリのエクスポートインタフェースは、Visual C++のDependsツールを使用して表示できます.Dependsでシステムディレクトリのuser 32を開きます.dll、見たでしょ?赤い輪の中にあるのはいくつかのバージョンのMessageBoxです!本当にここにいたのか、ここにいたのか.
図5 DependsでDLLを表示する
もちろんDependsツールはDLLの階層を表示することもできますが、実行可能ファイルを開くと、この実行可能ファイルがどのDLLを呼び出したかがわかります.では、ダイナミックリンクライブラリの世界に本格的に入りましょう.まず、最も一般的なDLL、すなわち非MFC DLL(続き...)を見てみましょう.
 
http://www.pconline.com.cn/pcedu/empolder/gj/vc/0509/698632.html(ここから)