Vc编写和调用Dll的简单例子

可供VC调用的QT编写的界面DLL方法 一般直接编写的QT动态库是无法被Windows下的VC6.0等调用的。 如下步骤   第一步:必须要在QT界面库源码下包含qtwinmigrate的源码包库,网上可下载到。   第二步:在QT的proc文件中添加以下的一行 include,路径自行修改   第三步:在需要到处的动态库DLL的cpp文件中包含如下有关qtwinmigrate的头文件   第四步:基于前 阅读详情

用Visual Sudio 6.0新建一个工程,工程的类型选择Win32 Dynamic-Link Library.工程名任意

,其他所有选项取默认
新建一个cpp文件,代码如下:


 
      如果工程类型是Win32 Console Application,那么在编译链接以后,会产生一个Debug目

录,并且里面有一个exe文件.
      这里我们的工程类型是Win32 Dynamic-Link Library,在编译链接以后,我们期望产生一

个Debug目录,并且里面有一个dll文件
    事实正是如此,我们可以用depends工具打开这个dll文件以查看它导出了什么函数depends

工具在Tools菜单下.实际上它是D:/Program Files/Microsoft Visual Studio/Common/Tools

下的一个文件.我们发现,这个dll没有导出任何东西.这是因为我们并没有说明我们要导出的东

西.在那个cpp里的函数并不是默认会被导出的.因为它们可能只是被我们要导出的函数的调用

的"内部函数".要导出一个函数,我们须要加上_declspec(dllexport),代码变为:
CODE:

 

    再链接一次,再查看该dll文件,发现有一个?add@@YAHHH@Z的函数.好像很怪,不过总算看到

东西了.
现在来测试一下这个dll
新建一个工程,类型选Win32 Console Application
新建一个cpp文件,代码如下

CODE:

 

     其中LoadLibrary都是Windows.h里面声明了的函数
编译链接,都没问题,运行.出错了!
     分析一下,程序怎么知道去哪里找我们的dll呢?
      它会按如下顺序搜索:当前可执行模块所在的目录,当前目录, Windows 系统目

录,Windows 目录。GetWindowsDirectory 函数检索此目录的路径,PATH 环境变量中列出的目

录。
所以我们要把我们的dll复制一份到这个测试工程的Debug目录之后,再运行
还是出错了!
    分析一下.我们刚才看到的是一个叫?add@@YAHHH@Z函数.那么,是不是这个原因呢?
把代码改为:

CODE:


     再编译链接,运行,成功了!那么怎么可以正确导出我们函数的名字呢?
     在生成dll的工程的代码加上extern "C",改为:

CODE:


编译链接后,查看dll文件,可以看到导出的函数变为add了,这时下面代码可以正常工作了
CODE:


     除了用_declspec(dllexport)指明要导出的函数,用extern "C"来纠正名字,我们还可用

一个.def文件来达到以上目的
       在dll工程里新建一个文件,类型选Text File,在名字要带上后缀.def.内容如下:

剩下的步骤就和之前一样了,用def文件还可以改变导出的函数的名字,例如

使得导出的函数叫myadd,而不是add.还可以给函数指定一个序号
如:

给myadd指定了一个序号
在测试工程里,可以根据序号取得我们的函数:

CODE:


以上讲的是运行时静态加载dll,下面讲启动时动态加载dll
产生dll的工程不用变,还是上面这个(名字是myadd,序号为4)
测试代码改为:
//先把DLL.lib文件复制到本工程目录里


CODE:

 

 

#pragma comment(lib,"DLL.lib")指明了用到哪个dll,其中DLL.lib可以在Debug找到.我们也

要把DLL.lib复制到测试工程目录(不是Debug目录).我们也可以在工程属性里添加.方法是

Project--Settings--Link,在Object/libraries Modules最后加上 DLL.lib
extern int add(int ,int );指明了我们的add是一个外部函数,而不是在本文件定义的

      最后,强调一下,要把该复制的文件复制到正确的地方.当你产生的dll文件和我说的不一

致时,试一下选Build-Rebuild All

 

c++builder调用VCdll以及VC调用c++builder的dll 解析__cdecl,__fastcall, __stdcall 的不同:在函数调用过程中,会使用堆栈,这三个表示不同的堆栈调用方式释放方式。 比如说__cdecl,它是标准的c方法的堆栈调用方式,就是在函数调用时的参数压入堆栈是与函数的声明顺序相反的,其它两个可以看MSDN,不过这个对我们编程没有太大的作用 ------------------------------------------ 阅读详情

相关推荐

delphi调用vc写的dll的方法

1. 在VC中新建一个 DLL 工程。写如代码,如:extern "C"{  _declspec(dllexport) int getPPLength();  _declspec(dllexport) int npn(int m, int n);}int getPPLength(){  return 5* 12;}int npn(int m, int n) {    int sum; 

boqing的专栏 4451

VS2015项目中,MFC内存中调用DLL函数(VC6生成的示例DLL

本例主要讲一下,用VC6如何生成DLL,用工具WinHex取得DLL全部内容,VC2015项目加载内存中的DLL函数,并调用函数的示例。

2519

VC6.0中,创建、调用 dll

参考链接: 如何使用VC6.0创建DLLVC6.0创建调用win32 dll 1.使用 VC6.0 生成 DLL 新建项目 “Win32 Dynamic-Link Library”,输入项目名称,确定后选择 “A simple DLL project” 点击“完成”。   以下为cpp文件自动生成的代码: #include "stdafx.h" BOOL APIENT...

学习记录·好记性不如破键盘版——点滴、积累、进步 969

VC编写调用DLL简单例子

  用Visual Sudio 6.0新建一个工程,工程的类型选择Win32 Dynamic-Link Library.工程名任意   其他所有选项取默认 新建一个cpp文件,代码如下:   int add(int a ,int b) { return a+b; }            如果工程类型是Win32 Console Application,那...

简约不简单 469

vcdll编程实例

一个例子讲解dll编程 简单易懂

vpoet 997

VC++创建DLL工程最简单实例

VC++创建DLL工程最简单实例 1.文件-》新建 -》 选择 Win32 Dynamic-Link Library -》 工程名称输入 MyDLL -》确定 2.向导1 选择《一个可以导出某些符号的DLL工程》 -》 提示创建工程骨架 点击确定 3.清空MyDLL.cppMyDLL.h文件 4.修改MyDll.cpp内容如下: #include "stdafx.h" #incl

那是一阵风 1万+

VC++动态链接库编程之DLL典型实例

动态链接库DLL实现了库的共享,体现了代码重用的思想。我们可以把广泛的、具有共性的、能够多次被利用的函数类定义在库中。这样,在再次使用这些函数类的时候,就不再需要重新添加与这些函数类相关的代码。具有共性的问题大致有哪些呢?笔者归纳如下:   (1)通用的算法  图像处理、视频音频解码、压缩与解压缩、加密与解密通常采用某些特定的算法,这些算法较固定且在这类程序中往往经常被使用。  (2)纯资源

fxpopboy的博客 1242

Vc编写调用Dll简单例子 .

用Visual Sudio 6.0新建一个工程,工程的类型选择Win32 Dynamic-Link Library.工程名任意 ,其他所有选项取默认 新建一个cpp文件,代码如下: [cpp] view plaincopyprint? int add(int a ,int b)  {        return a+b;  }   int add(int

记录 积累 235

pb调用动态库一般声明

用pb调用VC编写的动态库,需要在PB中进行声明,声明格式:Function 函数名 (参数列表。。。) Library “动态库名.dll”例如调VC动态库dlla.dll中封装了如下函数:int Add(int a,int b);PB声明为:Function int Add(int a,int b)librarydlla.dll

daiafei 3613

C#与VC相互调用之C#调用VCDLL

介绍 每种语言都有其优势特点,复杂的项目一般需要2种及以上的语言,这样才能发挥每种语言的优势。这里就介绍一下C#如何调用VCDLL 项目创建 打开VS2010,因为设计到两个程序,这里先创建一个空的解决方案: 然后再来创建一个VCDLL项目: 选择Win32项目模板: 选择应用程序的类型为DLL: 这里不用勾选“导出符号”,稍后自己来写导出就行。点击完成后生成如下文件: dllma...

xinxin_2011的博客 4517

vc dll编译调用

关于VC中的DLL的编程[1]这一节介绍Non-MFC DLLs的编写方法。下面是一个通用的写法:BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch( ul_reason_for_call ) {case DLL_PROCESS_ATTACH:.......case DLL_

shiyiytt的专栏 2379

VC编写DLL几种方法的简介

VC编写DLL几种方法的简介

ffghggf的博客 4060

VC 调用 VB 的DLL

在stdafx.h文件中 #import "VB_ADO_DBConnect.dll" using namespace VB_ADO_DBConnect; 先编译一下,会得到2个

rundll64的专栏 1510

在C#.net中调用VC 6.0编写DLL文件

由于VC 6.0编写DLL没有自描述,所以无法像C#.net编写DLL一样直接引用调用,一般可以采用两种方法调用。一、注册成COM组件:用命令regsvr32 DllFilePath进行注册,然后引用到项目。二、一些非COM组件的DLL文件可以在程序中用如下格式,将其中需要调用的函数一个一个的引用声明出来。一些数据格式的对应见下表。基本格式:[DllImport("DllFilePath",.

JumpSpace 5477

VC调用C#的DLL

在工程编译时同步互操作注册生成文件。 在vs中C#项目,选择项目属性,打开属性配置页,生成页中选择"为com互操作注册"复选框,在编译时会同时生成 导入Webservices 引用-添加服务引用 高级 添加Web-输入地址-添加引用 添加成功 以上是在C#中引用WebServices,因为该DLL需引用Web 下面开始在C#中创建DLL的函数 创建一个C#工程,得到一个dll. using System; using System.Collections.Generic; using System

qq_42920868的博客 1028

VC编写DLL

1.用VC建立一个WIN32 DLL我们利用VC编写DLL有几种方法.如果用VC建立一个WIN32 DLL 工程.那这个工程就应该只导出C++的类或全局变量.全局函数.方法就是在CPP文件中编写你的代码,为每个需要导出的元素进行导出办法是增加如下语句:_declspec(dllexport)你当然可以把它定义成宏例如,如果是一个类STUDENT需要导出, 那么声明时应该是这样写

把握自己。 1688
上一篇: 对__declspec(dllexport)的理解
下一篇: typedef用法
lssxlh
博客等级 码龄18年 21粉丝 84原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值