青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 15, comments - 9, trackbacks - 0, articles - 0

如何創建自己的dll

Posted on 2009-04-28 12:10 沙漠里的海豚 閱讀(513) 評論(0)  編輯 收藏 引用 所屬分類: c/c++標準
前幾天有個朋友問道這個問題,結果因為以前從沒搞過這個,對vs2005也不熟悉,竟花了2個小時才搞定,
特地拿來與大家分享,希望能給像我這樣的菜鳥們一些幫助,O(∩_∩)O
【第一步】創建自己的dll
1.打開vs2005,選擇菜單【File-New-Project】,在彈出對話框中選擇[Visual C++]下的[Win32]-[Win32 Console Application],輸入工程名后確認。
2.在彈出的對話框中選擇[next],在Application Settiongs中選擇Application type為Dll,Additional options選擇Empty project,然后點Finish。
這時就創建了一個空的可以生成dll文件的工程。
3.在工程中添加一個頭文件(這里為dll_test.h),在頭文件中寫入如下內容:
 1 #ifndef _DLL_TUTORIAL_H
 2 #define _DLL-TUTORIAL_H
 3 
 4 #include<iostream>
 5 
 6 #if defined DLL_EXPORT
 7   #define DECLDIR _declspec(dllexport)
 8 #else
 9   #define DECLDIR _declspec(dllimport)
10 #endif
11 
12 extern "C"
13 {
14   DECLDIR int Add(int a, int b);
15   DECLDIR void Function(void);
16 }
17
18 #endif
這里要說明的是:
在VC中有兩個方法來導出dll中定義的函數:
  (1) 使用__declspec,這是一個Microsoft定義的關鍵字。
  (2) 創建一個模板定義文件(Module-Definition File,即.DEF)。
  第一種方法稍稍比第二種方法簡單,在這里我們使用的是第一種方法。
    __declspec(dllexport)函數的作用是導出函數符號到在你的Dll中的一個存儲類里去。
當下面一行被定義時我定義DECLDIR宏來運行這個函數。
    #define DLL_EXPORT
在此情況下你將導出函數Add(int a,int b)和Function().
4.創建一個源文件(名字為dll_test.cpp),內容如下:
 
 1 #include <iostream>
 2 #define DLL_EXPORT
 3 #include "dll_test.h"
 4 
 5 extern "C"
 6 {
 7         // 定義了(DLL中的)所有函數
 8     DECLDIR int Add( int a, int b )
 9     {
10         return( a + b );
11     }
12     
13     DECLDIR void Function( void )
14     {
15         std::cout << "DLL Called!" << std::endl;
16     }
17 }
18 
【第二步】使用創建好的DLL
現在已經創建了DLL,那么如何在一個應用程序中使用它呢?
當DLL被生成后,它創建了一個.dll文件和一個.lib,這兩個都是使用dll時需要用到的。
在具體介紹之前先看一下dll的鏈接方式。
(1)隱式連接
這里有兩個方法來載入一個DLL,一個方法是只鏈接到.lib文件,并將.dll文件放到要使用這個DLL的項目路徑中。
因此,創建一個新的空的Win32控制臺項目并添加一個源文件。將我們創建好的DLL放入與新項目相同的目錄下。同時我們還必須鏈接到dll_test.lib文件。
可以在項目屬性中設置,也可以在源程序中用下面的語句來鏈接:
#pragma comment(lib, "dll_test.lib")
最后,我們還要在新的win32控制臺項目中包含前面的dll_test.h頭文件。可以把這個頭文件放到新建win32控制臺項目的目錄中然后在程序中加入語句:
#include "dll_test.h"
新項目代碼如下:
#include<iostream>
#include "DLLTutorial.h"
int main()
{
  Function();
  std::cout<< Add(32, 56)<< endl;
  return 0;
}
(2)顯示鏈接
稍微復雜一點的加載DLL的方法需要用到函數指針和一些Windows函數。但是,通過這種載入DLL的方法,不需要DLL的.lib文件或頭文件,而只需要DLL即可。
下面列出一些代碼:
/****************************************************************/
#include <iostream>
#include <windows.h>
typedef int (*AddFunc)(int,int);
typedef void (*FunctionFunc)();
int main()
{
AddFunc _AddFunc;
   FunctionFunc _FunctionFunc;
   HINSTANCE hInstLibrary = LoadLibrary("DLL_Tutorial.dll");
   if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}
   _AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
   _FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary, "Function");
   if ((_AddFunc == NULL) || (_FunctionFunc == NULL))
{
FreeLibrary(hInstLibrary);
}
   std::cout << _AddFunc(23, 43) << std::endl;
   _FunctionFunc();
   std::cin.get();
   FreeLibrary(hInstLibrary);
   return(1);
}
/*******************************************************************/
首先可以看到,這里包括進了windows.h頭文件,同時去掉了對dll_test.h頭文件的包含。原因很簡單:因為windows.h包含了一些Windows函數,
它也包含了一些將會用到的Windows特定變量。可以去掉DLL的頭文件,因為當使用這個方法載入DLL時并不需要其頭文件。
下面你會看到:以下面形式的一小塊古靈精怪的代碼:
    typedef int (*AddFunc)(int,int);
typedef void (*FunctionFunc)();
    這是函數指針。因為這是一個關于DLL的自學指南,深入探究函數指針超出了本指南的范圍;因此,現在我們只把它們當作DLL包含的函數的別名。
    我喜歡在尾部用“Func”命名之。(int,int)部分是這個函數的參數部分,比如,Add函數要獲得兩個整數;因此,你需要它們
(譯注:指(int,int)部分)作為函數指針的參數。Function函數沒有參數,因此你讓它為空。main()部分中的前面兩行是聲明函數指針以使得你可
以認為它們等同于DLL內部的函數。我只是喜歡預先定義它們。
      一個HINSTANCE是一個Windows數據類型:是一個實例的句柄;在此情況下,這個實例將是這個DLL。你可以通過使用函數LoadLibrary()獲得DLL的
實例,它獲得一個名稱作為參數。
     在調用LoadLibrary函數后,你必需查看一下函數返回是否成功。你可以通過檢查HINSTANCE是否等于NULL(在Windows.h中定義為0或Windows.h包
含的一個頭文件)來查看其是否成功。如果其等于NULL,該句柄將是無效的,并且你必需釋放這個庫。換句話說,你必需釋放DLL獲得的內存。
      如果函數返回成功,你的HINSTANCE就包含了指向DLL的句柄。一旦你獲得了指向DLL的句柄,你現在可以從DLL中重新獲得函數。
     為了這樣作,你必須使用函數GetProcAddress(),它將DLL的句柄(你可以使用HINSTANCE)和函數的名稱作為參數。你可以讓函數指針獲得由
GetProcAddress()返回的值,同時你必需將GetProcAddress()轉換為那個函數定義的函數指針。舉個例子,對于Add()函數,你必需將GetProcAddress()
轉換為AddFunc;這就是它知道參數及返回值的原因。現在,最好先確定函數指針是否等于NULL以及它們擁有DLL的函數。
     這只是一個簡單的if語句;如果其中一個等于NULL,你必需如前所述釋放庫。一旦函數指針擁有DLL的函數,你現在就可以使用它們了,但是這里有一個
需要注意的地方:你不能使用函數的實際名稱;你必需使用函數指針來調用它們。在那以后,所有你需要做的是釋放庫如此而已。
     現在你知道了DLL的一些基本知識。你知道如何創建它們,你也知道如何用兩種不同的方法鏈接它們。這里仍然有更多的東西需要我們學習,但我把它們留給你們自己探索了和更棒的作者來寫了。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美日韩另类精品一区二区三区 | 极品日韩久久| 国产美女精品视频免费观看| 国产精品进线69影院| 欧美日韩精品一区二区天天拍小说| 欧美二区不卡| 国产精品qvod| 国产一区二区黄色| 在线日韩精品视频| 国产精品99久久久久久久女警| 亚洲免费在线| 裸体丰满少妇做受久久99精品| 亚洲电影在线播放| 99精品黄色片免费大全| 亚洲欧美电影院| 老司机久久99久久精品播放免费| 欧美激情第10页| 国产欧美一区二区精品秋霞影院| 激情综合网址| 亚洲无线一线二线三线区别av| 久久国产主播| 91久久国产综合久久蜜月精品| 亚洲一级片在线观看| 久久精品综合| 国产精品麻豆va在线播放| 一色屋精品亚洲香蕉网站| 亚洲免费在线视频| 亚洲国产日韩欧美| 久久久久se| 国产精品爽爽ⅴa在线观看| 亚洲日韩成人| 老司机精品久久| 亚洲免费视频一区二区| 欧美精品一区二区高清在线观看| 国产伦精品一区二区| 亚洲精品自在在线观看| 久久九九国产精品| 亚洲一区二区免费看| 欧美激情亚洲激情| 亚洲高清影视| 老色鬼久久亚洲一区二区| 亚洲欧美区自拍先锋| 欧美视频成人| 亚洲天堂视频在线观看| 亚洲国产精品精华液网站| 久久国产日韩欧美| 国产伦精品一区二区三| 国产婷婷一区二区| 亚洲一区二区三区777| 欧美激情女人20p| 久久久久久69| 在线观看久久av| 久久久久久久久综合| 亚洲制服欧美中文字幕中文字幕| 欧美日韩ab| 一区二区三区日韩欧美精品| 亚洲国产老妈| 欧美日韩ab| 亚洲一区在线观看视频| 在线视频精品| 国产欧美激情| 久久美女性网| 久久青草福利网站| 亚洲国产欧美不卡在线观看| 欧美成人dvd在线视频| 久久躁日日躁aaaaxxxx| 在线免费观看成人网| 蜜桃av一区二区三区| 久久久久久久一区二区| 亚洲高清网站| 亚洲精品免费在线| 欧美午夜视频网站| 久久成人精品电影| 久久网站免费| av72成人在线| 亚洲一区二区三区四区五区黄 | 美腿丝袜亚洲色图| 久久久噜噜噜久久人人看| 亚洲国产成人精品女人久久久| 免费日韩一区二区| 欧美激情亚洲国产| 欧美一区二区视频网站| 久久久精品免费视频| 亚洲国产一二三| 在线亚洲一区| 在线日本高清免费不卡| 亚洲精品影院| 狠狠色丁香久久婷婷综合_中| 欧美激情视频一区二区三区免费| 欧美日韩视频| 另类专区欧美制服同性| 欧美日韩直播| 免费在线观看精品| 欧美先锋影音| 欧美国产精品久久| 国产模特精品视频久久久久| 亚洲成人资源网| 国产日韩在线视频| 日韩午夜av电影| 在线观看一区欧美| 亚洲一区三区电影在线观看| 亚洲全部视频| 久久久www| 欧美一区二粉嫩精品国产一线天| 免费一级欧美片在线播放| 亚洲欧美综合| 欧美精品99| 精品51国产黑色丝袜高跟鞋| 日韩一区二区精品在线观看| 国产欧美日韩综合| 亚洲国产欧美国产综合一区| 国产欧美在线视频| 中国成人在线视频| 夜夜嗨av一区二区三区| 牛牛精品成人免费视频| 久久久精品动漫| 国产精品高潮久久| 亚洲精品免费在线播放| 亚洲第一精品在线| 久久成人免费| 久久精品国产精品亚洲综合| 欧美日韩国产在线播放| 欧美激情片在线观看| 影音欧美亚洲| 久久人人爽人人爽| 久久综合久久美利坚合众国| 国产亚洲精品高潮| 欧美一区激情| 久久深夜福利免费观看| 国产亚洲欧美aaaa| 欧美一级午夜免费电影| 欧美一级在线播放| 国产精品一区二区欧美| 亚洲手机视频| 亚洲专区在线| 国产精品美女www爽爽爽视频| 99国产精品99久久久久久粉嫩| 亚洲美女啪啪| 欧美日韩一区二区三| 日韩一二在线观看| 亚洲图色在线| 国产精品女人毛片| 亚洲男女自偷自拍| 久久精品99国产精品日本| 国产午夜精品一区理论片飘花| 欧美一区二区三区免费大片| 久久嫩草精品久久久精品| 韩国成人福利片在线播放| 久久精品中文字幕一区| 欧美激情1区| 在线一区视频| 国产一区二区久久| 久久综合狠狠综合久久激情| 亚洲国产视频一区| 亚洲综合精品四区| 国产主播一区二区| 美国十次了思思久久精品导航| 欧美国产视频在线观看| 一区二区三区国产| 国产日韩在线视频| 老司机精品久久| 一本色道88久久加勒比精品| 欧美主播一区二区三区| 亚洲国产成人午夜在线一区| 欧美黄色免费网站| 亚洲一区在线观看视频 | 欧美日韩黄色大片| 亚洲综合二区| 欧美国产在线电影| 午夜精品久久久久久久| 亚洲电影激情视频网站| 国产精品av免费在线观看| 久久精品理论片| 一本色道久久综合亚洲精品不| 久久蜜臀精品av| 欧美午夜视频一区二区| 欧美中文在线观看| 亚洲三级影片| 久久久精品视频成人| 日韩一区二区精品| 国产日韩在线视频| 欧美日韩精品一本二本三本| 欧美在线观看日本一区| 99在线精品视频| 欧美电影电视剧在线观看| 午夜日韩视频| 亚洲天堂成人在线观看| 亚洲国产成人在线| 国产亚洲一区二区精品| 欧美日韩国产精品自在自线| 久久亚洲一区二区| 欧美一区二区三区在线观看视频| 日韩一区二区精品葵司在线| 亚洲第一精品影视| 噜噜噜噜噜久久久久久91| 久久精品在这里| 欧美一区二区成人6969| 亚洲永久在线| 亚洲神马久久| 中文精品视频一区二区在线观看|