vc6编译动态库dll

合集下载

VC_6中配置OpenGL开发环境

VC_6中配置OpenGL开发环境

VC 6中配置OpenGL开发环境2009-04-10 16:22这里,我习惯使用VC 6,就使用它作为开发OpenGL应用的IDE吧。

要在Windows下学习OpenGL,首先就是要配置开发环境,我在这里详细的说明整个配置过程,希望对初学的朋友有所帮助。

第一步:下载OpenGL库Windows环境下的GLUT下载地址:(大小约为150k)/resources/libraries/glut/glutdlls37beta.zip其实,也不是必须从这里下载,在你下载一些例子的时候,一般都会打包呆上OpenGL库的。

这里顺便介绍一下OpenGL吧:OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。

● 与C语言紧密结合。

OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。

如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。

● 强大的可移植性。

微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。

而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。

并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。

● 高性能的图形渲染。

OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。

总之,OpenGL是一个很NB的图形软件接口。

至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。

OpenGL官方网站(英文):第二步:OpenGL库配置文件加压缩下载的OpenGL库文件,上面那个下载下来可能没有我下面列举的文件多,可以到网上下载的,或者Email我,我给你发一份。

使用VC6编译 Curl和LibCurl+ssl+ssh2+zlib

使用VC6编译 Curl和LibCurl+ssl+ssh2+zlib

目录使用VC6编译Curl和LibCurl (2)编译Openssl (2)编译zlib (2)编译libssh2 (2)VC6 编译libssh2 (4)libssh2动态编译 (6)编译LibCurl (7)方法一: (7)方法二:使用Makefile.vc6编译 (12)编译Curl (13)小结 (15)使用VC6编译Curl和LibCurl 编译Openssl下载Openssl源码下载Perl一、cmd切换到openssl-1.0.2d,输入命令perl Configure VC-WIN32 no-asmms\do_msnmake -f ms\ntdll.mak(动态编译)nmake -f nt.mak (静态编译)编译zlibcd C:\curl\zlib-1.2.8nmake -f win32/Makefile.msc OBJA="inffast.obj"编译libssh2检测后发现libssh2没有编译,因为源码都没有下载。

最新版本下载地址:/download/libssh2-1.6.0.tar.gz解压打开C:\libssh2-1.6.0\win32\config.mk修改openssl和zli的路径。

这里使用OPENSSLINC=C:\openssl\include时编译错误!使用OPENSSLINC=C:\openssl\inc32 不出错。

下面的C:\openssl\out32dll改为C:\openssl\out32,生成的就是静态的文件。

使用VS2010的nmake /f Nmakefile生成成功:只是生成了libssh2.dll,没有库文件。

VC6 编译libssh2设置下头文件设置动态库编译出错:解决方法:打开 C:\libssh2-1.6.0\src\session.c写入代码,定义了宏,避免对其它版本的编译器造成影响。

// 解决VC 6 error C2065: 'socklen_t' : undeclared identifier#if defined(_MSC_VER) && (_MSC_VER == 1200)typedef int socklen_t;#endif////////////////编译成功!注意Win32 OpenSSL DLL Release 默认只生成dll文件,新建一个TextFile,名字随便,后缀名为def,重新编译就可以生成动态链接库的lib文件。

VC6_VC6.0编译常见错误第一部分语法错

VC6_VC6.0编译常见错误第一部分语法错

VC6.0编译常见错误第一部分语法错误1、变量没有区分大小写例如:变量X 与x 不同;2、关键字写错例如:void 写成了viod等,cout写成count等3、把英文符号写成了中文符号例如:常见的错误包括单引号、双引号、分号等4、混肴了“=”与“==”的区别5、复合语句没有使用{ }6、把“x>5 && x<9”写成“5<x<9”第二部分编译错误1.error C2001: newline in constant编号:C2001直译:在常量中出现了换行。

错误分析:(1)字符串常量、字符常量中是否有换行。

(2)在这句语句中,某个字符串常量的尾部是否漏掉了双引号。

(3)在这语句中,某个字符创常量中是否出现了双引号字符“"”,但是没有使用转义符“\"”。

(4)在这句语句中,某个字符常量的尾部是否漏掉了单引号。

(5)是否在某句语句的尾部,或语句的中间误输入了一个单引号或双引号。

2.error C2015: too many characters in constant编号:C2015直译:字符常量中的字符太多了。

错误分析:单引号表示字符型常量。

一般的,单引号中必须有,也只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待),如果单引号中的字符数多于4个,就会引发这个错误。

另外,如果语句中某个字符常量缺少右边的单引号,也会引发这个错误,例如:if (x == 'x || x == 'y') { … }值得注意的是,如果单引号中的字符数是2-4个,编译不报错,输出结果是这几个字母的ASC码作为一个整数(int,4B)整体看待的数字。

两个单引号之间不加任何内容会引发如下错误:error C2137: empty character constant。

3.error C2018: unknown character '0x##'编号:C2018直译:未知字符‘0x##’。

VC6.0文件后缀名解释

VC6.0文件后缀名解释

首先要介绍的是扩展名为dsw的文件类型, 这种类型的文件在VC中是级别最高的, 称为Workspace文件。在VC中, 应用程序是以Project的形式存在的, Project文件以.dsp扩展名, 在Workspace文件中可以包含多个Project, 由Workspace文件对它们进行统一的协调和管理。
.MAP:由LINK工具生成的一种文本文件,其中包含有被连接的程序的某些信息,例如程序中的组信息和公共符号信息等。执行文件的映像信息记录文件。
.MDP:旧版本的项目文件,相当于.dsp
.NCB:NCB是“No Compile Browser”的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成。无编译浏览文件。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。
与dsw类型的Workspace文件相配合的一个重要的文件类型是以opt为扩展名的文件, 这个文件中包含的是在Workspace文件中要用到的本地计算机的有关配置信息, 所以这个文件不能在不同的计算机上共享, 当我们打开一个Workspace文件时, 如果系统找不到需要的opt类型文件, 就会自动地创建一个与之配合的包含本地计算机信息的opt文件。
.HLP:Windows帮助文件。
.HM:在Help工程中,该文件定义了帮助文件与对话框、菜单或kshop生成的Help工程文件,用来控制Help文件的生成过程。
.HPG,生成帮助的文件的工程。
.ICO:图标资源文件。
.ILK:连接过程中生成的一种中间文件,只供LINK工具使用。
在应用程序中经常要使用一些位图、菜单之类的资源, VC中以rc为扩展名的文件称为资源文件, 其中包含了应用程序中用到的所有的windows资源, 要指出的一点是rc文件可以直接在VC集成环境中以可视化的方法进行编辑和修改。

PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe 是什么意思?

PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe 是什么意思?
单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以 FastCGI 来执行 PHP,建议选择 Non Thread Safe 版本。
再来看PHP的两种执行方式:ISAPI和FastCGI。
FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以 FastCGI(无论搭配 IIS 6 或 IIS 7)执行 PHP ,都建议下载、执行 non-thread safe 的 PHP (PHP 的二进位档有两种包装方式:msi 、zip ,请下载 zip 套件)。
一、如何选择 PHP5.3 的 VC9 版本和 VC6 版本
VC6 版本是使用 Visual Studio 6 编译器编译的,如果你的 PHP 是用 Apache 来架设的,那你就选择 VC6 版本。
VC9 版本是使用 Visual Studio 2008 编译器编译的,如果你的 PHP 是用 IIS 来架设的,那你就选择 VC9 版本。
VC6 版本是使用 Visual Studio 6 编译器编译的,如果你的 PHP 是用 Apache 来架设的,那你就选择 VC6 版本。
VC9 版本是使用 Visual Studio 2008 编译器编译的,如果你的 PHP 是用 IIS 来架设的,那你就选择 VC9 版本。
二、如何选择 PHP5.3 的 Thread Safe 和 Non Thread Safe 版本
先从字面意思上理解,Thread Safe 是线程安全,执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的 CGI 执行方式而耗尽系统资源。Non Thread Safe 是非线程安全,在执行时不进行线程(Thread)安全检查。

C++Builder6开发调试DLL步骤

C++Builder6开发调试DLL步骤

C++Builder6开发调试DLL步骤1、创建一个DLL工程点击主菜单File -> New -> Other….,选择New下面的DLL Wizard点击OK后,弹出工程选项:默认即可,点击OK,BCB会自动创建一个.bpf工程文件和一个.cpp。

文件生成以后最好先保存工程,点击“Save All”完成保存。

建议工程文件和CPP文件同名。

2、开发第一个DLL方法首先开发一个简单方法,功能是把传入的int数字加1后返回。

首先在#pragma argsused之前定义API方法:extern "C" __declspec(dllexport) __stdcall int addOne(int);然后编写方法实现:__declspec(dllexport) __stdcall int addOne(int Number){return Number +1;}3、调试DLLDLL工程不能直接运行,调试时需要指定宿主程序。

假定已经开发好了一个调用该动态链接库指定方法的exe程序。

点击菜单:Run -> Parameters在Local页指定exe程序的路径,以及传参。

点击OK保存。

之后就可以正常打断点运行工程进行调试。

4、发布DLL编译发布版本的DLL需要把用到的文件全部打进包里,所以修改编译选项。

进入菜单:Project -> Options…Compiler面板,点击“Release”Packages面板,去掉“Build with runtime packages”的勾选;Linker面板,去掉”Use dynamic RTL”的勾选。

然后再全量编译工程、Make,得到的dll即是发布版本,可以拿到任何环境使用。

做完上述设置后工程将无法Debug单步调试,如果需要单步调试,上述选项反向操作即可。

5、开发一个较复杂的DLL方法例如开发一个方法,功能是把一张PNG格式的图片转换为同路径同名的JPG格式图片。

如何用VC创建及调用DLL

如何用VC创建及调用DLL

如何用VC创建及调用DLL使用Visual C++(VC++)创建和调用动态链接库(DLL)可以提供一种模块化的方式来组织和重用代码。

本文将介绍如何使用VC++创建DLL,并在另一个VC++项目中调用该DLL。

创建DLL以下是使用VC++创建DLL的步骤:1.打开VC++,在“文件”菜单中选择“新建”->“项目”。

2. 在“新建项目”对话框中,选择“Win32控制台应用程序”。

点击“下一步”。

3.输入项目名称,并选择项目位置,点击“下一步”。

4.在“应用程序类型”对话框中,选择“DLL”并取消勾选“预编译头”。

点击“下一步”。

5.在“进入代码”对话框中,选择“空项目”。

点击“完成”。

6. 创建一个新的源文件,例如“MyDLL.cpp”。

7. 在“MyDLL.cpp”中,编写所需的函数并导出。

例如:```C++#include <Windows.h>// 导出的函数需要使用__declspec(dllexport)修饰extern "C" __declspec(dllexport) int AddNumbers(int a, int b) return a + b;```8. 在项目属性中,选择“链接器”->“高级”,将“入口点”设置为“DllMain”。

9.在“生成”菜单中选择“生成解决方案”,以生成DLL文件。

以下是在VC++项目中调用DLL的步骤:1.打开VC++,在“文件”菜单中选择“新建”->“项目”。

2. 在“新建项目”对话框中,选择“Win32控制台应用程序”。

点击“下一步”。

3.输入项目名称,并选择项目位置,点击“下一步”。

4.在“应用程序类型”对话框中,选择“控制台应用程序”并取消勾选“预编译头”。

点击“下一步”。

5.在“附加选项”对话框中,勾选“空项目”。

点击“完成”。

6.将之前生成的DLL文件复制到新项目的文件夹中。

7.在项目属性中,选择“C/C++”->“常规”,将“附加包含目录”设置为包含DLL文件的文件夹路径。

vc dll导出方法

vc dll导出方法

vc dll导出方法VC DLL导出方法在VC(Visual C++)中,DLL(Dynamic Link Library)是一种动态链接库,它可以包含多个可执行文件。

在使用VC开发过程中,经常需要将函数或变量导出为DLL,以供其他程序使用。

本文将介绍如何在VC中导出方法为DLL,并详细讲解相关的技术和注意事项。

一、什么是VC DLL导出方法?VC DLL导出方法是指在VC中将函数或变量导出为动态链接库的过程。

通过将函数或变量导出为DLL,其他程序可以使用这些函数或变量,实现代码的共享和重用。

在VC中,导出方法可以通过使用宏、关键字或修饰符等方式实现。

二、VC DLL导出方法的实现步骤1. 创建VC项目:首先,在VC中创建一个新的项目。

可以选择“Win32 Console Application”或“Win32 DLL”等项目类型,根据实际需求选择。

2. 编写代码:在项目中编写需要导出的函数或变量。

可以使用C或C++语言编写代码,根据实际需求进行逻辑处理和功能实现。

3. 声明导出函数或变量:在函数或变量的前面加上宏、关键字或修饰符等,声明它们为导出的。

例如,在VC中可以使用__declspec(dllexport)关键字来声明导出函数或变量。

4. 生成DLL文件:编译项目并生成DLL文件。

在生成过程中,VC 会将导出的函数或变量打包为动态链接库,生成对应的DLL文件。

5. 使用DLL文件:在其他程序中引用生成的DLL文件,调用其中的导出函数或变量。

可以通过函数指针、LoadLibrary()和GetProcAddress()等方式实现。

三、VC DLL导出方法的注意事项1. 函数或变量的命名:导出的函数或变量的命名应具有一定的规范性和易读性,以方便其他程序员使用和理解。

2. 函数或变量的参数和返回值:导出的函数或变量在设计时应考虑参数的合理性和返回值的正确性,以避免出现错误或歧义。

3. 调用约定和位宽:在导出函数或变量时,需要指定调用约定和位宽,以确保在不同的编译环境中能够正确地调用和使用。

VC++_6.0_使用方法详解

VC++_6.0_使用方法详解
6
[Project]工程菜单
[Project]菜单共有 6个选项: 菜单共有6
1、Set Active Project 在多个工程中选定当前活动工程。 2、Add to Project 向当前工程添加文件、文件夹、数据连接 组件,以及 ActiveX 控件。 、Visual C C组件,以及 组件,以及ActiveX ActiveX控件。 源代码控制具。 3、source Control Control源代码控制具。 设置工程间的依赖关系。 4、 Dependencies Dependencies设置工程间的依赖关系。 5、 Settings 设置工程属性(调试版本、发布版本和共同部分) 。 6、Export Makefile 导出应用程序的 Make( *.mak )文件。 导出应用程序的Make( Make(* mak)
4
[View]视图菜单
1 和7): [View] 菜单共有 9个选项,分成 6组(初始时没有 (初始时没有1 [View]菜单共有 菜单共有9 个选项,分成6
1、ClassWizard (或 Ctrl+W), 激活 MFC ClassWizard 类向导 ClassWizard(或 (或Ctrl+W), Ctrl+W),激活 激活MFC 工具,用来管理类、消息映射等。 2、Resource Symbols 对工程所定义的所有资源标号,进行 浏览和管理。 ID 的包含头文件 。 3、 Resource Includes 用于设定资源 用于设定资源ID ID的包含头文件 4、Full Screen 全屏显示,按 Esc 退出全屏显示。 全屏显示,按Esc Esc退出全屏显示。 5、Workspace 显示工作区窗口。 6、Output 显示输出窗口。 7、Debug Windows 在调试状态下控制一些调试窗口。 8、Refresh 刷新当前显示窗口。 5 9、Properties 查看和修改当前窗口所显示的对象的属性。

vc6.0安装教程与调试技巧

vc6.0安装教程与调试技巧

vc6.0的安装过程1.首先解压安装文件的压缩包2.然后再选择安装的版本,VC6CN 表示的是中文版,VC6EN表示英文版。

3.打开VC6CN文件夹,其中有如下图标,鼠标双击。

4.如下图所示就是我们安装的第一步,单击下一步。

5.选择“接受协议”后单击下一步。

6.本软件属于破解版,故无需输入产品ID号码,直接单击下一步。

7.选择“安装visual c++6.0中文企业版(I)”,这就是我们要安装的程序,单击下一步。

8.单击下一步。

9.如下界面,单击“继续”,开始安装软件。

10.点击“确定”。

11.选择“是”,继续安装。

12.选择“typical”继续安装13.选择“ok”。

14.选择“确定”15.选择“确定”16.取消“安装MSDN”前面的勾号,选择“退出”。

17.选择“是”,取消MSDN的安装。

18.程序安装完毕,再电脑的“开始菜单”中,选择“所有程序”,在“Microsoft Visual C++ 6.0”目录中选择“Microsoft Visual C++ 6.0”就可以运行程序了。

也可以将这个图标发送到桌面快捷方式,这样就可以直接在桌面上运行程序。

调试技巧调试程序可以帮助的了解程序是怎样运行的。

1、如何快速地规范代码缩进格式选中所需要规范的代码,按shift+F82、如何在Release状态下进行调试Project->Setting…->Project Settings对话框,选择Release状态。

“C/C++”标签页中的Category选General,Optimizations选Disable(Debug),Debug info选Program Database。

在“Link”标签页中选中Generate debug info复选框。

注:只是一个介乎Debug和Release的中间状态,所有的ASSERT、VERIFY都不起作用,函数调用方式已经是真正的调用,而不查表,但是这种状态下QuickWatch、调用队列跟踪功能仍然有效,和Debug版一样。

VC++6.0介绍

VC++6.0介绍

21
VC以项目工作区 以项目工作区 的形式来组织文件、 的形式来组织文件、 项目和项目配置
19
2. 项目工作区窗口简介
VC项目工作区由 项目工作区由ClassView、ResourceView及FileView三个面板组成 三个面板组成 项目工作区由 、 及 三个
20
三、联机帮助
VC帮助系统 帮助系统 主要提供五 主要提供五 个方面内容
14
(a) Set Active Project选项 选项
设定指定的项目为工作区的活动项目
在该子菜单中可以进行如下操作: 在该子菜单中可以进行如下操作
(b) Add To Project选项 选项
选择该选项将打开一个级联子菜单 选择该选项将打开一个级联子菜单 通过级连子菜单,可以把文件、 通过级连子菜单,可以把文件、文 件夹等添加到当前工程文件中
Visual C++6.0 可以创建的文件类型 说明 文件类型 网页制作 Binary File 创建位图文件 C++ Source File 创 建 C/C++头 文 件 Cursor File 头 创 建 HTM L 文 件 Icon File 创建资源脚本文件 Text File 创建资源模板文件 SQL Script File
数据断点是在变量 数据断点是在变量 是在 表达式上设置 上设置, 或表达式上设置, 变量或表达式的 当变量或表达式的 改变时 值改变时,数据断 点将中断程序的执行
消息断点是在窗口 消息断点是在窗口 函数WndProc上设 函数 上设 置,当接收到指定 的消息时, 的消息时,消息断 点将中断程序的执行
2 可视化
• 指软件开发阶段的可视化 • 利用计算机图形技术和方法

VC工程中各种文件

VC工程中各种文件

dsw, aps, clw, plg这些文件都可以删除。

只保留 H,C,CPP,DSP,RC,剩余文件去除只读属性,其余全部删除。

然后打开DSP 有提示选 YES,就可以了*.dsp(DeveloperStudio Project):是VC++的工程配置文件,比如说你的工程包含哪个文件,你的编译选项是什么等等,编译的时候是按照.dsp的配置来的。

*.dsw(DeveloperStudio Workspace):是工作区文件,用来配置工程文件的。

它可以指向一个或多个.dsp文件。

*.clw:是 ClassWizard信息文件,实际上是INI文件的格式,有兴趣可以研究一下.有时候ClassWizard出问题,手工修改CLW文件可以解决.如果此文件不存在的话,每次用ClassWizard的时候绘提示你是否重建。

*.opt:工程关于开发环境的参数文件,如工具条位置等信息。

*.aps:(AppStudio File),资源辅助文件,二进制格式,一般不用去管他。

*.rc:资源文件。

在应用程序中经常要使用一些位图、菜单之类的资源, VC中以rc为扩展名的文件称为资源文件, 其中包含了应用程序中用到的所有的windows资源, 要指出的一点是rc文件可以直接在VC集成环境中以可视化的方法进行编辑和修改。

*.plg:是编译信息文件,编译时的error和warning信息文件(实际上是一个html文件,一般用处不大),在Tools->Options里面有个选项可以控制这个文件的生成。

*.hpj:(Help Project)是生成帮助文件的工程,用microsfot Help Compiler可以处理。

*.mdp:(Microsoft DevStudio Project)是旧版本的项目文件,如果要打开此文件的话,会提示你是否转换成新的DSP格式。

*.bsc:是用于浏览项目信息的,如果用Source Brower的话就必须有这个文件。

VC6创建动态库文件(FLL)给VFP调用步骤

VC6创建动态库文件(FLL)给VFP调用步骤

创建用于VFP的动态库(FLL格式)一、使用VC++ 6创建FLL文件的步骤:1.打开VC++ 6,并在VC中新建空项目testadd(类型:Win32 Dynamic-LinkLibrary动态库)2.添加或编写源代码文件testadd.c,如格式为*.C,不能用*.cpp表示的文件。

内容如下:// 注意:不要用向导建成testadd.cpp#include "pro_ext.h"// 注意:如果写成#include <pro_ext.h>,需要把pro_ext.h拷贝到Visul C++之Include文件夹void TestAdd(ParamBlk FAR *parm){int x1;x1 = parm->p[0].val.ev_long + parm->p[1].val.ev_long;_RetInt(x1,10);}FoxInfo myFoxInfo[] = {{"TESTADD", (FPFI)TestAdd,2,"I,I"},};FoxTable _FoxTable={(FoxTable *)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo};3.头文件及库文件复制(很关键,设置不对会导致编译错误)拷贝pro_ext.h,winapims.lib到testadd文件夹这两个文件在“盘符:\Program Files\Microsoft visual foxpro 9\Samples\API”目录下4.项目设置(很关键,设置不对会导致编译错误)点击项目(Project)中<设置(Settings)>,(1)在C++选项卡中,删除编译器开关参数中的/GZ,增加 /Gr /MD(注意:因Vfp要求fastcall,必须加/Gr选项)(2)在Link选项卡中,添加WINAPIMS.LIB和msvcrt.lib(建议msvcrt.lib放在最后)即可成功5.重新编译在debug目录下生成testadd.dll后,将它复制到FOXPRO相应的目录下set libr to release\testadd.dll ?testadd(1,2)。

VC++动态链接库(DLL)编程深入浅出(全)

VC++动态链接库(DLL)编程深入浅出(全)
图 4 把库工程和调用库的工程放入同一工作区进行调试 上述调试方法对静态链接库和动态链接库而言是一致的。所以本文提供下载 的所有源代码中都包含了库工程和调用库的工程,这二者都被包含在一个工作 区内,这是笔者提供这种打包下载的用意所在。 动态链接库中的导出接口可以使用 Visual C++的 Depends 工具进行查看,让我 们用 Depends 打开系统目录中的 user32.dll,看到了吧?红圈内的就是几个版 本的 MessageBox 了!原来它真的在这里啊,原来它就在这里啊!
图 2 在 VC 中设置库文件路径
这个静态链接库的例子至少让我们明白了库函数是怎么回事,它们是哪来 的。我们现在有下列模糊认识了:
(1)库不是个怪物,编写库的程序和编写一般的程序区别不大,只是库不 能单独执行; (2)库提供一些可以给别的程序调用的东东,别的程序要调用它必须以某 种方式指明它要调用之。
对动态链接库,我们还需建立如下概念:
(1)DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的 DLL 接口规范和调用方式,用各种语言编写的 DLL 都可以 相互调用。譬如 Windows 提供的系统 DLL(其中包括了 Windows 的 API),在任 何开发环境中都能被调用,不在乎其是 Visual Basic、Visual C++还是 Delphi。
以上从静态链接库分析而得到的对库的懵懂概念可以直接引申到动态链接 库中,动态链接库与静态链接库在编写和调用上的不同体现在库的外部接口定 义及调用方式略有差异。
3.库的调试与查看
在具体进入各类 DLL 的详细阐述之前,有必要对库文件的调试与查看方法 进行一下介绍,因为从下一节开始我们将面对大量的例子工程。
标准 Turbo C2.0 中的 C 库函数(我们用来的 scanf、printf、memcpy、strcpy 等)就来自这种静态库。

vc调用动态库dll和lib

vc调用动态库dll和lib
extern"C"void_cdeclcdeclproc(void);
extern"C"void_fastcallfastcallproc(void);
//noname.cpp动态链接库实现文件
#include<windows.h>
extern"C"void_stdcallstdcallproc(void)
(1)静态链接到MFC 的规则DLL
静态链接到MFC的规则DLL与MFC库(包括MFC扩展 DLL)静态链接,将MFC库的代码直接生成在.dll文件中。在调用这种DLL的接口时,MFC使用DLL的资源。因此,在静态链接到MFC 的规则DLL中不需要进行模块状态的切换。
使用这种方法生成的规则DLL其程序较大,也可能包含重复的代码。
if(youFuntionNameAlias)
{
youFuntionNameAlias(param1,param2);
}
FreeLibrary(hDllInst);
}
}
显式(静态)调用:
LIB + DLL + .H,注意.H中dllexport改为dllimport
#pragma comment(lib,"RegularDll.lib")
3.3共享MFC DLL的规则DLL的模块切换
应用程序进程本身及其调用的每个DLL模块都具有一个全局唯一的HINSTANCE句柄,它们代表了DLL或EXE模块在进程虚拟空间中的起始地址。进程本身的模块句柄一般为0x400000,而DLL模块的缺省句柄为0x10000000。如果程序同时加载了多个DLL,则每个DLL模块都会有不同的 HINSTANCE。应用程序在加载DLL时对其进行了重定位。

动态链接库(DLL)

动态链接库(DLL)

动态链接库(DLL)动态链接库和静态链接库:动态链接库⼀般不能直接执⾏,⽽且它们⼀般也不接收消息。

它们是包含许多函数的独⽴⽂件,这些函数可以被应⽤程序和其他 DLL 调⽤以完成某些特定的⼯作。

⼀个动态链接库只有在另外⼀个模块调⽤其所包含的函数时才被启动。

“静态链接” ⼀般是在程序开发过程中发⽣的,⽤于把⼀些⽂件链接在⼀起创建⼀个 Windows 可执⾏⽂件。

这些⽂件包括各种各样的对象模块(.OBJ),运⾏时库⽂件(.LIB),通常还有已编译的资源⽂件(.RES)。

与其相反,动态链接则发⽣在程序运⾏时。

静态库:函数和数据被编译进⼀个⼆进制⽂件,扩展名为(.lib)。

在使⽤静态库的情况下,在编译链接可执⾏⽂件时:链接器从静态库中复制这些函数和数据,并把它们和应⽤程序的其他模块组合起来创建最终的可执⾏⽂件(.exe)。

当发布产品时,只需要发布这个可执⾏⽂件,并不需要发布被使⽤的静态库。

“动态链接” 是指 Windows 的链接过程,在这个过程中它把模块中的函数调⽤与在库模块中的实际函数链接在⼀起。

动态库:在使⽤动态库时,往往提供两个⽂件:⼀个导⼊库(.lib,⾮必须) 和⼀个(.dll)⽂件。

导⼊库和静态库本质上的区别:静态库本⾝就包含了实际执⾏代码和地址符号表等数据。

⽽对于导⼊库⽽⾔,其实际的执⾏代码位于动态库中,导⼊库只包含了地址符号表等,确保程序找到对应函数的⼀些基本地址信息。

动态链接库的标准扩展名是(.dll)。

只有扩展名为(.dll)的动态链接库才能被 Windows 操作系统⾃动加载。

如果该⽂件有另外的扩展名,则程序必须明确地⽤ LoadLibrary() 或 LoadLibraryEx() 加载相应模块。

编写动态链接库我们编写的程序都可以根据 UNICODE 标识符的定义编译成能够处理 UNICODE 或者⾮ UNICODE 字符串的程序。

在创建⼀个 DLL 时,对于任何有字符或者字符串参数的函数,它都应该包括 UNICODE 和⾮ UNICODE 两个版本。

动态链接库(dll)学习资料总结

动态链接库(dll)学习资料总结

1. 什么是lib文件,lib和dll的关系如何(1)lib是编译时需要的,dll是运行时需要的。

如果要完成源代码的编译,有lib就够了。

如果也使动态连接的程序运行起来,有dll就够了。

在开发和调试阶段,当然最好都有。

(2)一般的动态库程序有lib文件和dll文件。

lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。

如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。

如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。

静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。

但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。

(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,DLL库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行时再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。

从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。

2、严重警告:(1) 用 extern "C" _declspec(dllexport) 只可以导出全局函数,不能导出类的成员函数(2) 使用extern "C" _declspec(dllexport)输出的函数可以被c语言调用,否则则不可(3) 注意标准调用约定的问题,输出与调用的函数约定应该一致,如当dll模块的函数输出采用标准调用约定_stdcall,则调用程序的导入函数说明也要用标准约定(4) 用extern "C" _declspec(dllexport) 和 EXPOTRT导出的函数不改变函数名,可以给c++或c编写的exe调用.假如没有extern "C",导出的函数名将会改变,只能给c++编写的exe调用(5)在动态加载动态链接库函数时注意GetProcAddress(hInst,"add")中第二个参数是否为动态链接库导出的函数名,因为在生成动态库时可能会改变动态库导出函数的函数名,加上修饰符(6)dll初始化全局变量时,全局变量要放在共享数据断,并且初始化每一个变量,在StartHook函数里初始化其值,记得一进函数就初始化(7)调试时,编译器会自动查找其目录下(不含debug和release目录)的dll文件,所以dll文件应该放在主文件目录下,但生成的应用程序则只会在同一个目录下找dll(不需要lib文件),所以单纯的运行exe,不通过编译器,那就要把dll文件放在与exe相同的目录下(8)用#pragma comment(lib,"dllTest.lib")导入lib文件,不需要在设置里修改(9) dll里的指针变量不要用newDLL 调用方式DLL(动态连接库),可以分为动态调用于静态调用。

Visual C++ 6.0 - 工程设置解读

Visual C++ 6.0 - 工程设置解读

VC6.0的工程设置解读Project--Settings 做开发差不多一年多了,突然感觉对VC的工程设置都不是很清楚,天天要和VC见面,虽然通常情况下一般都不会修改工程设置,但是还是有必要对它的一些设置项的来龙去脉有一定的了解,所以狂查资料,稍作整理,总结一篇文档,方便以后查阅,总得记录点什么,温故而知新嘛。

进入工程设置界面有两种方法:方法一,选择法:【Project】->【Settings】方法二,快捷键:【Alt+F7】打开工程设置对话框,如下图:左边的列表可以选择要设置的工程编译方式(Debug或Release),如果多个工程,还可以选择要设置的工程。

右边是一个属性页,内容十分丰富,依次是:General , Debug , C/C++ , Link , Resource , MIDL , Browse Info , Custom Build , Pre-link Step , Post-build step下面主要介绍各个选项的功能:【General】设置工程的一般特性。

1.Microsoft Foundation Classes 连接MFC静态库的方式,默认为共享的DLL方式,对一些不支持MFC42的机器环境来说,选择静态编译还是有必要的。

2.Intermediate files 中间文件输出路径,比如:*.obj、*.pch、*.res、*.sbr、*.idb、*.pdb3.Output files 输出文件路径,比如:*.exe。

4.Allow per-configuration dependencies 按外部制作文件(exported makefile)方式为每个工程配置导出不同的可建立项目。

【Debug】设置工程调试的选项。

Category 选项种类,先看看General种类选项卡1.Executable for debug session 如果是dll的工程,需要指定启动它的exe文件路径,如果是exe工程,默认当前工程路径。

VC6.0使用手册正确

VC6.0使用手册正确

附录3 Visual C++ 6.0操作手册Visual C++由美国微软公司开发,是Windows平台上流行的C/C++集成开发环境。

从1993年发行1.0版本开始,历经多年锤炼,目前最新的版本是Visual C++2010。

本文介绍如何在VC6.0版本(以下简称VC6)下开发C语言程序。

1. 新建C语言工程VC6的AppWizard(应用向导)并不直接支持生成C语言工程,但是我们可以用以下两种方法来建立新的C语言文件。

方法1:通过向导生成。

选择菜单栏中的File(文件)->New(新建),就会弹出图6-1的向导对话框,选择“Files”选项卡,按照如图所示的选项新建我们需要的C语言文件。

注意:文件类型选择C++ Source File(C++源文件),文件名扩展名必须是“.c”。

扩展名必须是.c选择c++源文件图6-1 新建文件向导方法2:手动新建文件。

打开VC6,点击新建按钮生成一个空的文本文件,如图6-2所示。

当保存时选择扩展名为“.c”文件即可。

如图6-3所示。

点击此“新建”按钮建立空文本文件图6-2使用“新建”按钮建立一个空的文本文件文件扩展名必须是.c点击此按钮保存文件图6-3 保存文件建议读者在新建好文本文件后,就将其保存为C语言的源文件。

这样在对代码进行编辑时,开发环境会用C语言代码版式来处理该文件,对关键字变色并进行适当的缩进。

这样在编写代码的过程中容易检查编码过程中的错误并养成良好的编程习惯。

2. 编译源程序在编写完代码之后,下面就要编译源程序。

按“编译”按钮或者直接按“F7”对程序进行编译。

这时系统将在保存.c 源文件的目录下生成与.c 源文件同名的.dsw 文件和.dsp 文件。

以后可以直接通过这些文件来打开工程继续编写程序。

编译的过程中会在输出窗口输出错误(error)与警告(warning)信息,如果是仅有警告信息,程序可以运行,但可能存在潜在的异常。

图6-4给出了编译相关的命令。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC++动态链接库(DLL)编程深入浅出(一)出处:PConline [ 2005-09-12 10:15:51 ] 作者:宋宝华责任编辑:moningfeng 1.概论
先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。

在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。

但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。

静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

对动态链接库,我们还需建立如下概念:
(1)DLL 的编制与具体的编程语言及编译器无关
只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。

譬如Windows 提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。

(2)动态链接库随处可见
我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。

kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。

一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。

由此可见DLL对我们来说其实并不陌生。

(3)VC动态链接库的分类
Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。

非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。

由于本文篇幅较长,内容较多,势必需要先对阅读本文的有关事项进行说明,下面以问答形式给出。

问:本文主要讲解什么内容?
答:本文详细介绍了DLL编程的方方面面,努力学完本文应可以对DLL有较全面的掌握,并能编写大多数DLL程序。

问:如何看本文?
答:本文每一个主题的讲解都附带了源代码例程,可以随文下载(每个工程都经WINRAR压缩)。

所有这些例程都由笔者编写并在VC++6.0中调试通过。

当然看懂本文不是读者的最终目的,读者应亲自动手实践才能真正掌握DLL的奥妙。

问:学习本文需要什么样的基础知识?
答:如果你掌握了C,并大致掌握了C++,了解一点MFC的知识,就可以轻松地看懂本文。

2.静态链接库
对静态链接库的讲解不是本文的重点,但是在具体讲解DLL之前,通过一个静态链接库的例子可以快速地帮助我们建立“库”的概念。

图1 建立一个静态链接库
如图1,在VC++6.0中new一个名称为libTest的static library工程(单击此处下载本工程附件),并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下:
//文件:lib.h
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y); //声明为C编译、连接方式的外部函数
#endif
//文件:lib.cpp
#include "lib.h"
int add(int x,int y)
{
return x + y;
}
编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。

将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。

标准Turbo C2.0中的C库函数(我们用来的scanf、printf、memcpy、strcpy等)就来自这种静态库。

下面来看看怎么使用这个库,在libTest工程所在的工作区内new一个libCall工程。

libCall工程仅包含一个main.cpp文件,它演示了静态链接库的调用方法,其源代码如下:
#include <stdio.h>
#include "..\lib.h"
#pragma comment( lib, "..\\debug\\libTest.lib" ) //指定与静态库一起连接
int main(int argc, char* argv[])
{
printf( "2 + 3 = %d", add( 2, 3 ) );
}
静态链接库的调用就是这么简单,或许我们每天都在用,可是我们没有明白这个概念。

代码中
#pragma comment( lib , "..\\debug\\libTest.lib" )的意思是指本文件生成的.obj文件应与libTest.lib一起连接。

如果不用#pragma comment指定,则可以直接在VC++中设置,如图2,依次选择tools、options、directories、library files菜单或选项,填入库文件路径。

图2中加红圈的部分为我们添加的libTest.lib文件的路径。

图2 在VC中设置库文件路径
这个静态链接库的例子至少让我们明白了库函数是怎么回事,它们是哪来的。

我们现在有下列模糊认识了:
(1)库不是个怪物,编写库的程序和编写一般的程序区别不大,只是库不能单独执行;
(2)库提供一些可以给别的程序调用的东东,别的程序要调用它必须以某种方式指明它要调用之。

以上从静态链接库分析而得到的对库的懵懂概念可以直接引申到动态链接库中,动态链接库与静态链接库在编写和调用上的不同体现在库的外部接口定义及调用方式略有差异。

附件
libTest.zip
3.库的调试与查看
在具体进入各类DLL的详细阐述之前,有必要对库文件的调试与查看方法进行一下介绍,因为从下一节开始我们将面对大量的例子工程。

由于库文件不能单独执行,因而在按下F5(开始debug模式执行)或CTRL+F5(运行)执行时,其弹出如图3所示的对话框,要求用户输入可执行文件的路径来启动库函数的执行。

这个时候我们输入要调用该库的EXE文件的路径就可以对库进行调试了,其调试技巧与一般应用工程的调试一样。

图3 库的调试与“运行”
通常有比上述做法更好的调试途径,那就是将库工程和应用工程(调用库的工程)放置在同一VC工作区,只对应用工程进行调试,在应用工程调用库中函数的语句处设置断点,执行后按下F11,这样就单
步进入了库中的函数。

第2节中的libTest和libCall工程就放在了同一工作区,其工程结构如图4所示。

图4 把库工程和调用库的工程放入同一工作区进行调试
上述调试方法对静态链接库和动态链接库而言是一致的。

所以本文提供下载的所有源代码中都包含了库工程和调用库的工程,这二者都被包含在一个工作区内,这是笔者提供这种打包下载的用意所在。

动态链接库中的导出接口可以使用Visual C++的Depends工具进行查看,让我们用Depends打开系统目录中的user32.dll,看到了吧?红圈内的就是几个版本的MessageBox了!原来它真的在这里啊,原来它就在这里啊!
图5 用Depends查看DLL
当然Depends工具也可以显示DLL的层次结构,若用它打开一个可执行文件则可以看出这个可执行文件调用了哪些DLL。

好,让我们正式进入动态链接库的世界,先来看看最一般的DLL,即非MFC DLL(待续...)。

相关文档
最新文档