DLL実行時の動的ロード

3382 ワード

昨日の夜、DLL导入の问题は私を振り回してしばらく、ネット上で検索して、多くのホームページを见て収益はとても小さくて、谁もがすべて自分の考えあるいは自分の必要に応じてネット上で発表するのかもしれません.次は自分の問題を記録して、解決の構想、方法も書いて、後用に備えます. 

   
   
   
   
  1. //dlltest.h  
  2.  
  3. extern "C" 
  4.   __declspec(dllexport) int _stdcall add(int a, int  b); 
  5.  
  6. //dlltest.cpp  
  7.  
  8. #include "dlltest.h" 
  9.  
  10.  __declspec(dllexport) int _stdcall  add(int a, int  b) 
  11.  { 
  12.    return a+b; 
  13.  } 

以上がDLLの生成工程におけるファイルであり、実行するとdlltestが生成する.dllファイル(もちろんエンジニアリングプロパティ設定の協力が必要です).

   
   
   
   
  1. DLL dlluse.cpp  
  2.  
  3. int _tmain(int argc, _TCHAR* argv[]) 
  4.   typedef int (/*_stdcall*/  *padd)(int a,int b); //  
  5.   HINSTANCE hInstance=LoadLibrary("dlltest.dll"); 
  6.   padd add = (padd)GetProcAddress(hInstance,"add"); 
  7.   if(!add) 
  8.   { 
  9.     cout<<" "<<endl
  10.   } 
  11.   getchar(); 
  12.   return 0; 

DLLを呼び出すプロジェクトで生成されたexeファイルを実行すると、「ダイナミック接続ライブラリ関数が見つかりません」というメッセージが表示されます.\Common7\Tools\Bin\depends.exeはvs 2005が持っているこのツールでdlltestを見ます.dll、「add」関数がまったく存在しないことがわかります.この問題は主に_stdcallの使用が分からないためです.dlluse.cppで「add」を「add」に変更します.add@8「それでいいです.
  
以下は原因とまとめです.
1、関数呼び出し規則方式_stdcall、__cdecl,_cdeclはCとC++プログラムのデフォルト呼び出し方式である.「Cの場合、__stdcallネーミング規則には次の線が使用されます()先頭の関数名には、「at」記号(@)と関数パラメータサイズ(バイト単位)が続く.
2、extern"C"で修飾された変数と関数はC言語でコンパイルされ接続され、C++は関数の再ロードをサポートするが、プロセス言語Cはサポートされず、関数はC++でコンパイルされた後、シンボルライブラリの名前はC言語と異なる.
3、depends.exeというツールはいいですね.exeは、dllでエクスポートされた関数の名前を表示するために、関数のエントリポイントを表示できます.vs 2005のdepends.exeはCommon 7ToolsBindepends.探して、VS 2008中depends.exeWindows SDKグループは品質不良と評価して退職した.