vc動態鏈接庫編程
❶ 如何使用VC++動態鏈接庫中的結構體
Win32 Dynamic-Link Library方式創建Non-MFC DLL動態鏈接庫
每一個DLL必須有一個入口點,這就象我們用C編寫的應用程序一樣,必須有一個WINMAIN函數一樣。在Non-MFC DLL中DllMain是一個預設的入口函數,你不需要編寫自己的DLL入口函數,用這個預設的入口函數就能使動態鏈接庫被調用時得到正確的初始化。如果應用程序的DLL需要分配額外的內存或資源時,或者說需要對每個進程或線程初始化和清除操作時,需要在相應的DLL工程的.CPP文件中對DllMain()函數按照下面的格式書寫。
❷ VC++如何在一個動態鏈接庫中調用其他動態鏈接庫
以VC6為例,分為靜態調用及動態調用,靜態調用需要提供Lib及頭文件,較為簡單,而動態調用使用loadlibrary、FreeLibrary 載入及釋放動態庫,聲明函數形參列表及變數,再取得函數地址送給此變數,變數名可以當函數名調用使用。
HINSTANCE m_hLib;
//聲明形參列表
typedef LONG ( *pfn_Init) (形參);
//聲明變數
pfn_Init fnInit;
LONG LoadLib()
{
m_hLib = NULL;
m_hLib = LoadLibrary(_T("XXX.dll"));
if (m_hLib == NULL)
{
cout <<"LoadLibrary XXX.dll Failed" << endl;
return -1;
}
return 0;
}
//取函數地址
fnInit = (pfn_Init) GetProcAddress (m_hLib, ("Init"));
//調用
fnInit ();
void FreeLib()
{
if (m_hLib != NULL)
{
FreeLibrary(m_hLib);
}
}
您手裡至少得有個頭文件,否則就只能用工具查看導出函數列表了。
❸ 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的內部函數。
❹ 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文件
VC編寫dll文件
1、VC++->New->Project->Win32 Dynamic_Link Library;
2、選擇創建一個空工程;
首先DLL需要一個頭文件,所以新建一個CC++ Header File
這個頭文件中必須包含想要輸出的變數和函數,頭文件必須定義用於輸出的任何符號和數據結構。
例如 :
證明調用動態鏈接庫里的 Add函數成功。
❻ 介紹靜態鏈接庫和動態鏈接庫的區別,及在VC++6.0中的建立和使用
動態鏈接庫更類似於一種服務,而靜態鏈接庫就是一種把一些編譯好的代碼存放起來的倉庫。
動態鏈接庫還可以包含動態鏈接庫或者靜態鏈接庫,而靜態鏈接庫中則不能使用別的庫代碼動態鏈接庫只有當程序執行到調用庫函數的時候才會找到庫函數代碼並執行,而靜態鏈接庫就是直接被包含進編譯好的EXE文件,
編程中經常使用靜態鏈接庫,比如VC的很多代碼都是以LIB形勢提供的!