C++dllファイルを生成して呼び出す

3630 ワード

一、dllエンジニアリングファイルの新規作成:
       VISUAL STUDIO
1、 “  ”   ,  “  ”,    “  …”。

2、 “    ”     “Visual C++”  “Win32”。

3、 “  ”   ,  “Win32        ”。

4、         , “MathFuncsDll”,     “  ”  。           , “DynamicLibrary”,     “      ”  。

5、 “  ”   Win32       。 “Win32       ”    “  ”  , “   ”。

6、 “Win32       ”  “      ”  ,  “      ”  “DLL”(    ),    “       ”(  “DLL”   )。      Visual Studio           DLL   。           ,        DLL。

7、 “Win32       ” “      ”  ,  “    ”  “   ”。

 
二、dllプログラムの生成
extern "C"_declspec(dllexport) void maopao(int *p,int count); void maopao(int *p,int count) {  int temp=0;  for(int i=1;i=i;j--)   {    if(p[j]>p[j-1])    {     temp=p[j];     p[j]=p[j-1];     p[j-1]=temp;    }   }  } }
 
 
三、dllエンジニアリングファイルを新規に呼び出す:
       VISUAL STUDIO
1、 “  ”   ,  “  ”,    “  …”。

2、 “    ”     “Visual C++”  “Win32”。

3、 “  ”   ,  “Win32        ”。

4、         , “MathFuncsDll”,     “  ”  。           , “DynamicLibrary”,     “      ”  。

5、 “  ”   Win32       。 “Win32       ”    “  ”  , “   ”。

6、 “Win32       ”  “      ”  ,  “      ”  “Console application”,    “       ”(  “DLL”   )。      Visual Studio           DLL   。           ,        DLL。

7、 “Win32       ” “      ”  ,  “    ”  “   ”。

 
四、dllファイルを呼び出す(dllを呼び出すときに)
#include #include #include
typedef int(*Dllfun)(int *,int); using namespace std;
int main() {  Dllfun maopao1;  HINSTANCE hdll;  hdll=LoadLibrary("D:\\company\\soft\\C\\maopao_dll\\Debug\\maopao_dll.dll");  if(hdll==NULL)  {   FreeLibrary(hdll);  }
 maopao1=(Dllfun)GetProcAddress(hdll,"maopao");  if(maopao1==NULL)  {   FreeLibrary(hdll);  }  int a[10];  srand(time(0));  for(int i=0;i<10;i++)   a[i]=rand()%50;
 for(int i=0;i<10;i++)   cout< maopao1(a,10);  for(int i=0;i<10;i++)   cout< FreeLibrary(hdll);
}
コメント:
C++はどのようにDLLを呼び出すのか、2つあります.1つは静的で、もう1つは動的です.つまりwindowsAPIを呼び出すことでDLLをロードしてアンインストールします.具体的な考え方は:
1.まずDLLを作成します.ここではCPPに直接関数宣言と定義を作成しました.単独のヘッダファイルはありません.多くの場合、DLLはlibとヘッダファイルと一緒にいないからです.
2.次に、DLLを呼び出す別のプロジェクトを新規作成します.
1.ヘッダファイル,windows 32メソッドでDLLをロードおよびアンインストールしたいことを説明します
2.次にtypedefでポインタ関数のタイプを定義する.typedef void(*fun)/このポインタタイプは、呼び出された関数タイプとパラメータと一致するように、ポインタパラメータであることを覚えておいてください(int*,int)
3.DLLのインスタンスアドレスを取得するためのハンドルインスタンスを指定します.HINSTANCE hdll;
フォーマットはhdll=LoadLibrary(「DLLアドレス」)です.ここで文字列タイプはLPSTRです.unicode文字セットの場合はできません.そのため、エンジニアリング--属性--一般--デフォルト文字セット:unicodeをマルチ文字拡張をサポートするように変更すればいいです.
4.取得したアドレスは、返されたハンドルが空であるかどうかを判断し、無効なハンドルである場合は、DLLのロードに使用されたメモリを解放します.
FreeLibrary(hdll);
5.次に、使用する関数アドレスを取得するための関数ポインタを定義します.これはどのように使用しますか?
まず、関数ポインタfun FUNを指定します.それからGetProcAdressで関数のアドレスを取得します.この関数パラメータは何ですか.
パラメータはDLLのハンドルと呼び出す関数名です.たとえば、FUN=(fun)GetProcAdress(hdll、sum);
ここでも要関数ポインタが空かどうかを判断し,要求された関数が取れなかったらハンドルを解放する.
FreeLibrary(hdll);
6.次に、関数ポインタを使用して関数を呼び出します.
FUN(int *p,int count);このDLL自体は現在のCPPの一部ではなくwindowsによって呼び出されるため、ここでは関数名で関数を使用することはできない.この工事で宣言したり定義したりするのではなく、ポインタが彼の住所を取得し、ポインタで呼び出すように頭を露出した.
最後の呼び出しが終了すると、ハンドルが解放されます.
FreeLibrary(hdll);
ここでは,動的ロードによって静的に関与しないだけである.これは後で勉強します.