當前位置:首頁 » 編程軟體 » vc動態鏈接庫dll編程

vc動態鏈接庫dll編程

發布時間: 2022-07-08 14:34:48

『壹』 VC6.0如何創建以及調用動態鏈接庫實例詳解

動態鏈接庫:dll不必被包含在最終的EXE中,EXE文件執行時可以動態地引用和卸載DLL文件。
同時,靜態鏈接庫中不能再包含其他的動態鏈接庫或靜態庫,而動態鏈接庫中可以包含其他的動態或靜態庫。
VC++支持的DLL:
DLL的編制與具體的編程語言及編譯器無關,動態鏈接庫隨處可見,VC++支持三種DLL:非MFC動態庫、MFC規則DLL和MFC擴展DLL。DLL導出函數(或變數、類)可供應用程序調用;DLL內部函數只能在DLL程序內使用,應用程序無法調用它們。
導出函數的聲明方式:
一種在函數聲明類型和函數名之間加上「_declspec(dllexport)」。
另外一種採用模塊定義(.def)文件聲明,需要在庫工程中添加模塊文件,格式如下:
LIBRARY 庫工程名稱
EXPORTS 導出函數名
DLL的調用方式:
一種靜態調用,由編譯系統完成對DLL的載入和應用程序結束時DLL的卸載。
另外一種動態調用,由編程者用API函數載入和卸載DLL(DLL載入—DLL函數地址獲取—DLL釋放)方式。
所有庫工程編譯時必須Release方式:
Build—set active configuration—選擇庫工程的release方式
一、 函數----創建動態鏈接庫(MFC規則DLL)
1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL //取名為MFC_dll
2. def文件中添加:函數名(Add_new)
3. h文件中添加:外部函數聲明//求和函數,函數名為Add_new
extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b);
4. cpp文件中添加: 外部函數實現
extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b)
{
return a+b;
}
5. build--set active configuration--win32 release--ok
6. 生成
7. 根目錄下release文件夾中dll,lib與根目錄下h文件即為所需
二、 函數----調用動態鏈接庫(把MFC_dll.dll和MFC_dll.lib拷到工程所在目錄)
//靜態調用(.h可以寫到.cpp文件中)
1. new--projects--win32 console application--an empty project
2. 添加h文件:(test.h)
#pragma comment(lib,"MFC_dll.lib") //告訴編譯器DLL相對應的lib文件所在路徑和文件名
extern "C" _declspec(dllimport) int _stdcall Add_new(int a,int b);//聲明導入函數
3. 添加cpp文件:(main.cpp)
#include "test.h"
int main()
{
cout<<Add_new(10,3);
return 0;
}
//動態調用
#include <stdio.h>
#include <windows.h>
typedef int (* lpAddFun)(int ,int);//定義一個與Add_new函數接受參數類型和返回值均相同的函數指針類型
int main()
{
HINSTANCE hDll;//句柄
lpAddFun addFun;//函數指針
hDll=LoadLibrary("dllTest.dll");//動態載入DLL模塊句柄
if(hDll)
{
addFun=(lpAddFun) GetProcAddress(hDll,"Add_new");//得到所載入DLL模塊中函數的地址
if(addFun)
{
int result=addFun(2,3);
printf("%d",result); } FreeLibrary(hDll);//釋放已經載入的DLL模塊
}
return 0;
}
三、 變數----創建動態鏈接庫(非MFC DLL)
1. new---projects---win32 dynamic-link library----an empty project(Sample)
2. 添加sample.h
#ifndef SAMPLE_H
#define SAMPLE_H
extern int dllGlobalVar;
#endif
3. 添加 sample.cpp
#include "sample.h"
#include <windows.h>
int dllGlobalVar;
bool APIENTRY DllMain(HANDLE hMole,DWORD ul_reason_for_call,LPVOID lpReserved)
//windows在載入DLL時,需要一個入口函數,就如同控制台或DOS程序需要main函數、win32程序需要winmain函數一樣。所以引入一個不做任何操作的預設DllMain的函數版本。是DLL的內部函數。

『貳』 使用vc++6.0 如何編寫dll

資源簡介一、前言 自從微軟推出16位的Windows操作系統起,此後每種版本的Windows操作系統都非常依賴於動態鏈接庫(DLL)中的函數和數據,實際上Windows操作系統中幾乎所有的內容都由DLL以一種或另外一種形式代表著,例如顯示的字體和圖標存儲在GDI DLL中、顯示Windows桌面和處理用戶的輸入所需要的代碼被存儲在一個User DLL中、Windows編程所需要的大量的API函數也被包含在Kernel DLL中。 在Windows操作系統中使用DLL有很多優點,最主要的一點是多個應用程序、甚至是不同語言編寫的應用程序可以共享一個DLL文件,真正實現了資源"共享",大大縮小了應用程序的執行代碼,更加有效的利用了內存;使用DLL的另一個優點是DLL文件作為一個單獨的程序模塊,封裝性、獨立性好,在軟體需要升級的時候,開發人員只需要修改相應的DLL文件就可以了,而且,當DLL中的函數改變後,只要不是參數的改變,程序代碼並不需要重新編譯。這在編程時十分有用,大大提高了軟體開發和維護的效率。 既然DLL那麼重要,所以搞清楚什麼是DLL、如何在Windows操作系統中開發使用DLL是程序開發人員不得不解決的一個問題。本文針對這些問題,通過一個簡單的例子,即在一個DLL中實現比較最大、最小整數這兩個簡單函數,全面地解析了在Visual C++編譯環境下編程實現DLL的過程,文章中所用到的程序代碼在Windows98系統、Visual C++6.0編譯環境下通過。 二、DLL的概念 DLL是建立在客戶/伺服器通信的概念上,包含若干函數、類或資源的庫文件,函數和數據被存儲在一個DLL(伺服器)上並由一個或多個客戶導出而使用,這些客戶可以是應用程序或者是其它的DLL。DLL庫不同於靜態庫,在靜態庫情況下,函數和數據被編譯進一個二進制文件(通常擴展名為*.LIB),Visual C++的編譯器在處理程序代碼時將從靜態庫中恢復這些函數和數據並把他們和應用程序中的其他模塊組合在一起生成可執行文件。這個過程稱為"靜態鏈接",此時因為應用程序所需的全部內容都是從庫中復制了出來,所以靜態庫本身並不需要與可執行文件一起發行。 在動態庫的情況下,有兩個文件,一個是引入庫(.LIB)文件,一個是DLL文件,引入庫文件包含被DLL導出的函數的名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數和數據並不復制到可執行文件中,因此在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的內存地址,這樣當一個或多個應用程序運行是再把程序代碼和被調用的函數代碼鏈接起來,從而節省了內存資源。從上面的說明可以看出,DLL和.LIB文件必須隨應用程序一起發行,否則應用程序將會產生錯誤。 微軟的Visual C++支持三種DLL,它們分別是Non-MFC Dll(非MFC動態庫)、Regular Dll(常規DLL)、Extension Dll(擴展DLL)。Non-MFC DLL: 指的是不用MFC的類庫結構,直接用c語言寫的DLL,其導出的函數是標準的C介面,能被非MFC或MFC編寫的應用程序所調用。Regular DLL: 和下述的Extension Dlls一樣,是用MFC類庫編寫的,它的一個明顯的特點是在源文件里有一個繼承CWinApp的類(注意:此類DLL雖然從CWinApp派生,但沒有消息循環),被導出的函數是C函數、C++類或者C++成員函數(注意不要把術語C++類與MFC的微軟基礎C++類相混淆),調用常規DLL的應用程序不必是MFC應用程序,只要是能調用類C函數的應用程序就可以,它們可以是在Visual C++、Dephi、Visual Basic、Borland C等編譯環境下利用DLL開發應用程序。 常規DLL又可細分成靜態鏈接到MFC和動態鏈接到MFC上的,這兩種常規DLL的區別將在下面介紹。與常規DLL相比,使用擴展DLL用於導出增強MFC基礎類的函數或子類,用這種類型的動態鏈接庫,可以用來輸出一個從MFC所繼承下來的類。 擴展DLL:是使用MFC的動態鏈接版本所創建的,並且它只被用MFC類庫所編寫的應用程序所調用。例如你已經創建了一個從MFC的CtoolBar類的派生類用於創建一個新的工具欄,為了導出這個類,你必須把它放到一個MFC擴展的DLL中。擴展DLL 和常規DLL不一樣,它沒有一個從CWinApp繼承而來的類的對象,所以,開發人員必須在DLL中的DllMain函數添加初始化代碼和結束代碼。MID 驅動分析之一: TP下載通過IBM存儲解決方案應對信息爆炸問題Qt 游戲開發必備!【下載】Android圖書及教學視頻您的IT安全來自System X伺服器Win8 Winrt中高性能處理多條件語句

『叄』 關於《VC++動態鏈接庫(DLL)編程深入淺出》中的一點疑問

這個錯誤一般就是包含頭文件的問題,如果你是mFC的東西,需要在每個cpp文件中加入(afx.h)很多時候,都容易漏,然後你在做Dll的時候,就可以包含MFC工程文件,還有不行的話,可以嘗試生成RElease 版本

『肆』 如何在VC程序中加入一個動態鏈接庫(dll文件)

DLL是用什麼語言做的?
如果有.lib文件,將其加到工程中就可以使用其中的函數了.
如果沒有,那用LoadLibrary載入DLL到工程中.

『伍』 VC2010 C++ 如何編寫一個 簡單的DLL(動態鏈接庫) C++大牛 請進

下面示範一下用VS2010編寫純DLL,就是非ATL,MFC。


第一步:新建工程->選擇WIN32->WIN32 項目->選擇DLL,並且把下面的 空項目 勾選上


第二步:再新建一個.cpp文件 裡面編寫你的Dll具體內容


第三步:編寫一個.def主要用來解決編碼問題


好了,這就基本上是完成了Dll編寫了。

如果說的太詳細了,我怕這頁面容不下額。

我以前寫過這方面的文章,你可以去參看一下:

鉤子編程(HOOK) 屏蔽所有按鍵滑鼠及系統功能鍵:http://blog.csdn.net/qingjun/article/details/25861615

『陸』 VC++調用動態鏈接庫DLL

typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);是定義函數指針類型,給類型名為MYFUNC,之後就可以用MYFUNC來定義函數指針youFuntionNameAlias,
youFuntionNameAlias = (MYFUNC)GetProcAddress(hDllInst,"youFuntionName");就是給函數指針賦值。就像定義結構一樣,先定義結構類型,之後就可以使用結構類型頂一個結構變數,然後就可以對結構變數賦值。

『柒』 寫出vc動態連接庫的方法之一

用VC++6.0製作動態鏈接庫的步驟 :
動態鏈接庫(dll)是包含共享函數庫的二進制文件,可以被多個應用程序同時使用。建立應用程序的可執行文件時,不必將DLL連接到應用程序中,而是在運行時動態裝載DLL,裝載時DLL被映射到調用進程的地址空間中。通常我們在調用DLL時所需的DLL文件必須位於以下三個目錄之一:
(1)Windows的系統目錄:\windows\system;
(2)DOS 中path所指出的任何目錄;
(3)程序所在的目錄;
本設計用的是第三種。
3.2.1動態鏈接庫(DLL)結構
1.實現文件(.cpp文件為例)
包含DLL入口點處理函數和導出函數,以及被導出函數調用的函數的代碼。
格式如下:
#include "stdafx.h" //加入所使用的相關頭文件
#include "oil.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
BOOL APIENTRY DllMain( HANDLE hMole,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
以下為各函數:(被調用函數和導出函數之一)
void WINAPI sub(double a, double b, double c)
註:DLLMain 表示在Windows中DLL開始執行的地方。
2.模塊定義文件(.DEF)是由一個或多個用於描述DLL屬性的模塊語句組成的文本文件,每個.DEF文件至少必須包含以下模塊定義語句:
第一個語句必須是LIBRARY語句,指出DLL的名字。
EXPORTS 語句列出被導出函數的名字。
可以使用DESCRIPTION語句描述DLL的用途(此句可選)。
格式如下:
EXPORTS HanL @1
3.函數原型聲明文件(.h文件為例)
以以下格式寫入:
#ifdef _cplusplus
extern"c"
{
#endif //_cplusplus
double WINAPI sub( double a ,double b ,double c ); //函數原型
#ifdef _cplusplus
}
#endif //_cplusplus
注意:
(1) c語言中須在調用函數前面聲明或定義該函數,調用才能成功。在c中,函數原型通常和函數定義很相似,只不過原型以分號結尾。在c中原型僅僅用於類型檢驗。
(2) 建立函數原型:.h文件。.h文件可包含c或c++模塊中,正如能從ifdef 看出的一樣,若代碼在c文件中,則不使用extern「c」語句,但作為一個c++文件進行編譯,則需要使用。
(3)使用CPP文件(C++),則須防止C++引起的過多的名稱修飾,為避免C++的名稱修改,可使用extern「c」定義。extern」c」是C程序提供外部連接的方式,在C++代碼中提供Visual Basic程序的鏈接,須使用extern」c」鏈接聲明,這樣定義的文件就可以使得其函數能被Visual Basic訪問
4.2.2創建oil.dll
1.創建oil.dll的工程,啟動VC++6.0按以下步驟生成DLL工程:
在菜單中選擇File\New\Project
在工程列表中選擇Win32 Dynamic-Link Library
在Project Name中輸入工程名: oil
單擊Location右邊按鈕,選擇 「F:\李帆設計」目錄
單擊OK完成,至此已創建了oil.dll的工程文件
2.創建oil.def文件
在菜單中選擇File\New\Text File。輸入以下代碼後保存文件名"oil.def" //指出DLL的名字oil,鏈接器將這個名字放到DLL導入庫中
LIBRARY oil //定義導出函數suanfa()為例
EXPORTS HanL @1
3.創建oil.h
在菜單中選擇File\New\C++ Head File項
輸入代碼後保存文件名" oil.h"
4.填寫oil.cpp文件,輸入代碼後保存文件名「oil.cpp」。
5.編譯DLL文件 ---- 從Build菜單中選擇Build oil.DLL,產生oil.DLL文件,以後就可以調用了。

熱點內容
視易鋒雲系統如何架設輔助伺服器 發布:2025-02-09 06:47:08 瀏覽:768
mysql備份腳本shell 發布:2025-02-09 06:46:33 瀏覽:14
騰訊雲伺服器怎樣調整解析度 發布:2025-02-09 06:46:30 瀏覽:368
php上一個頁面 發布:2025-02-09 06:41:25 瀏覽:488
改裝配置後不想重啟怎麼辦 發布:2025-02-09 06:36:40 瀏覽:445
演算法復雜度定義 發布:2025-02-09 06:30:46 瀏覽:585
昵圖源碼介面 發布:2025-02-09 06:30:37 瀏覽:724
微信怎麼沒有支付密碼 發布:2025-02-09 06:29:52 瀏覽:33
mplayer編譯版 發布:2025-02-09 06:29:13 瀏覽:762
免費網盤源碼 發布:2025-02-09 06:29:07 瀏覽:5