トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
VisualStudio
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索
___

■ DLL2




___

■ Export.Import

DLL 内の関数を他のプログラムから使用できるようにすること 使う側: // DLL から LINK するため LINK ERROR しないように指示をする。 __declspec( dllimport ) 逆に Client 側から利用してもらうには, __declspec(dllexport) を宣言して Symbol 情報を出力する この設定をしないと .lib が出力されない 存在理由 LINKER に DLL 内に関数があることを知らせるため 名前を互いに明示的に表示することで アクセスできるようにする. EXport とは dll をテキストエディタやバイナリエディタで開くと 中に関数名が文字列として書かれてる これが「見える」ということで、検索可能であるということ。 static lib でも 関数名が見える。見えないと LINK できない。 DLL 版の .lib size は小さい しかも .lib には 文字列などの情報がない 複数の DLL を同一関数名で 暗黙LINK すると 先に lib に指定した方で Symbol を解決する 明示版でも同じはず
___

■ 使い方

declspec(dllexport)キーワードを使用する ( MS固有の予約語、ANSIC にはない )
       __declspec(dllexport) func();
       __declspec(dllimport) func();
2. def file を利用する POINT 関数名ではなく序数で公開するので、DLLのサイズが小さくなる
    以下の項目をファイルに記述
     1. ライブラリ名
      2. エクスポートする関数名

      LIBRARY DllTest
  DESCRIPTION "DLL-TEST"
  EXPORTS
        calcTest @1
        stringTest @2
___

■ dll のリンク方法

暗黙(静的)リンク : GetProcAddress() の代わりに lib を LINK する -> WARNING: 複数の DLL で同一の Symbol を利用する場合は不要. 関数の宣言 __declspec(dllimport) type func(type); // VC 固有なので注意 2. linker .lib を link .lib に関数名と序数が記述 3. DLL のロード 実行の準備前にロード 4. 関数とのbind .lib に記述した関数がないと実行時エラー 5. 暗黙 pro がコードに記述しなくても, load されるので暗黙的 6. 静的 linker がリンクした時点で, どの関数を使用するかが 決定するので静的
___

■ 明示(動的)リンク

関数の宣言、DLL の関数の宣言はしない ( 関数ptr のtypedef はあると便利 ) 2. linker linker のリンクは不要 ( 実行時に動的にコール ) 3. DLL のロード LoadLibrary() でロード 4. 関数とのbind GetProcAddress で関数名( 序数 )を指定することで関数ポインタを取得 5. 明示 pro がLoadLibrary() するので 明示的 6. 動的 LoadLibray, GetProcAddress で自由にコールできるので動的
___

■ DLL

DESC プログラムの実体をもつfile 関数名 | 序数 でエントリを保持 POINT 暗黙 .lib のエントリ情報を元に関数を bind 明示 GetProcAddress() で明示的に指定する。 POINT # dll 内の関数名、序数が表示する VC Cmd > dumpbin /exports foo.dll # dll 内の依存関係をしらべる # この DLL(Exe) を使うのに必要な DLL を表示 # たとえば LINK する xxx.lib を変更すると内容もかわる VC Cmd > dumpbin.exe /dependents foo.dll
___

■ DumpBin

DESC 実行ファイルから Symbol を出力するツール。 外部 の library でどのような関数があるか, 調べる際に利用する. VS の 関数名で BreakPoint をしかけると併用すると便利. // すべてを見るには dumpbin /all foo.exe // printf() でも MSVCR80D.dll に依存する export している関数を調べる。
    dumpbin  /export  test.exe
次のように出力される。
  Section contains the following exports for test.exe

    00000000 characteristics
    4F366DB1 time date stamp Sat Feb 11 22:31:29 2012
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint RVA      name

          1    0 00001040 ?testexport@@YAHXZ
___

■ 使い分け

暗黙 プログラムが楽( headerを細工するだけで良い ) 明示 DLL の有無を問わない 特定の dir の DLL をロードする DLL file 名を定義ファイルに記述して、ロードできる。
___

■ .lib

DESC DLL 本体への入り口( アドレス )が記述されたファイル 入り口 == ( 関数名 | 序数 ) DLL load 時に .lib 内の関数をすべて ロードする
___

■ 序数

DESC dll の関数をあらわす一意の数字のこと POINT EXport する関数の数がかわると、DLL がもつ 序数が変化する 新たな .lib をリンクする必要がある
___

■ def

DESC dll に保持される、関数名、序数を定義するファイル SYNTAX ; 関数名と序数を指定
  EXPORTS
      testfunc @1
      foofunc  @2
POINT def file を使用する際は dllexport する必要はない 逆に dllexport することが、def file ですることを自動化している。 DLL, .lib に export 情報を組み込むこと意味
___

■ その他

___

■ header に関数名があるから lib は link 場合でも必要

DLL 本体への入り口 ( 関数名 , 序数 ) があるので 必須 関数宣言だけで DLL 内のどこを見ればよいか分らない。
___

■ dll lib file 名を変えることはできない。

A. lib ならば変更できる。 -> lib には [ この dll の この関数 ] という情報がある [ この dll ]は lib に記述すみ
___

■ __declspec(dllexport)

DESC DLL とは次の三つで構成される export : DLL として公開する symbol list 2. code, data : 公開する関数、変数の本体 3. import library : DLL の symbol を link するための OS への最低限の情報 以上のことを export は text editor で list を手書きでつくるが 自動でやってくれるのが__declspec(dllexport)
















NINJAIDX 15