調用DLL有兩種方法:靜態(tài)調用和動態(tài)調用.
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供贛榆網(wǎng)站建設、贛榆做網(wǎng)站、贛榆網(wǎng)站設計、贛榆網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、贛榆企業(yè)網(wǎng)站模板建站服務,十年贛榆做網(wǎng)站經驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
(一).靜態(tài)調用其步驟如下:
1.把你的youApp.DLL拷到你目標工程(需調用youApp.DLL的工程)的Debug目錄下;
2.把你的youApp.lib拷到你目標工程(需調用youApp.DLL的工程)目錄下;
3.把你的youApp.h(包含輸出函數(shù)的定義)拷到你目標工程(需調用youApp.DLL的工程)目錄下;
4.打開你的目標工程選中工程,選擇Visual C++的Project主菜單的Settings菜單;
5.執(zhí)行第4步后,VC將會彈出一個對話框,在對話框的多頁顯示控件中選擇Link頁。然后在Object/library modules輸入框中輸入:youApp.lib
6.選擇你的目標工程Head Files加入:youApp.h文件;
7.最后在你目標工程(*.cpp,需要調用DLL中的函數(shù))中包含你的:#include "youApp.h"
注:youApp是你DLL的工程名。
(二).動態(tài)調用其程序如下:
動態(tài)調用時只需做靜態(tài)調用步驟1.
01 {
02 HINSTANCE hDllInst = LoadLibrary("youApp.DLL");
03 if(hDllInst)
04 {
05 typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
06 MYFUNC youFuntionNameAlias = NULL;
07 // youFuntionNameAlias 函數(shù)別名
08 youFuntionNameAlias = (MYFUNC)GetProcAddress(hDllInst,"youFuntionName");
09 // youFuntionName 在DLL中聲明的函數(shù)名
10 if(youFuntionNameAlias)
11 {
12 youFuntionNameAlias(param1,param2);
13 }
14 FreeLibrary(hDllInst);
15 }
16 }
顯式(靜態(tài))調用:
LIB + DLL + .H,注意.H中dllexport改為dllimport
隱式(動態(tài))調用:
DLL + 函數(shù)原型聲明,先LoadLibrary,再GetProcAddress(即找到DLL中函數(shù)的地址),不用后FreeLibrary
1、新建DLLTest文件夾,在該文件夾中新建source文件夾。
2、在source文件夾中造add.c。
3、win+R+cmd請出總指揮“命令行”,輸入。
4、繼續(xù)輸入(路徑也要隨機應變)link /DLL /out:E:\VCfile\DLLTest\source\add.dll E:\VCfile\DLLTest\source\add.obj。
5、新建源文件call_dll.c或.cpp放到DLLTest文件夾,同時add.dll也復制過來。
6、編譯,連接運行出現(xiàn)個5。調用成功。
注意事項:
C語言能以簡易的方式編譯、處理低級存儲器。C語言是僅產生少量的機器語言以及不需要任何運行環(huán)境支持便能運行的高效率程序設計語言。
一.動態(tài)鏈接庫(dll)結構
——dll中定義有兩種函數(shù):導出函數(shù)(export
function)和內部函數(shù)
(internal
function),導出函數(shù)可以被其他模塊調用,內部函數(shù)只能在dll內部使用。我們在用c++定制dll文件時,需要編寫的就是包含導出函數(shù)表的模塊定義文件(.def)和實現(xiàn)導出函數(shù)功能的c++文件。下面以sample.dll為例介紹def文件和實現(xiàn)文件的結構:
——1.模塊定義文件(.def)是由一個或者多個用于描述dll屬性的模塊語
句組成的文本文件,每個.def文件至少必須包含以下模塊定義語句:
第一個語句必須是library語句,指出dll的名字。
exports語句列出被導出函數(shù)的名字。
可以使用description語句描述dll的用途(此句可選)。
";"對一行進行注釋(可選)
——2.實現(xiàn)文件(.cpp文件為例)
——實現(xiàn)入口表函數(shù)的.cpp文件中,包含dll入口點處理的api函數(shù)和導出
函數(shù)的代碼。
dll制作步驟:
1.編寫dll函數(shù)實現(xiàn)源代碼hello.c
#include
int say_hello(char* name)
{
printf( "hello %s\n ", name);
return 1;
}
2.編寫dll函數(shù)輸出定義文件hello.def.
LIBRARY hello
EXPORTS
say_hello @1
3.編譯dll源碼,生成dll,lib文件.
3.1 新建命令行窗口
3.2 設置PATH ?? INCLUDE ?? LIB 3個環(huán)境變量.
SET PATH=K:\vcnet\vc7\bin;%PATH%
SET INCLUDE=K:\vcnet\vc7\include;%INCLUDE%
SET LIB=K:\vsnet\Vc7\lib;%LIB%
3.3 編譯hello.c
cd K:\Source\dllsample (hello.c和hello.def所在目錄)
cl /c hello.c
3.4 鏈接hello.obj,生成hello.dll,hello.lib兩個文件.
link /def:hello.def /dll hello.obj
4.測試dll函數(shù).
4.1 編寫測試代碼 test.c
extern int say_hello(char* name);
int main(int argc,char** argv)
{
say_hello( "robbie ");
return 0;
}
4.2 編譯測試代碼test.c
cl /c test.c
4.3 鏈接test.obj和 hello.lib,生成可執(zhí)行文件test.exe
link test.obj hello.lib
4.4 運行test.exe,屏幕輸出:
hello robbie
至此,一個dll構造完畢.
//第一種方法_靜態(tài)調用法
1:在DLL的cpp中將函數(shù)聲明為導出,你已經完成了第一步.
2: 在exe的cpp中加上一句 #pragma comment(lib, "你生成的dll的lib文件") 生成dll后會有一個xxx.lib的文件,保存到exe的目錄中.
3:聲明一種類型,在exe的cpp中聲明上面的函數(shù)類型.
4:調用函數(shù)
//第二種方法動態(tài)調用法
1: 在exe的cpp中使用LoadLibary()把我生成的dll載入.
2: 使用typedef int __stdcall (*pfunc) (const char *, const char *, cstring, int) 定義一個函數(shù)類型.
3: pfunc funcaddr = GetProcAddrress() 通過GetProcAddress()獲取函數(shù)的地址.
4: 調用 函數(shù)
注意:
你寫的代碼有點小問題,在導出函數(shù)的前面先加上 extern "C" ,這樣才能保證dll中的函數(shù)名是GenStarPic,否則導出函數(shù)的名字會變成一堆亂碼,你需要借助LordPe或者depends等工具查看函數(shù)名.