用VS制作简单dll的过程

今天尝试了一把做dll。之所以去做dll是因为之前发现firefox从gecko2.0开始支持JS-Ctypes,利用js-Ctypes可以直接使用javascript脚本调用dll二进制文件,与firefox进行交互。这极大的方便了制作插件及创建基于gecko的应用程序。下面我描述一下今天制作dll的过程,和一些感受。
创建dll的过程其实并不难,但是MDN上明确表示对于C++制作的dll支持的不好,因此要使用的dll必须是C语言规范的,于是我就打算用VC6.0来做这个dll。做了整整一下午,不断的查阅资料,终于还是没能做出来。后来我改用VS2010来试了一下,发现成功了。编写最简单的dll过程如下:
首先用VS2010新建一个win32项目,然后选择dll、空项目。
在建立的空项目里面添加三个文件:lib.h、lib.c和lib.def。然后build一下就可以在debug目录下生成一个dll文件和一个lib文件

也可以在空项目中添加这三个文件:lib.h、lib.cpp和lib.def。同样build一下就可以得到一个dll文件和一个lib文件,这是C++方式,前面一种是C的方式
这个dll实现了一个add函数。下面贴出上述六个文件的代码。

C的方式

lib.h文件的内容如下:
#ifndef LIB_H
#define LIB_H
int __declspec(dllexport)add(int x, int y);
#endif 
lib.c文件的内容如下:
#include "lib.h"
int add(int x, int y)
{
return x + y;
}
lib.def的内容如下:
LIBRARY dTest
EXPORTS
add @ 1 
要测试生成的这个dll,可以新建一个空的控制台应用程序,然后其main.c如下(注意这是C方式,因此main.c而不是main.cpp):另外,采用这种静态调用的方式需要将生成的dll文件和lib文件复制到main.c相同目录下。
#include <stdio.h>
#pragma comment(lib,"dTest.lib")
int __declspec(dllimport) add(int x,int y);
void main()
{
int a=add(2,6);
printf("%d\n",a);
} 

C++的方式

所对应的三个文件及测试函数,首先是lib.h,内容如下:
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport)add(int x, int y);
#endif
注意与C方式的区别,这里有extern "C"

lib.cpp文件内容如下:

#include "lib.h"
int add(int x, int y)
{
return x + y;
}
.c文件和.cpp文件是函数的具体实现,与dll的创建过程没什么关系。 

lib.def文件内容:

LIBRARY dllTest
EXPORTS
add @ 1
与C方式的没有什么区别
C与C++方式的不同在于函数声明处,不管是头文件还是实现文件,只要是在声明函数,这两种方式就不一样。
下面是c++方式的测试代码,同样也是新建一个控制台应用程序空项目,main.cpp文件内容为:
#include <stdio.h>
#pragma comment(lib,"dllTest.lib")
extern "C" int __declspec(dllimport) add(int x,int y);
void main()
{
int a=add(2,6);
printf("%d\n",a);
}
与C方式的不同也就在于有没有extern "C" 。

总结一下在做dll的过程中最重要的是要搞清楚谁对应谁,只要是在c++里面调用到C的函数就必须加上extern "C" 虽然没有尝试过用C++来测试C的dll,但想必也是这样,有兴趣的可以一试。

dll其实有很多类型的,我只是去研究了最简单的dll的实现方式,其他类型的dll我遇到的都忽略了,下面给出几个我在查找资料过程中遇到的感觉比较好的资料,想研究dll的可以去参考参考。

参考资料

http://wenwen.soso.com/z/q118568910.htm
http://www.blogjava.net/wxb_nudt/archive/2007/09/11/144371.html
http://ks.pconline.com.cn/?q=VC%2B%2B%B6%AF%CC%AC%C1%B4%BD%D3%BF%E2%28DLL%29%B1%E0%B3%CC%C9%EE%C8%EB%C7%B3%B3%F6&Submit3=%BF%EC%CB%D1
http://blog.csdn.net/btwsmile/article/details/6676802

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值