利用vs2010制作C语言 dll文件,并在其它程序中调用该dll文件

一、为什么需要dll

代码复用是提高软件开发 效率的重要途径。一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架, 如ATL、MFC等,它们都以源代码的形式发布。由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”。“白盒复用”的缺点 比较多,总结起来有4点。

  1. 暴露了源代码;
  2. 容易与程序员的“普通”代码发生命名冲突;
  3. 多份拷贝,造成存储浪费;
  4. 更新功能模块比较困难。

实际上,以上4点概括起来就是“暴露的源代码”造成“代码严重耦合”。为了弥补这些不足,就提出了“二进制级别”的代码复用。使用二进制级别的代码复用一定程度上隐藏了源代码,对于缓解代码耦合现象起到了一定的作用。这样的复用被称为“黑盒复用”。

在Windows操作系 统中有两种可执行文件,其后缀名分别为.exe和.dll。它们的区别在于,.exe文件可被独立的装载于内存中运行;.dll文件却不能,它只能被其它 进程调用。然而无论什么格式,它们都是二进制文件。上面说到的“二进制级别”的代码复用,可以使用.dll来实现。

与白盒复用相 比,.dll很大程度上弥补了上述4大缺陷。.dll是二进制文件,因此隐藏了源代码;如果采用“显式调用”(后边将会提到),一般不会发生命名冲突;由 于.dll是动态链接到应用程序中去的,它并不会在链接生成程序时被原原本本拷贝进去;.dll文件相对独立的存在,因此更新功能模块是可行的。

说明:实现“黑盒复用”的途径不只dll一种,静态链接库甚至更高级的COM组件都是。本文只对dll进行讨论。

二、C语言制作dll文件

1. 启动vs2010,

2.创建dll工程

  a. 文件 -> 新建 ->  项目 -> win32控制台应用程序 —>

  b. 输入工程名称, 比如 dll, 点击确定

  c. 点击下一步, 在“应用程序设置界面” 勾选 dll 和空项目, 点击完成按钮

  d. 视图 -> 解决方案资源管理器 ->右键点击头文件, 添加->新建项,这里用dll.h,

  e. 右键点击"源文件",添加->新建项,这里我们添加dll.c,到此dll工程搭建完毕.

3. dll.h

#ifndef AXLPLUGIN_H
#define AXLPLUGIN_H
/**/
#ifdef _WINDOWS
#define DLL_DECLARE __declspec(dllexport)
#else
#define DLL_DECLARE
#endif
DLL_DECLARE int Min(int a, int b);
/* 把所有的函数声明都列在这里 */
#endif  

4. dll.c

#include "dll.h"
#include <stdio.h>
/*根据需要添加相应的头文件*/
DLL_DECLARE int Min(int a, int b)
{
    if (a >= b)
        return b;
    else
        return a;
}
/* 把所有声明的函数都在这里实现*/  

5. 生成dll lib 文件

点击build -> build dll

这样,dll 和 lib 文件就生成了。

5. dll文件的使用

试验证明dll.dll文件要和dll.lib以及dll.h文件一起使用

三 ,在程序中加载dll

  1. 新建一个测试用的"Win32应用程序"
  2. 操作:

    a.文件->新建->项目->Win32控制台应用程序.

   b.输入工程名称,这里我们用test_dll,点击确定按钮.

c.点击下一步,在"应用程序设置界面设置"控制台应用程序"和"空项目",点击完成按钮.

d.将工程dll目录里的dll.h/dll.dll/dll.lib拷贝到工程test_dll目录里。

e.视图->解决方案资源管理器,右键点击"头文件",添加->新建项,这里咱们用dll.h

右键点击"源文件",添加->新建项,这里我们添加test_dll.c,右键点击“资源文件”,

添加->"现有项",选择dll.lib,到此test_dll工程搭建完毕.

  3.  编辑test_dll.c文件,内容如下

#include "dll.h"
#include <stdio.h>
int main()
{
    printf("Min(2, 4) = %d\n", Min(2, 4));
    printf("Min(5, 2) = %d\n", Min(5, 2));
    return 0;
}  

四,dll和test_dll工程的目录结构

../test_dll/
│  test_dll.sdf
│  test_dll.sln
│  test_dll_dir.txt
├─Debug
│      test_dll.exe
│      test_dll.ilk
│      test_dll.pdb
├─ipch
│  └─test_dll-eb5063a1
│          test_dll-c06c53e7.ipch
└─test_dll
    │  dll.dll
    │  dll.h
    │  dll.lib
    │  test_dll.c
    │  test_dll.vcxproj
    │  test_dll.vcxproj.filters
    │  test_dll.vcxproj.user
    └─Debug
            cl.command.1.tlog
            CL.read.1.tlog
            CL.write.1.tlog
            link-cvtres.read.1.tlog
            link-cvtres.write.1.tlog
            link.3004-cvtres.read.1.tlog
            link.3004-cvtres.write.1.tlog
            link.3004.read.1.tlog
            link.3004.write.1.tlog
            link.command.1.tlog
            link.read.1.tlog
            link.write.1.tlog
            mt.command.1.tlog
            mt.read.1.tlog
            mt.write.1.tlog
            rc.command.1.tlog
            rc.read.1.tlog
            rc.write.1.tlog
            test_dll.Build.CppClean.log
            test_dll.exe.embed.manifest
            test_dll.exe.embed.manifest.res
            test_dll.exe.intermediate.manifest
            test_dll.lastbuildstate
            test_dll.log
            test_dll.obj
            test_dll_manifest.rc
            vc100.idb
            vc100.pdb
时间: 2024-07-30 13:48:38

利用vs2010制作C语言 dll文件,并在其它程序中调用该dll文件的相关文章

Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)

文章目录:                   1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Application 有何妙用: 5. MJ0011 关于 Native Application 的文章整理: 6. 互联网上其他关于 Native Application 的文章整理: 7. 小结: 1. 引子: 其实在好久以前就看了 MJ0011 翻译的那个<Native 应用程序详细>系列的文

SOE 中调用第三方dll

一.简介 在利用soe实现server的扩展的时候,有些时候,需要调用第三方的dll库.官网中给出了明确的说明,soe中是可以添加第三方的dll文件,但是一直没有测试.按照官方的步骤应该是一个非常的简单的步骤.官方的步骤,参考连接如下:点击我 但是在实际测试的过程中发现并不如官方的步骤如此简单.其中涉及一个非常重要的东西,就是强签名. 二.强签名密钥 在新建soe模板工程后,可以在工程目录下看到一个名为myKey.snk 文件.snk一言以蔽之,为了防止自己的应用程序被篡改,就是给自己的应用程序

java中调用kettle转换文件

java中调用kettle转换文件 通过命令行也可以调用,然后java中调用命令行代码也可以:这样没有和java代码逻辑无缝集成.本文说明kettle5.1中如果通过其他API和java代码无缝集成:网上大多数资料都是低版本的,在kettle5.x中已经不能运行. 1.       需要哪些jar文件 以kettle开头的是必须,上图最下面三个也要:红色框中的两个是我测试转换用到的,分别是生成UUID和文件. 要是少了jar文件,运行程序一定报错,大家根据错误到kettle安装目录LIB中找相应

Spring MVC程序中得到静态资源文件css,js,图片文件的路径问题总结

上一篇 | 下一篇 Spring MVC程序中得到静态资源文件css,js,图片 文件的路径 用 Spring MVC 开发应用程序,对于初学者有一个很头疼的问题,那就是程序数据都已经查询出来了,但界面样式仍然十分丑陋,加载不了 css,js,图片等资源文件.当你在浏览器上直接输入某个css文件的路径时,直接得到404错误,而路径肯定没有错,其原因就在于在web.xml 中配置了类似如下的 spring servlet: 程序代码 <servlet>    <servlet-name&g

在.net中调用Delphi dll的Pchar转换

Pchar是非托管代码,要在.net中调用Delphi dll中的功能,请使用MarshalAs属性告知.net调用PInvoke去转换.net中标准的string类型.如果Delphi dll是Delphi2007以前的版本编译的,则Pchar是Ansi类型:如果Delphi dll是Delphi2009以后的版本编译的,则Pchar是Unicode类型.请看以下实例. Ansi类型: [DllImport("my.dll")] [return: MarshalAs(Unmanage

C# 获取文件路径,读取项目中某程序集下文件

获取文件路径 ------------------------------------------------------------------------- winform获取文件路径: string str1 =Process.GetCurrentProcess().MainModule.FileName;//获得当前执行的exe的文件名.string str2=Environment.CurrentDirectory;//获取和设置当前目录的完全限定路径.string str3=Dire

VC++和Matlab混合编程(在VC中调用将.m文件生成的DLL)

这是师兄们在实际项目中用到的关于VC++和MATLAB混合编程的实例.最近自己在瞎鼓捣,也就研究了下这块,本想写篇博文,但网上这块的资料还算是比较多,写的也比较具体,想着不重复劳动,因此我也就不写了. //提取节点信息 mxArray *csd_path; mxArray *save_path; mxArray *mat_path=mxCreateCellMatrix(NULL,NULL);//mxCreateCellMatrix:创建二维单位矩阵 mxArray *analog=mxCreat

在SQL Server 2008中调用.net,dll

T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可以在SQL Server 2008中扩展C#程序来完成循环等过程式的查询,或者其他SQL不便实现的功能.这个随笔中将介绍在SQL Server中扩展C#程序实现正则表达式的替换功能. 新建一个类库程序命名为Regex,打开Visual Studio 2008,点击File,点击New,点击Project,在弹出的New Project对话框中选择Class Libra

通过词法分析实现的指出C程序中包含的头文件

在阅读有些程序的源码时,很希望能够马上弄清楚源码中到底包含了哪些头文件,以确定是否需要为了特殊的函数而手动加入#include.借助flex的词法分析实现了这一功能,本质上就是对正则表达式的匹配.注意这个程序不能够处理包含嵌套的情形(也就是说不能指出包含文件包含了哪些文件),感兴趣的可以通过栈来实现.源码如下: 1 /*源代码:ic.l*/ 2 3 /*定义文件预处理指令文件名起始状态*/ 4 %x IFILE 5 6 %% 7 ^"#"[ \t]*include[ \t]*[\&qu