`

Visual studio2008编写dll

阅读更多

一、动态链接库(DLL)介绍

 

1. Non-MFC DLL:

指的是不用MFC的类库结构,直接用C语言写的DLL,其输出的函数一

般用的是标准C接口,并能被非MFC或MFC编写的应用程序所调用。

2. Regular DLL:

和下述的Extension Dlls一样,是用MFC类库编写的。明显的特点是

在源文件里有一个继承CWinApp的类。其又可细分成静态连接到MFC和动态连接到MFC上

的。但静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。

动态链接库和MFC静态链接:这种DLL在链接过程中会将使用到得MFC类库复制一份到最终的DLL文件中

最终生成的DLL比较庞大且加载时不是很方便,但它可以在没有MFC类库DLL文件的机器上使用

动态链接库使用共享MFC DLL:这种DLL不会将用到的MFC类库复制到最终生成的DLL中,因此最终的DLL比较小,加载也很方便,但在没有MFC类库DLL文件的机器上无法使用,必须有MFC类库的支持

 

3.Extension DLL:

MFC扩展DLL,可以实现从MFC所继承下来的类的重新利用,可以导出C++类以及MFC派生类,使用这种DLL必须有MFC类库的支持,也就是说它只被用MFC类库所编写的应用程序所调用。

 

二、编写Non-MFC dll

1、打开visual studio 2008

2、file->new->Project…

3 、在弹出的“New project”窗口中,prject types子窗口中选择 visual C++,Templates子窗口中选择Win32 Project,然后在name处输入 pow,location处输入F:\vc2008dll,点击“OK”

4、在弹出的“win32 application wizard - pow”窗口中,点击“Next”;

5、在弹出的“win32 application wizard - pow”窗口中,Application type选项中选择DLL,Additional options选项中选择Export symbols,点击“Finish”

工程会自动生成对应的文件和代码,生成了pow.h和pow.cpp

 

6、在pow.h的文件末尾添加pow函数的声明

POW_API int pow(const int& x,const int& y);

//POW_API是自动生成的一个宏,它的作用是表明该函数是导入还是导出的

7、在Pow.cpp中添加pow函数的实现

POW_API int pow(const int& x,const int& y)

{

int z=1;

for(int i=0;i<y;i++)

z*=x;

return z;

}

编译后会在debug目录里生成pow.dll和pow.lib两个文件,其中pow.lib是动态链接库进行静态链接时使用

visual studio 2008默认的编译dll的调用约定是cdecl,若用其它程序调用该dll请注意调用约定,否则某些dll中的函数会抛出异常。修改vs2008的调用约定-project-->properties-->configuration properties-->C/C++-->advanced-->calling convention-->选择对应的方式!

 

 

vs2008 <wbr>项目的调试发布模式配置

三、静态调用Non-MFCdll

方式一

1、创建一个Win32 Console Application工程,工程名为test1。

2、将pow.h和pow.dll和pow.lib拷贝到F:\c++\test1\test1目录下,把Pow.dll拷贝一份放到F:\c++\test1\Debug目录里防止直接运行exe时找不到dll。

3、将pow.h添加到test1工程中

4、修改test.Cpp文件如下:

#include "stdafx.h"

#include <iostream>

#include "pow.h"

#pragma comment(lib,"pow.h")

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

char a;

 

cout <<pow(3,3);

cin>>a;

return 0;

}

 

方式二

1、创建一个Win32 Console Application工程,工程名为test2。

2、将pow.dll和pow.lib拷贝到F:\c++\test2\test2目录下,把Pow.dll拷贝一份放到F:\c++\test2\Debug目录下防止直接运行exe时找不到dll。

3、新建一个头文件命名为test2.h

其文件如下:

#pragma comment(lib,"pow.lib")

//不使用pragma comment,而直接在工程的Setting->Link页的Object/Moduls栏填入notmfcdll.lib也可

__declspec(dllexport) int pow(const int& x,const int& y);

 

4、修改test.Cpp文件如下:

 

#include "stdafx.h"

#include "test2.h"

 

int _tmain(int argc, _TCHAR* argv[])

{

 

int a=0;

a=pow(3,6);

printf("%d",a);

char b;

b=getchar();

return 0;

}

三、动态调用Non-MFCdll

 

1、创建一个Win32 Console Application工程,工程名为test3。

2、将pow.dll拷贝到F:\c++\test3\test3目录下,把Pow.dll拷贝一份放到F:\c++\test\Debug目录下防止直接运行exe时找不到dll。

3、修改test3.Cpp文件如下:

#include <stdafx.h>

#include <stdio.h>

#include <windows.h>

 

typedef int (*MYPROC)( int, int);

 

 

int _tmain(int argc, _TCHAR* argv[])

{

int a=0;

char b;

HINSTANCE hInst;

MYPROC myproc;

//加载动态函数库

hInst = LoadLibrary(L"pow.dll");

 

if( hInst != NULL)

{

myproc = (MYPROC)GetProcAddress( hInst,"pow" );//得到DLL中的函数的指针

a=myproc(2,3);

printf("%d",a);

FreeLibrary(hInst);//卸载DLL

 

}

else

{

a=1;

printf("%d",a);

}

b=getchar();

 

 

return 0;

}

 

按F5运行程序,抛出异常,调试发现GetProcAddress函数返回为空。

因为visual studio 2008编译的dll导出函数是c++格式,而显示调用GetProcAddress函数是按照C格式查找函数,所以需修改pow.h文件,将导出函数包含在extern "C"{}中,如下:

extern "C"

{

POW_API int pow(int x, int y);

}

重新编译动态函数,将生成的pow.dll重新拷贝到调用dll的程序中就可以了!

 

导出函数包含在extern "C"{}中,使用静态调用方式二的方法调用该dll时格式也许调整如下:

修改头文件test2.h 即可,其文件如下:

#pragma comment(lib,"pow.lib")

 

__declspec(dllimport) int pow(const int& x,const int& y);

分享到:
评论

相关推荐

    Visual Studio C++ DLL编写及调用实例

    Visual Studio 2017平台下,C++编写MathLibray dll,并在MathClient调用,内含sln工程文件。

    Intel Visual Fortran+Visual Studio 2008入门

    Intel Visual Fortran+Visual Studio 2008入门 本书主要介绍了Intel Visual Fortran v11与Visual Studio 2008环境的入门知识,旨在帮助读者快速掌握Intel Visual Fortran编译器的使用和Visual Studio 2008环境的...

    visual studio DLL工程的开发

    本文将详细探讨"visual studio DLL工程的开发"这一主题,旨在帮助初学者理解如何在Visual Studio中创建和管理动态链接库(DLL)项目。 首先,DLL是一种在Windows操作系统中实现代码共享的技术。它可以包含可执行...

    提高Visual Studio 2008 运行速度

    - `HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0`(9.0 表示 VS2008 版本号) - 查找 `AutoToolboxPopulate` 键,如果没有则新建一个 DWORD 类型的值并命名为 `AutoToolboxPopulate`。 - 将 `...

    VC助手 支持visual studio2008

    "VC助手 支持visual studio2008"是一个针对微软Visual Studio 2008开发环境的辅助工具,旨在提升开发者的效率和代码质量。这个工具可能包含了各种功能,如代码自动完成、错误检查、调试增强、项目管理优化等。下面...

    visual studio编写DLL,python调用

    2. 编写DLL函数: 在DLL项目中,你可以添加新的源文件,如`myFunctions.cpp`,并在其中定义将被外部程序调用的函数。例如: ```cpp #include "myFunctions.h" extern "C" __declspec(dllexport) int add(int a, ...

    Visual Studio 2008 图标

    6. **Microsoft.VisualStudio.QualityTools.LoadTestPackageUI.dll**: 与负载测试包的用户界面相关,允许开发者模拟用户负载来测试应用程序的性能和稳定性。 7. **Microsoft.VisualStudio.QualityTools.Tips....

    DLL.rar_dll_dll 2008_visual studio dll

    《深入理解DLL:Visual Studio 2008下的动态链接库实践》 DLL(Dynamic Link Library)是Windows操作系统中的一个重要概念,它是一种可共享代码和数据的库文件,允许多个程序同时使用同一份代码,从而节省内存并...

    Visual Studio 2005 制作DLL文件2.txt

    ### Visual Studio 2005 制作DLL文件详解 #### 概述 本文将详细介绍如何使用Visual Studio 2005创建不同类型的DLL(动态链接库)文件,并重点讲解与MFC(Microsoft Foundation Classes)类库相关的DLL开发。根据...

    Visual Studio 2005 制作DLL文件3

    创建好项目后,接下来就是编写DLL的核心代码了。通常,DLL文件由头文件(.h)和实现文件(.cpp)组成。 1. **创建头文件**: - 右键点击解决方案资源管理器中的项目名称,选择“添加”-&gt;“新建项”。 - 选择“C++...

    Microsoft Visual Studio 2008 卸载工具

    在开发环境中,Microsoft Visual Studio 2008(VS2008)是一个重要的集成开发环境(IDE),它为程序员提供了编写、调试和测试多种应用程序的能力。然而,由于VS2008包含许多组件和插件,完全卸载可能变得复杂,尤其...

    Visual Studio 2005 制作DLL文件1

    ### Visual Studio 2005 制作DLL文件详解 #### 概述 在软件开发过程中,动态链接库(Dynamic Link Library,简称DLL)是非常重要的组成部分。它允许开发者将经常被多个程序使用的功能封装到单独的文件中,从而提高...

    Visual C++ Redistributable Packages for Visual Studio(64位资源)

    Visual Studio不仅用于编写C++代码,也广泛用于Python和其他语言的开发。开发者在VS中编译C++项目时,如果选择了特定的编译选项或使用了特定的库,那么最终的可执行文件可能需要这个redistributable包才能在没有安装...

    atlmfc for visual studio 2008

    ATLMFC是Microsoft开发的一个库,它为Visual Studio 2008提供了一套完整的MFC(Microsoft Foundation Classes)实现,MFC是一个C++类库,用于简化Windows应用程序的开发。ATLMFC将ATL(Active Template Library)与...

    在Visual Studio中创建WPS外接程序插件

    在Visual Studio中创建WPS外接程序插件是一项技术含量较高的任务,涉及到多个步骤和关键技术。下面将详细讲解这个过程。 首先,理解WPS外接程序的本质是扩展WPS Office的功能,通过编程接口(API)与WPS进行交互,...

    visual studio 2013 运行库(Redistributable) X86 X64

    - 安装Visual Studio 2013运行库后,可以运行那些使用Visual C++ 2013编译器编译的程序,不论它们是使用MFC、ATL还是纯C++编写。 - 对于跨版本的兼容性,虽然新版本的运行库通常包含旧版本的功能,但为了保证最佳...

    Visual assistX 支持Visual Studio 2022

    Visual AssistX与之结合,进一步优化了代码编写过程,尤其在处理大量代码或进行复杂调试时,效率显著提高。 然而,安装过程中可能会遇到一些问题。如描述中提到的,若在尝试运行Visual AssistX的安装程序.exe时出现...

    Visual Studio 2022扩展开发入门1

    5): error MSB4062: 未能从程序集 C:\Users\Zmrbak\.nuget\packages\microsoft.vssdk.buildtools\15.9.3032\tools\VSSDK\Microsoft.VisualStudio.Sdk.BuildTasks.15.0.dll 加载任务“CompareBuildTaskVersion”。...

    在 VisualStudio 2017环境下使用Python

    完成新建项目后,用户可以编写 Python 代码,并使用 Visual Studio 2017 的调试工具来测试和调试 Python 代码。 三、Visual Studio 2017 中的 Python 开发工具 Visual Studio 2017 提供了强大的 Python 开发工具,...

    mysql-for-visualstudio-1.2.5-noinstall.zip,mysql.data.dll下载

    标题中的“mysql-for-visualstudio-1.2.5-noinstall.zip”指的是MySQL for Visual Studio的一个特定版本,这是MySQL公司为Visual Studio开发者提供的一个集成开发环境插件。这个插件使得C#程序员能够在Visual Studio...

Global site tag (gtag.js) - Google Analytics