① 如何正確創建DLL和使用DLL
一、DLL中導出類、函數、對象
1. 創建一個空的Win32 Dynamic-Link Library項目Test
2. 在項目中添加一個Test.h頭文件,該文件的內容如下://導出類class __declspec(dllexport) CTest
...{
...};//導出函數__declspec(dllexport) void FuncTest();//導出對象extern __declspec(dllexport) CTest ObjTest;這段代碼中通過__declspec(dllexport)導出了類CTest、函數FuncTest和對象ObjTest。在.cpp文件中實現上面的聲明與類的定義後,經編譯就可以生成一個.dll和.lib文件了。
二、靜態載入DLL
1. 新建一個Win32 項目。
2. 將上面編譯生成的.lib文件復制到,該項目下。
3. 在項目中添加一個Test.h(通過該文件實現對DLL的靜態載入),該.h文件的內容主要是從DLL的.h文件中復制過來。具體內容如下:
#pragma comment(lib, "test.lib")//導入類class __declspec(dllimport) CTest
......{
...};//導入函數__declspec(dllimport) void FuncTest();//導入對象extern __declspec(dllimport) CTest ObjTest;這個.h文件與dll的.h的不同就是,在開頭加了#pragma comment(lib, "test.lib"),以及類、函數、對象前面的__declspec(dllexport)變成了__declspec(dllimport) 。通過這些修改就可以告訴編譯器,這個.h文件中定義的類、聲明的函數和對象 都是從test.dll中導入的。在項目中完成對這些類、函數、對象的調用代碼後,就可以將其編譯成可執行文件。將生成的可執行為文件、以及上面生成的.dll文件復制到同一個文件夾中就可以正常運行這個可執行文件。
三、動態載入DLL
LIBRARY TestImpEXPORTSObjTestFuncTest在完成.def文件後,重新編譯dll。重新編譯dll後就可以對該Dll進行動態調用了,調用過程的代碼如下:
typedef void (*HFUNC)()
HINSTANCE hDLL = LoadLibrary("Test.dll"); //載入DLLif(hDLL)
...{
HFUNC hFun = (HFUNC)GetProcAddress(hDLL, "FuncTest"); //獲得Dll中FuncTest函數的指針。
if (hFun)hFun(); //執行函數FuncTestelse
... //沒有找到函數FuncTest}else
...{
//載入失敗} 上面的代碼實現的對DLL中函數的動態調用,在代碼中通過LoadLibrary將DLL載入到內存中,然後GetProcAddress獲得指定函數所在的內存地址(即該函數的函數指針),獲得指向這個函數的指針後就可以對它進行調用了。
對於DLL中對象的動態調用過程基本上是一樣的,先將DLL載入到內存,然後通過GetProcAddress獲得對象所在的地址。
從上面可以看出,DLL的動態調用過程就是將DLL載入到內存,然後通過GetProcAddress獲得DLL中指定對象或函數在該內存中的地址,通過該地址就可以對函數或對象進行調用。由於在C++中沒有類的對象,也沒有類指針一說,所以是無法動態使用DLL中的類的。
② 如何建立DLL文件
DLL文件不是建立的,是安裝系統的時候自動裝入的,如果你的系統丟了了必要的DLL文件的話可以到網上直接下載,所有DLL文件都可以找到的。
望採納,謝謝。
③ 如何正確簡單的創建dll
方法:
1、自己把相關的文件從在正常工作的安裝目錄中,打到這件文件,然後復制到出現問題軟體的目錄下。復製成功後,還要進行注冊。
2、打開騰訊電腦管家,在工具箱裡面有一個電腦診所功能,可以進行修復文件缺失的問題。
3、實在不行就只有重裝系統了
④ 用VS 如何由源代碼生成DLL文件
1:創建DLL工程
文件->新建->項目->visual c++->win32->win32控制台應用程序(win32項目也可以)
填寫項目名稱MyDLL->確定->下一步->DLL(附加選項 對空項目打鉤)->完成。
到這里DLL工程就創建完畢了,下面新建兩個文件MyDLL.cpp和MyDLL.h。
MyDLL.cpp內容如下:
testMyDLL.h內容如下
#pragmaonce
extern"C"_declspec(dllexport)intAdd(int&a,int&b);
現在可以編譯通過了,但是程序運行就報錯,還需要將MyDLL.dll復制到當前項目生成的可執行文件所在的目錄。(這一點非常重要)
這里需要注意testMyDLL.cpp文件中調用lib的這句話:
#pragmacomment(lib,"..\debug\MyDLL.lib")
這里需要指明lib所在的文件夾,當然我們也可以在生成dll的MyDLL工程中,指定lib和dll文件的輸出路徑,直接到testMyDLL工程下。
注意:如果只有dll文件,那麼必須在程序裡面調用LoadLibrary()函數才能使用,如果有lib文件,那麼有兩種方式可以馬上進行調用
⑤ 怎樣創建一個為.dll的文件
右擊桌面空白處,點「新建」--「文本文件」--輸入內容,將.txt擴展名改為.dll即可
⑥ 如何注冊dll文件
1、首先需要在一定途徑獲取algorithm.dll文件,例如搜索引擎查詢並下載algorithm.dll。
⑦ 如何在文件夾下建立個dll文件,使得文件夾無法打開
通過DLL文件來使得文件夾無法打開 這是不可能的
但是可以通過建立DLL文件來限制別人使用你的軟體(也就是不能打開程式)
方法:
在軟體的安裝文件夾下(根目錄)新建一個文本文檔(空白的文本文檔)重命名為 ws2_32.dll 即可(注意下劃線"_"和擴展名"dll")
這樣軟體就不能打開了
要想打開軟體 就把ws2_32.dll文件刪除即可
⑧ 如何新建DLL文件
DLL文件即動態鏈接庫文件,是一種可執行文件,它允許程序共享執行特殊任務所必需的代碼和其他資源。Windows提供的DLL文件中包含了允許基於Windows的程序在Windows環境下操作的許多函數和資源。
DLL多數情況下是帶有DLL擴展名的文件,但也可能是EXE或其他擴展名。它們向運行於Windows操作系統下的程序提供代碼、數據或函數。程序可根據DLL文件中的指令打開、啟用、查詢、禁用和關閉驅動程序。
DLL的全稱是Dynamic Link Library, 中文叫做「動態鏈接文件」。在Windows操作系統中, DLL對於程序執行是非常重要的, 因為程序在執行的時候, 必須鏈接到DLL文件, 才能夠正確地運行。而有些DLL文件可以被許多程序共用。因此, 程序設計人員可以利用DLL文件, 使程序不至於太過巨大。但是當安裝的程序越來越多, DLL文件也就會越來越多, 如果當你刪除程序的時候, 沒有用的DLL文件沒有被刪除的話, 久而久之就造成系統的負擔了。
DLL不是獨立運行的程序,它是某個程序的一個部分,它只能由所屬的程序調用。用戶不能,也不需要打開它。
說到DLL文件的編寫,自然是VC最厲害了,因為微軟就是VC編寫的,也可以用VB編寫
下面這段代碼是摘寫的,如果要學的還是到網上搜索比較好。
標 題: 關於VC中的DLL的編程[1]
這一節介紹Non-MFC DLLs的編寫方法。下面是一個通用的
寫法:
BOOL APIENTRY DllMain(HANDLE hMole,DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch( ul_reason_for_call ) {
case DLL_PROCESS_ATTACH:
.......
case DLL_THREAD_ATTACH:
.......
case DLL_THREAD_DETACH:
.......
case DLL_PROCESS_DETACH:
.......
}
return TRUE;
}
每一個DLL必須有一個入口點,這就象我們用C編寫的應用程序一樣,
必須有一個WINMAIN函數一樣。
在這個示例中,DllMain是一個預設的入口函數,你不需要編寫自己
的DLL入口函數,並用linker的命令行的參數開關/ENTRY聲明。用這個缺
省的入口函數就能使動態連接庫被調用時得到正確的初始化,當然了,你
不要在初始化的時候填寫使系統崩潰的代碼了。
參數中,hMoudle是動態庫被調用時所傳遞來的一個指向自己的句柄
(實際上,它是指向_DGROUP段的一個選擇符)
ul_reason_for_call是一個說明動態庫被調原因的標志。當進程或線程
裝入或卸載動態連接庫的時候,操作系統調用入口函數,並說明動態連接庫
被調用的原因。它所有的可能值為:
DLL_PROCESS_ATTACH: 進程被調用
DLL_THREAD_ATTACH: 線程被調用
DLL_PROCESS_DETACH: 進程被停止
DLL_THREAD_DETACH: 線程被停止
lpReserved是一個被系統所保留的參數。
入口函數已經寫了,盛下的也不難,你可以在文件中加入你所想要輸
出的函數或變數或c++類或、或、或、?好象差部多了。Look here!現在就
要加入一個新的輸出函數了:
void _declspec(dllexport) JustSoSo()
{
MessageBox(NULL,"It's so easy!","Hahaha......",MB_OK);
}
要輸出一個類也可以,如下:
class _declspec(dllexport) Easy
{
//add your class definition...
};
各位一定注意到在輸出函數或類是我用到_declspec(dllexport),
這是VC提供的一個關鍵字,用它可在動態連接庫中輸出一個數據、
一個函數或一個類。用這個關鍵字可省你不少事,你不用在.DEF文件
中說明我要輸出這個類、那個函數的。
Ok!各位照著上面的例子試著敲敲看,Just so easy!
先說到這了
發信人: dragon (龍), 信區: VC
標 題: 關於VC中的DLL的編程[2]
前面講到Non-MFC DLL的編法,現在講講調用DLL的方法。對DLL的
調用分為兩種,一種是顯式的調用,一種是隱式的調用。
所謂顯式的調用,是指在應用程序中用LoadLibrary或MFC提供的
AfxLoadLibrary顯式的將自己所做的動態連接庫調近來,動態連接庫
的文件名即是上兩函數的參數,再用GetProcAddress()獲取想要引入
的函數。自此,你就可以象使用如同本應用程序自定義的函數一樣來
調用此引入函數了。在應用程序退出之前,應該用FreeLibrary或
MFC提供的AfxLoadLibrary釋放動態連接庫。
隱式的調用則需要把產生動態連接庫時產生的.LIB文件加入到應
用程序的工程中,想使用DLL中的函數時,只須說明以下,如下:說明
上篇的輸出函數void JustSoSo();
隱式調用不需要調用LoadLibrary()和FreeLibrary().
由此看來,隱式說明調用的方法比較簡單,但DLL改變後,應用程序
須從新編譯。並且,所有所調用的DLL在應用程序載入的同時被載入到內
存中,但應用程序調用的DLL比較多時,裝入的過程十分慢。隱式的調用
則在應用程序不知道所要裝入的DLL或隱式調用不成功,此時,允許用戶
指定所要載入的動態連接庫,比較靈活
發信人: dragon (龍), 信區: VC
標 題: 關於VC中的DLL的編程[3]
Regular DLL能夠被所有支持DLL技術的語言所編寫的應用程序
所調用。在這種動態連接庫中,它必須有一個從CWinApp繼承下來的
類,DllMain函數被MFC所提供,不用自己顯式的寫出來。下面是一個
例子:
// MyRegularDll.h:main header file for the MYREGULARDLL DLL
#include "resource.h" // main symbols
class CMyRegularDllApp : public CWinApp
{
public:
CMyRegularDllApp();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyRegularDllApp)
//}}AFX_VIRTUAL
//{{AFX_MSG(CMyRegularDllApp)
// NOTE - the ClassWizard will add and
// remove member functions here.
// DO NOT EDIT what you see in these blocks
// of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//MyRegularDll.cpp:Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "MyRegularDll.h"
// Note!
//
// If this DLL is dynamically linked against the MFC
// DLLs, any functions exported from this DLL which
// call into MFC must have the AFX_MANAGE_STATE macro
// added at the very beginning of the function.
//
// For example:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticMoleState());
// // normal function body here
// }
//
// It is very important that this macro appear in each
// function, prior to any calls into MFC. This means that
// it must appear as the first statement within the
// function, even before any object variable declarations
// as their constructors may generate calls into the MFC
// DLL.
BEGIN_MESSAGE_MAP(CMyRegularDllApp, CWinApp)
//{{AFX_MSG_MAP(CMyRegularDllApp)
// NOTE - the ClassWizard will add
// and remove mapping macros here.
// DO NOT EDIT what you see in these blocks
END_MESSAGE_MAP()
////////////////////////////////////////////////////////////
// CMyRegularDllApp construction
CMyRegularDllApp::CMyRegularDllApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
以上是AppWizard產生的含有主要代碼的兩個文件,各位可從中
看出和Non-MFC Dlls的區別。但要注意上面的AppWizard的提醒啊。
發信人: dragon (龍), 信區: VC
標 題: 關於VC中的DLL的編程[4]
發信站: 飲水思源站 (Thu Mar 25 00:46:22 1999) , 站內信件
這次要講的是最後一種動態連接庫:Extension Dlls.再次說明,
Extension Dll只被用MFC類庫所編寫的應用程序所調用.在這種動態
連接庫中,你可以從MFC繼承你所想要的、更適於你自己用的類,並
把它提供給你的應用程序。你也可隨意的給你的應用程序提供MFC或
MFC繼承類的對象指針。
Extension DLLs 和Regular DLLs不一樣,它沒有一個從CWinApp
繼承而來的類的對象,所以,你必須為自己DllMain函數添加初始化
代碼和結束代碼.如下:
#include "stdafx.h"
#include
static AFX_EXTENSION_MODULE PROJNAMEDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("PROJNAME.DLL Initializing!\n");
// Extension DLL one-time initialization
AfxInitExtensionMole(PROJNAMEDLL,
hInstance);
// Insert this DLL into the resource chain
new CDynLinkLibrary(Dll3DLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("PROJNAME.DLL Terminating!\n");
}
return 1; // ok
}
在上面代碼中AfxInitExtensionMoudle函數捕捉此動態庫模塊
用.
在初始化的時NEW一個CDynLinkLibrary對象的目的在於:它
能是Extension DLL想應用程序輸出CRuntimeClass對象或資源.
如果此動態連接庫被顯式的調用,還必須在DLL_PROCESS_DETACH
選擇項的執行代碼上調用AfxTermEXtensonMole,這保證了當調
用進程與動態連接庫分離是正確清理內存中的動態庫模塊。如果是
隱式的被調用,則此步不是必須的了。
⑨ dll文件怎麼使用
Dell向運行於Windows操作系統下的程序提供代碼、數據或函數。程序可根據DLL文件中的指令打開、啟用、查詢、禁用和關閉驅動程序。
打開一個程序的安裝目錄,在這裡面可以看到一些dll的一些文件。如果在它的上面雙擊的話會在它的旁邊提示:如果是想要查看它可以下載安裝一個叫exescope的自定義應用軟體的工具。
右邊有一個更多,點擊一下「更多」,可以看到它的默認安裝路徑,如果不需要更改的話,它就會默認的安裝到c盤的程序文件夾中。
點擊安裝之後,在它彈出的面板中有一個自動漢化的說明,我們點擊「已閱」。接著在它的安裝過程中會出現一個安裝類型,可以根據需要選擇一個安裝類型,這里就選擇它默認的「典型安裝」,然後點擊:下一步。當安裝到漢化的安裝目錄的時候它會提示,如果是不想把它安裝到默認位置的話,可以在點擊瀏覽選擇一個安裝的文件位置。
⑩ 如何創建標準的dll
建立DLL文件:
1.在VC6中新建MFC Appwizard(dll)工程。
2.添加一個新類(CMyClass)。
3.在類的頭文件里加一句話,用來發布:Class _declspec(dllexport) CMyClass。
4.編譯後在Debug里找.dll和.lib文件。
5.調用方法:把這兩個文件考入要調用的工程根目錄下,頭文件里引用:
#include "MyClass.h"
#pragma comment(lib,"Dll.lib")
試試吧,沒人指導是挺難的,我也是新手,以後多交流。