关于lib 和 dll 个人学习总结

来源:互联网 发布:李泽楷双胞胎残障 知乎 编辑:程序博客网 时间:2024/05/17 04:05

首先,我先推荐一篇个人觉得比较好的文章:

http://www.cppblog.com/amazon/archive/2009/09/04/95318.html

关于导出函数和导出类,其实都差不多,导出函数将 __declspec()的声明放在前面,而类放在中间,即 

extern "C"  DLLAPI void  Print(char *p);       //后面会看到DLLAPI 的定义
extern "C" class DLLAPI  MyClass{

 ///关于MyClass 的声明

};


写了一个测试的dll,工程名为 Dll001 .添加头文件,添加cpp, 如取名为 Mytestdll

头文件如下:

#include "stdafx.h"#include "stdio.h"#ifndef MY_DLL_H#define MY_DLL_H#if DLL001_EXPORTS//此处的DLL001_EXPORTS为个人工程所定义,在项目->Dll001属性->配置属性->C/C++->预处理器中可以查到#define DLLAPI __declspec(dllexport)#else#define DLLAPI __declspec(dllimport)#endifextern "C"  DLLAPI void  Print(char *p);//extern "C" 防止C++对函数根据自己的规则重命名。如果被C++重命名过后,使用动态加载会出现找不到函数的情况,因为名字已经被编译器内部根据自己的规则修改而不能正确匹配函数名。建议不管那么多,都加上#endif
cpp如下:
#include "stdafx.h"#include "Mytestdll.h"extern "C" void Print(char *p){printf(p);}

然后生成解决方案。分别使用隐式连接和显示连接。隐式连接需要 Dll001.lib   Dll001.dll   和 Mytestdll.h。

将Dll001.lib   Dll001.dll   和 Mytestdll.h 拷贝到测试项目目录下面。测试项目代码如下:

// Test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "Mytestdll.h"#pragma comment(lib,"Dll001.lib")int main(){    Print("is right?");    return 0;}


</pre><pre>

显示连接(只需要Dll001.dll ,载入dll的函数LoadLibrary 和查询需要使用的函数地址的函数GetProcAddress ,不需要头文件和lib文件):

// Test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "windows.h"typedef void(*pFunc)(char *);int main(){pFunc p;HINSTANCE hinst = LoadLibraryA("Dll001.dll");p = (pFunc)GetProcAddress(hinst, "Print");p("is right?");return 0;}


得到的结果都是一样。


一般将dll放在工程目录下面,系统查找dll的顺序是

(1)包含EXE文件的目录
(2)工程目录
(3)Windows系统目录
(4)Windows目录
(5)列在Path环境变量中的一系列目录

0 0
原创粉丝点击