Table」内の、各関数名の先頭位置を表にしたものだ。これを順番に見ていけば、関数の名前をすべて得られる。Tableと対になっていて、同じ位置にある関数名に対応する序数を保存してある。これを使うことで、名前から序数が得られる。Table内の文字列をひとつひとつ照合していく。Tableからn番目の要素を取り出す。Tableを見て、関数の開始アドレスを得られるわけだ。バージョンアップでDLLが変わったらどうなる?APIの呼び出し先としてDLLを見た場合、Windowsのバージョンが変わっても、同じDLL名や関数名(または序数)でアクセスできなければならない。なると、DLLの変更は困難になる。「序数が変わったら今までのアプリケーションからはアクセスできなくなりました」では困るわけだ。そのためDLLには、「フォワード」という機構がある(図2)。Tableが指すアドレスが関数の開始位置ではなく、ほかのDLLの名前と関数名(または序数)を表した文字列になっている。この場合、Windowsは、アドレスが実行コードのセクションにあるのか、そうでないのかを見て、飛び先が関数なのか、ほかのDLL名なのかを判断する。Tableに格納されているアドレスがコードセクションにあれば、それは関数を意味する。Table内のアドレスがコードセクションではなかった場合、Windowsは、これを「次のDLLの名前と関数名(を表す文字列)」だと解釈する。しておけば、例えばOSカーネル内部の関数名などが変わっても、アプリケーションから見えるDLL名や関数名を、一定にしておくことができる。メモリー内にDLLが読み込まれると、各関数の開始アドレスが確定する。OSカーネルはこのときに、関数のアドレスを記録しておく。呼び出し側はOSが記録したアドレスを受け取って、関数を呼び出す形となる。フォワードの場合には、転送先のDLLもメモリーに読み込まれて各関数のアドレスが確定するので、これが呼び出し側に渡される。この部分は、EXEファイルのインポートセクションが関係しているが、今回のテーマとは外れるので割愛する。スマホお気に入り一覧マイページ。