因为一直没搞清楚如何使用dll ,所以在网上留下记录,以待学习,以后边学边改进本文吧。 目前我使用的是VS.net2003,过程如下: 一,首先描述一下如何生成一个dll 1. "file" -> "new" -> "project" ->"Win32" -> "Win32 Console Project" ->"name"里填上新工程名字MyDll -> "Application Settings" -> 选择 Dll -> "finish" 至此新建完成。 2. 然后在 MyDll.cpp里添加如下代码: #define DLLIM #ifdef DLLIM #define DLLDIAO _declspec(dllexport) #else #define DLLDIAO _declspec(dllimport) #endif /////我只测试了一个两个数相加的函数 和一个整型数, extern DLLDIAO int add (int i ,int j) { return i + j; } extern DLLDIAO int mm = 12; ok编译程序。 二,其他程序如何调用本dll 方法很多 我尽可能的写出更多,以后学习发现新方法会补充。 方法一: 1).就拿生成的一个 Win32 console程序吧,命名为MyDllExe, 2).将生成的MyDll.dll复制到 \MyDllExe\Debug \目录下,将MyDll.lib复制到 \MyDllExe\目录下 3).打开MyDllExe.cpp文件 代码如下: #include "stdafx.h" #pragma comment (lib,"dlltest1.lib") #ifdef DLLIM #define DLLDIAO _declspec(dllexport) #else #define DLLDIAO _declspec(dllimport) #endif extern DLLDIAO int add(int i ,int j); extern DLLDIAO int mm; int _tmain(int argc, _TCHAR* argv[]) { int i = 122,j = 23,k; k = add(i,j); printf("k = %d,mm = %d\n",k,mm); return 0; }
编译运行即可 发现OK! 方法二: 就是方法一的一点点改进, 1)注释掉 // #pragma comment (lib,"dlltest1.lib") 2)在MyDllExe工程中在上面menu中选择 "Project" -> "add exiting item..." ->找到MyDll.lib -> "open"即可。 方法三: 在方法一上作修改 1)注释掉 // #pragma comment (lib,"dlltest1.lib") 2)"Project"-> "MyDllExe Properties”-> "Linker" ->"Command Line" -> "Additional Options:" -> 添加"MyDll.lib"-> 应用确定 编译OK。 方法四: 跟方法一有很大的区别。 dll生成 1)."file" -> "new" -> "project" ->"Win32" -> "Win32 Console Project" ->"name"里填上新工程名字MyDll -> "Application Settings" -> 选择 Dll -> "finish" 至此新建完成。 2).打开MyDll.cpp文件 代码如下: #include "stdafx.h" #define DLLIM #include "MyDll.h"
DLLDIAO int add (int i ,int j) { return i + j; } // DLLDIAO int mm = 12; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) {
return TRUE; } 3)新建一个头文件命名为 "MyDll.h" 代码添加如下: #pragma once #ifdef DLLIM #define DLLDIAO __declspec(dllexport) #else #define DLLDIAO __declspec(dllimport) #endif extern "C" { DLLDIAO int add (int i ,int j); } //说明: extern ”C“ 函数好像是必须的,注释掉是不行的,原因我知道后会再来注明。 dll调用 4)就拿生成的一个 Win32 console程序吧,命名为MyDllExe, 5)将生成的MyDll.dll复制到 \MyDllExe\Debug \目录下,//不需要.lib文件 6).打开MyDllExe.cpp文件代码如下: #include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { typedef int (*MYPROC)(int,int); HINSTANCE hinstLib; MYPROC ProcAdd; hinstLib = LoadLibrary("dlltest1.dll"); if (hinstLib == NULL) return -1;   rocAdd = (MYPROC) GetProcAddress(hinstLib, "add"); if( !ProcAdd ){ FreeLibrary(hinstLib); return -1; } int i = 122,j = 23,k; k = (ProcAdd)(i,j); printf("k = %d,\n",k); FreeLibrary(hinstLib); return 0; }
附:zz 问:.def文件是什么?做dll时,不用def文件可以吗? 回答:在VC++中,如果生成DLL可以不使用.def文件。你只需要在VC++的函数定义前要加__declspec(dllexport)修饰就可以了。但是使用__declspec(dllexport)和使用.def文件是有区别的。如果你的DLL是提供给VC++用户使用的,你只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果你的DLL是供VB、PB、Delphi用户使用的,那么会产生一个小麻烦。因为VC+ +对于__declspec(dllexport)声明的函数会进行名称转换 如下面的函数: __declspec(dllexport) int __stdcall IsWinNT()
会转换为IsWinNT@0,这样你在VB中必须这样声明: Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long
@的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。 EXPORTS后面的数可以不给,系统会自动分配一个数。对于VB、PB、Delphi用户,通常使用按名称进行调用的方式,这个数关系不大,但是对于使用.lib链接的VC程序来说,不是按名称进行调用,而是按照这个数进行调用的,所以最好给出。 |