精华内容
下载资源
问答
  • VS2010下创建静态链接库和动态链接库类封装成dll如果你的工作长期与某个领域相关,比如说长期直接体绘制 (DVR)方面的开发,那么你可能经常使用自己的传递函数类,如果每一个工程你都把传递函数类的.h和.cpp文件...

    VS2010下创建静态链接库和动态链接库

    类封装成dll如果你的工作长期与某个领域相关,比如说长期做直接体绘制 (DVR)方面的开发,那么你可能经常使用自己的传递函数类,如果每一个工程你都把传递函数类的.h和.cpp文件添加进去会比较麻烦,其实,我们可以像 使用opengl的库那样来用你自己的类,做法就是把你写好的类封装成dll,具体做法如下: 第一步:制作dll 利用VC6新建工程时选择win32 dynamic-Link Library(空的工程),然后添加头文件和cpp文件。假设你要封装的类的名成是TransferFunction,添加头文件 TransferFunction.h和TransferFunction.cpp到工程中。并将TransferFunction.h修改成: class __declspec(dllexport)TransferFunction . 从而说明以后从dll要被导出的类是哪一个。这样编译完就会产生TransferFunction.dll和TransferFunction.lib两个文件。 第二步:如何使用这个dll 当已经生成dll后,有两种方法可以在其它程序中调用dll中的类和成员函数: 方法一: 1)把TransferFunction.dll和TransferFunction.lib复制到调用程序的执行路径下,注意不是debug路径下。 2)在project-setting-link里添加TransferFunction.lib(或者用#pragma comment(lib, TransferFunction.lib) ) 3)把TransferFunction.h中的__declspec(dllexport)改成__declspec(dllimport) 然后复制到调用程序的执行路径下。 4)最后在主程序中就可以通过包含TransferFunction.h来使用TransferFunction类和它的成员函数。 方法二(推荐): 在方法一中,你每次建立一个工程都需要把 TransferFunction.dll,TransferFunction.lib,TransferFunction.h三个文件拷贝到工程里面 去,事实上这只发挥了dll对类的代码保护的功能,并没有多大的减轻编程人员的工作量,下面的方法可以减少编程人员的工作量,具体步骤: undefined1:将TransferFunction.dll扔到windowssystem32下 2:将.TransferFunctionlib扔到VC的lib目录里 3:将方法一中的TransferFunction.h扔到VC的include目录里 4:同方法一的最后一步。 以后你就可以像使用Opengl的glut、glui等库一样使用你自己封装的一个经常复用的类了。VS2010下创建静态链接库和动态链接库 下面介绍一下用VS2010如何创建静态链接库和动态链接库,并测试创建的库。1.静态链接库打开VS2010,新建一个项目,选择win32项目,点击确定,选择静态库这个选项,预编译头文件可选可不选。 在这个空项目中,添加一个.h文件和一个.cpp文件。名字我们起为static.h和static.cpp static.h文件:cppview plaincopy 1. #ifndef LIB_H2. #define LIB_H3.4. extern C int sum(int a,int b);5.6. #endifstatic.cpp文件:1.#include static.h2.3. int sum(int a,int b) 4. 5. return a+b; 6. 编译这个项目之后,会在debug文件夹下生成static.lib文件,这个就是我们需要的静态链接库。下面说明如何调用静态链接库。首先需要新建一个空项目,起名为test。将之前static项目下的static.h和static.lib这个2个文件复制到test项目的目录下,并在工程中加入static.h文件。新建一个test.cpp文件如下:cppview plaincopy 1. span style=font-size:14px;#include stdio.h2. #include stdlib.h3. #include static.h4.5. #pragma comment(lib,static.lib)6.7. int main()8. 9. printf(%dn,sum(1,2);第2 / 5页10. system(pause); 11. return 0;12. 编译运行可得结果:3 #pragma comment(lib,static.lib),这一句是显式的导入静态链接库。除此之外,还有其他的方法,比如通过设置路径等等,这里不做介绍。2.动态链接库和创建静态链接库一样,需要创建一个空的win32项目,选择dll选项。创建dynamic.cpp和dynamic.h文件dynamic.h文件:cppview plaincopy1. span style=font-size:14px;#ifndef DYNAMIC2. #define DYNAMIC3.4. extern C __declspec(dllexport)int sum(int a, int b);5.6. #endif DYNAMIC/span第3 / 5页dynamic.cpp文件:cppview plaincopy 1. span style=font-size: 14px; #include dynamic.h 2.3. int sum(int a, int b)4. 5. return a+b;6. /span编译这个项目,会在debug文件夹下生成dynamic.dll文件。下面介绍如何调用动态链接库,这里讲的是显式的调用。在刚才的test项目下,把static.lib和static.h文件删除,把dynamic.h和dynamic.dll复制到该目录下,并在项目中添加dynamic.h文件,修改test.cpp文件为:cppview plaincopy1. span style=font-size:14px;#include stdio.h2. #include stdlib.h3. #includeWindows.h4. #include dynamic.h5. int main()第4 / 5页6. 7. HINSTANCE hDll=NULL;8. typedef int(*PSUM)(int a,int b);9. PSUM pSum;10. hDll = LoadLibrary(Ldynamic.dll);11. pSum = (PSUM)GetProcAddress(hDll,sum);12. printf(%dn,pSum(1,2);13. system(pause);14. FreeLibrary(hDll);15. return 0;16. 17. /span编译运行结果为:3特别提示:1.extern C中的C是大写,不是小写2.如果从VS2010中直接运行程序,lib和dll需要放到test项目的目录下;如果想双击项目test下的debug文件中的exe文件直接运行的话,需把lib和dll放入debug文件夹下。VS2010下静态链接库和动态链接库总结尚哥发表于 8月前 (2015-01-28 08:46:16) | 评论(0)| 阅读次数(1518)|0人收藏此文章, 我要收藏静态链接库对于静态链接库是函数库的情况如下:生成静态链接库:必须要有头文件。对于静态链接库是函数库的情况如下:.h文件中是函数的声明,.cpp文件中是函数的实现。举例:jj测试静态链接库(1) #include “.h” /编译时候需要 注意:如果.h文件不在源程序文件同级目录下,需要配置VS环境:项目属性-配置属性-C/C+-常规-附加包含目录,可以事先将.h文件放到某个位置的lnclude文件夹中,当添加附加包含目录时候将其定位到该lnclude文件夹。(2) #pragma comment(lib,*.lib) 或者配置VS环境方式引入库文件.lib,具体项目属性-配置属性-链接器-输入-附加依赖项 /链接时候需要 注意:如果.lib库文件不在源程序文件同级目录下,需要配置VS环境:项目属性-配置属性-链接器-常规-附加库目录,可以事先将.lib文件放到某个位置的lib文件夹中,当添加附加库目录时候将其定位到该lib文件夹。举例:对于动态链接库是函数库的情况如下:动态链接库生成动态链接库:头文件可以不要。但一般第三方都会有头文件,因为如果没有头文件,则需要在实现文件中使用函数之前声明函数,而一般对于用户来讲都是不知道函数声明的,而且对于一个工程中使用多个导出函数的情况还需要多个函数的声明比较麻烦,所以实际中还是都有头文件的。头文件是函数的声明,声明前需要修饰符_declspec(dllexport) 或者extern 也行,如果动态库是用C语言写的,就需要写成 externa “C”的方式。(说明:实际上,当你想导入一个符号时,你不需要用到__declspec(dllimport). 用extern就可以了。但是,如果用__declspec(dllimport)的话,编译器会生成更有效率的代码。)实现文件函数前就不再需要修饰符_declspec(dllexport) 等了。测试动态链接库对于提供头文件的情况:#include .h /路径问题同静态链接库头文件引入 编译时候需要#pragma comment(lib,*.lib) /路径问题同静态链接库库引入,实际对于动态链接库来讲,此时的.lib文件是导入库。 链接时候需要不提供头文件的情况:不需要写#include .h ,因为没有。此时要完成函数声明功能,需要使用extern int add(int x,int y);来实现函数的声明或者 _declspec(dllimport) int add(int x,int y)来声明引入的函数。#pragma comment(lib,*.lib) /路径问题同静态链接库库引入,实际对于动态链接库来讲,此时的.lib文件是导入库。 链接时候需要。1.隐式调用 把dlltest.dlldlltest.lib dlltest.h 三个文件考到本地工程目录下面2.显示调用动态库函数 只需要将dlltest.dll文件复制到本地工程目录下。一般动态链接库的标准写法如下:VC+ 程序 如何封装为dll文件VC+分享到:专业回答ljmdzyx0072013-09-13 22:28创建新的动态链接库 (DLL) 项目从 “文件”菜单中,选择 “新建”,然后选择 “项目”。在 “项目类型”窗格中,选择 “Visual C+”下的 “Win32”。在 “模板”窗格中,选择 “Win32 控制台应用程序”。为项目选择一个名称,如MathFuncsDll,并将其键入 “名称”字段。 为解决方案选择一个名称,如DynamicLibrary,并将其键入 “解决方案名称”字段。单击 “确定”启动 Win32 应用程序向导。在 “Win32 应用程序向导”对话框的 “概述”页中,单击 “下一步”。在 “Win32 应用程序向导”中的 “应用程序设置”页中,选择 “应用程序类型”下的 “DLL”(如果可用),或者选择 “控制台应用程序”(如果 “DLL”不可用)。 某些版本的 Visual Studio不支持通过使用向导创建 DLL 项目。您可以稍后对此进行更改,以将项目编译为DLL。在 “Win32 应用程序向导”的 “应用程序设置”页中,选择 “附加选项”下的 “空项目”。单击 “完成”创建项目。向动态链接库添加类若要为新类创建头文件,请从 “项目”菜单中选择 “添加新项”。将显示 “添加新项”对话框。在 “类别”窗格中,选择 “Visual C+”下的 “代码”。 在 “模板”窗格中选择 “头文件(.h)”。 为头文件选择一个名称,如MathFuncsDll.h,并单击 “添加”。 将显示一个空白文件。添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。代码应与以下内容类似:以带有颜色区分的格式查看复制到剪贴板打印/ MathFuncsDll.hnamespace MathFuncsclass MyMathFuncspublic:/ Returns a + bstatic __declspec(dllexport) double Add(double a, double b);/ Returns a - bstatic __declspec(dllexport) double Subtract(double a, double b);/ Returns a * bstatic __declspec(dllexport) double Multiply(double a, double b);/ Returns a / b/ Throws DivideByZeroException if b is 0static __declspec(dllexport) double Divide(double a, double b);/ MathFuncsDll.hnamespace MathFuncsclass MyMathFuncspublic:/ Returns a + bstatic __declspec(dllexport) double Add(double a, double b);/ Returns a - bstatic __declspec(dllexport) double Subtract(double a, double b);/ Returns a * bstatic __declspec(dllexport) double Multiply(double a, double b);/ Returns a / b/ Throws DivideByZeroException if b is 0static __declspec(dllexport) double Divide(double a, double b);请注意此代码方法声明中的 __declspec(dllexport) 修饰符。 这些修饰符使 DLL能够导出该方法以供其他应用程序使用。有关更多信息,请参见 dllexport, dllimport。若要为新类创建源文件,请从 “项目”菜单中选择 “添加新项”。将显示 “添加新项”对话框。在 “类别”窗格中,选择 “Visual C+”下的 “代码”。 在 “模板”窗格中,选择 “C+ 文件(.cpp)”。 为源文件选择一个名称,如MathFuncsDll.cpp,并单击 “添加”。 将显示一个空白文件。在源文件中实现“MyMathFuncs”的功能。代码应与以下内容类似:以带有颜色区分的格式查看复制到剪贴板打印/ MathFuncsDll.cpp/ compile with: /EHsc /LD#include MathFuncsDll.h#include stdexceptusing namespace std;namespace MathFuncsdouble MyMathFuncs:Add(double a, double b)return a + b;double MyMathFuncs:Subtract(double a, double b)return a - b;double MyMathFuncs:Multiply(double a, double b)return a * b;double MyMathFuncs:Divide(double a, double b)if (b = 0)throw new invalid_argument(b cannot be zero!);return a / b;/ MathFuncsDll.cpp/ compile with: /EHsc /LD#include MathFuncsDll.h#include stdexceptusing namespace std;namespace MathFuncsdouble MyMathFuncs:Add(double a, double b)return a + b;double MyMathFuncs:Subtract(double a, double b)return a - b;double MyMathFuncs:Multiply(double a, double b)return a * b;double MyMathFuncs:Divide(double a, double b)if (b = 0)throw new invalid_argument(b cannot be zero!);return a / b;若要将项目生成为 DLL,请从“项目”菜单中选择MathFuncsDll “属性.”。 在左窗格中,选择 “配置属性”下的 “常规”。在右窗格中,将 “配置类型”更改为 “动态库(.dll)”。单击 “确定”保存更改。说明如果您从命令行生成项目,请使用/LD 编译器选项指定输出文件应为 DLL。有关更多信息,请参见 /MD、/MT、/LD(使用运行库)。编译该动态链接库,方法是选择“生成”菜单中的 “生成解决方案”。这样就创建了一个可供其他程序使用的DLL。VS2010生成静态库(.lib)时间2013-06-17 18:37:46CSDN博客原文http:/blog.csdn.net/ivanljf/article/details/主题Visual Studio动态库打开VS2010,新建一个项目,选择win32项目,点击确定,选择静态库这个选项,预编译头文件不选。在这个空项目中,添加一个.h文件和一个.cpp文件。名字我们起为static.h和static.cppstatic.h文件:#ifndef LIB_H#define LIB_Hextern C int sum(int a,int b);extern C int substract(int a,int b); #endifstatic.cpp文件#include static.hint sum(int a,int b)return a+b;int substract(int a,int b)return a-b;编译这个项目之后(生成生成解决方案),会在debug文件夹下生成static.lib文件,这个就是我们需要的静态链接库。下面说明如何调用静态链接库。首先需要新建一个空项目,起名为test。将之前static项目下的static.h和static.lib这个2个文件复制到test项目的目录下,并在工程中加入static.h文件。新建一个test.cpp文件如下:#include static.h#include stdlib.h#include stdio.h#pragma comment(lib,static.lib)int main()printf(%dn,sum(1,2);printf(%dn,substract(4,3);system(pause);return 0;编译运行可得结果:31#pragma comment(lib,static.lib),这一句是显式的导入静态链接库。除此之外,还有其他的方法,比如通过设置路径等等,这里不做介绍。或者选中工程名,点击右键-属性,在“VC+目录”的包含目录里面加入static.h的所在目录的路径,库目录里面加入static.lib所在目录的路径;在链接器-输入-附加依赖项输入“static.lib”。然后源文件里添加#includestatic.h就OK了。题外话摘自百度百科:程序编译一般需经预处理、编译、汇编和链接几个步骤。在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的复本,因此节省了很多内存。Dll无法直接导出泛型模板(generalizedtemplate),因此,如果要导出stl类,则模板必须先实例化(instantiated)。另外,如果导出的STL类使用了其他STL类,那么这些其他类必须同时被导出。目前stl中唯一能够被导出的容器是vector,其他容器(如map、set、queue、list、deque)都因包含嵌套类而不能被导出。导出STL类的步骤:在Dll和exe文件中,用同样版本的c运行库链接。譬如都用Msvcrt.lib(release)链接或都用Msvcrtd.lib(debug)链接。Dll中,用__declspec(dllexport)导出模板类的实例。在exe文件中,用__declspec(dllimport)和extern关键字从Dll中导入stl类。需要注意的是:当导出一个以自定义类为模板参数的stl容器,必须为这个自定义类型定义和=运算符。譬如,如果要导出std:vectorCPerson类,则必须为CPerson添加和=运算符。#ifdefEXP_STL#defineDECLSPECIFIER__declspec(dllexport)#defineEXPIMP_TEMPLATE#else#defineDECLSPECIFIER__declspec(dllimport)#defineEXPIMP_TEMPLATEextern#endif/导出stl类std:vectorCPersonclassCPersonpublic:intm_nAge;charm_strName40;public:booloperator(constCPerson&c)constreturntrue;booloperator=(constCPerson&c)constreturntrue;EXPIMP_TEMPLATEtemplateclassVECDLL_APIstd:vectorCPerson;/显式实例化模板类VECDLL_APIintfnVecDll(std:vectorCPerson&vecPer);/导出函数定义这两个运算符的原因是:所有stl容器都有比较成员函数,这些成员函数需要调用自定义类型的和=运算符。通常情况下,由于没有使用这些成员函数,所以它们没有被实例化,所以我们使用时一般就不需要为CPerson定义这两个运算符。然而,当显示实例化此容器类时,它所有的成员函数都需实例化,包括它的“比较”成员函数,所以这时必须实现CPerson的和=运算符。如果CPerson并不在乎和=的意义,我们可以像上面代码所示通过简单返回true来实现它们。导出一个数据成员包含stl对象的类。方法与上类似。如下代码所示:EXPIMP_TEMPLATEtemplateclassVECDLL_APIstd:vectorint/显式实例化std:vectorintclassVECDLL_APICContainerpublic:std:vectorintm_vecNum;VS下 dllimport与dllexport作用与区别时间:2014-11-24 18:32:32 阅读:234 评论:0 收藏:0点我收藏+标签:desclassstyle代码使用comlog文件问题我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C+的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。但是,MSDN文档里面,对于__declspec(dllimport)的说明让人感觉有点奇怪,先来看看MSDN里面是怎么说的:不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。初看起来,这段话前面的意思是,不用它也可以正常使用DLL的导出库,但最后一句话又说,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量这个是什么意思?那我就来试验一下,假定,你在DLL里只导出一个简单的类,注意,我假定你已经在项目属性中定义了 SIMPLEDLL_EXPORTSimpleDLLClass.h#ifdef SIMPLEDLL_EXPORT#define DLL_EXPORT __declspec(dllexport)#else#define DLL_EXPORT#endifclass DLL_EXPORT SimpleDLLClasspublic:SimpleDLLClass();virtual SimpleDLLClass();virtual getValue() return m_nValue;private:int m_nValue;SimpleDLLClass.cpp#include SimpleDLLClass.hSimpleDLLClass:SimpleDLLClass()m_nValue=0;SimpleDLLClass:SimpleDLLClass()然后你再使用这个DLL类,在你的APP中include SimpleDLLClass.h时,你的APP的项目不用定义 SIMPLEDLL_EXPORT 所以,DLL_EXPORT 就不会存在了,这个时候,你在APP中,不会遇到问题。这正好对应MSDN上说的__declspec(dllimport)定义与否都可以正常使用。但我们也没有遇到变量不能正常使用呀。那好,我们改一下SimpleDLLClass,把它的m_nValue改成static,然后在cpp文件中加一行int SimpleDLLClass:m_nValue=0;如果你不知道为什么要加这一行,那就回去看看C+的基础。 改完之后,再去LINK一下,你的APP,看结果如何,结果是LINK告诉你找不到这个m_nValue。明明已经定义了,为什么又没有了?肯定是因为我把m_nValue定义为static的原因。但如果我一定要使用Singleton的Design Pattern的话,那这个类肯定是要有一个静态成员,每次LINK都没有,那不是完了? 如果你有Platform SDK,用里面的Depend程序看一下,DLL中又的确是有这个m_nValue导出的呀。再回去看看我引用MSDN的那段话的最后一句。 那我们再改一下SimpleDLLClass.h,把那段改成下面的样子:#ifdef SIMPLEDLL_EXPORT#define DLL_EXPORT __declspec(dllexport)#else#define DLL_EXPORT __declspec(dllimport)#endif再LINK,一切正常。原来dllimport是为了更好的处理类中的静态成员变量的,如果没有静态成员变量,那么这个__declspec(dllimport)无所谓。_declspec(dllexport)与_declspec(dllimport)都是DLL内的关键字,即导出与导入。他们是将DLL内部的类与函数以及数据导出与导入时使用的。主要区别在于,dllexport是在这些类、函数以 及数据的申明的时候使用。用过表明这些东西可以被外部函数使用,即(dllexport)是把DLL中的相关代码(类,函数,数据)暴露出来为其他应用程 序使用。使用了(dllexport)关键字,相当于声明了紧接在(dllexport)关键字后面的相关内容是可以为其他程序使用的。而dllimport关键字是在外部程序需要使用DLL内相关内容时使用的关键字。当一个外部程序要使用DLL内部代码(类,函数,全局变量)时,只需要在 程序内部使用(dllimport)关键字声明需要使用的代码就可以了,即(dllimport)关键字是在外部程序需要使用DLL内部相关内容的时候才 使用。(dllimport)作用是把DLL中的相关代码插入到应用程序中。_declspec(dllexport)与_declspec(dllimport)是相互呼应,只有在DLL内部用dllexport作了声明,才能 在外部函数中用dllimport导入相关代码。实际上,在应用程序访问DLL时,实际上就是应用程序中的导入函数与DLL文件中的导出函数进行链接。而 且链接的方式有两种:隐式迎接和显式链接。隐式链接是指通过编译器提供给应用程序关于DLL的名称和DLL函数的链接地址,面在应用程序中不需要显式地将DLL加载到内存,即在应用程序中使用dllimport即表明使用隐式链接。不过不是所有的隐式链接都使用dllimport。显式链接刚同应用程序用语句显式地加载DLL,编译器不需要知道任何关DLL的信息以下是一个DLL头文件的正规编写方式:1 #ifdef DIALOG_MAINMENU_EXPORTS2 #define DIALOG_MAINMENU_API __declspec(dllexport) 3 #else4 #define DIALOG_MAINMENU_API __declspec(dllimport) 5 #endif6 7 class Dialog_MainMenu 8 public:9 static DIALOG_MAINMENU_API enum GAME_STATES 10 MAINMENU, GAME, OPTIONS, CREDITS, QUIT11 ;12 static DIALOG_MAINMENU_API GAME_STATES CurrentGameState;13 DIALOG_MAINMENU_API GAME_STATES GetState();14 ;以下是解释:OK - when you compile the dll - you are exporting the types. So, you need todefinethe static member in.cppfile of the dll. You also need to make sure that you have enabled the definition ofDIALOG_MAINMENU_EXPORTSin compiler settings. This will make sure types are exported.Now, when you link the console application with the dll - you will#includedlls header and dont enable any definition ofDIALOG_MAINMENU_EXPORTSin compiler settings (just leave the settings default). This will make the compiler understand that now you are importing the typesfromyour dll into exeapplication.C/C+中动态链接库的创建和调用2007-02-05 14:12天极网我要评论(0)字号:T|T本文详细介绍了动态连接库的创建步骤和动态链接的调用步骤,供大家参考!AD:【线下活动】三大新锐HTML 5企业汇聚51CTO大话移动前端技术动态连接库的创建步骤:一、创建Non-MFC DLL动态链接库1、打开File New Project选项,选择Win32 Dynamic-Link Library sample project 工程名:DllDemo2、新建一个.h文件DllDemo.h#ifdefDllDemo_EXPORTS #defineDllAPI__declspec(dllexport) #else #defineDllAPI__declspec(dllimport) externC/原样编译 DllAPIint__stdcallMax(inta,intb);/__stdcall使非C/C+语言内能够调用API #endif3、在DllDemo.cpp文件中导入DllDemo.h文件,并实现Max(int,int)函数#includeDllDemo.h DllAPIint__stdcallMax(inta,intb) if(a=b) returnNULL; elseif(ab) returna; else returnb; 4、编译程序生成动态连接库二、用.def文件创建动态连接库DllDemo.dll1、删除DllDemo工程中的DllDemo.h文件。2、在DllDemo.cpp文件头,删除 #include DllDemo.h语句。3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句:LIBRARY MyDllEXPORTSMax14、编译程序生成动态连接库。动态链接的调用步骤:一、隐式调用1、建立DllCnslTest工程2、将文件DllDemo.dll、DllDemo.lib拷贝到DllCnslTest工程所在的目录3、在DllCnslTest.h中添加如下语句:#defineDllAPI__declspec(dllimport) #pragmacomment(lib,DllDemo.lib)/在编辑器link时,链接到DllDemo.lib文件 externC DllAPIint__stdcallMax(inta,intb); 4、在DllCnslTest.cpp文件中添加如下语句:#includeDllCnslTest.h/或者#includeDllDemo.h voidmain() intvalue; value=Max(2,9); printf(TheMaxvalueis%dn,value); 5、编译并生成应用程序DllCnslTest.exe二、显式调用1、建立DllWinTest工程。2、将文件DllDemo.dll拷贝到DllWinTest工程所在的目录或Windows系统目录下。3、用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函数结构。4、使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针。例:typedefint(*lpMax)(inta,intb);/此语句可以放在.h文件中5、通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄。例:HINSTANCEhDll;/声明一个Dll实例文件句柄 hDll=LoadLibrary(DllDemo.dll);/导入DllDemo.dll动态连接库6、通过GetProcAddress()函数获取导入到应用程序中的函数指针。例:lpMaxMax; Max=(lpMax)GetProcAddress(hDLL,Max); intvalue; value=Max(2,9); printf(TheMaxvalueis%d,value);7、函数调用完毕后,使用FreeLibrary()卸载DLL文件。FreeLibrary(hDll);8、编译并生成应用程序DllWinTest.exe

    展开全文
  • 如何使用bootstrap框架一个比较复杂的静态页面,领导要求根据ui给的ppt提炼公共组件,是什么意思???求指教
  • 类:Book. 属性:id,title,price,publishdate. 要求:通过控制台录入实现书籍的增,删,改,查的操作,不通过数据库....尤其什么是通过static静态的集合模拟数据库。。。 麻烦请一个例子。谢谢
  • 什么是动态网页和静态网页? 一个网友问过我这么一个问题,那个网站的动画好漂亮,这样的动态网站难么?我按照他给的网址打开了那个网站,原来一个含有一个FLASH动画的静态页面了,感到有些好笑了,动态网站不能...
    什么是动态网页和静态网页?
    一个网友问过我这么一个问题,那个网站的动画好漂亮,做这样的动态网站难么?
        我按照他给的网址打开了那个网站,原来是一个含有一个FLASH动画的静态页面了,感到有些好笑了,动态网站不能从字面上去理解它的意思 。其实目前有很多的网页制作初学者有这样的错误想法。
        程序是否在服务器端运行,这个是判断网页属不属于动态网页的重要标志。
        在服务器端运行的程序、网页、组件,属于动态网页,它们会随不同客户、不同时间,返回不同的网页,例如ASP、PHP、JSP、ASP.net、CGI等。
        运行于客户端的程序、网页、插件、组件,属于静态网页,例如html页、Flash、JavaScript、VBScript等等,它们是永远不变的。
        附加推荐阅读信息:
        动态程序开发的网站就一定好么
        目前通过CGI,ASP,PHP.JSP,.NET等语言开发出来的网站具有管理方便,数据动态存储等特点,制作这样的站点, 你不仅要深谙HTML语言,还必须掌握一门网站编程语言.这样的网站确实需要一定的技术才能开发出来的.所以很多网页制作初学者就很羡慕这一类的人,并且也尽量让自己的网站动起来.但是我告诉一个让你很意外的事实,很多网页设计大师都是采用HTML来编写的静态网站的.动态网站有那些弊端呢?下面就是相关说明.
        1:网站由于其具有交互性,所以网站存在很大的安全隐患,如果开发设计人员在编程过程中安全性没有考虑到位,网站是很容易被******的;
        2:动态网站的页面上的信息都必须从数据库中读取,每打开一个页面就读取数据库一次,如果访问网站的人数很多,这会对服务器增加很大的荷载,从而影响这个网站的运行速度;
        3:动态网站的设计对于搜索引擎不是很友好,网络上的大部分网站(除了做广告和友情链接)的访问者都是通过搜索引擎过来的.
        根据实际情况,来均衡一下动态网站的利于弊,再决定是否采用动态程序搭建你的网站吧.

    转载于:https://blog.51cto.com/sixijian/46549

    展开全文
  • CMS是什么意思

    2008-11-26 23:10:56
    CMS其实就是内容管理系统,,,可以理解为,CMS帮你把一个网站的程序部分的事全完了 你要的只是一个网站里面美工的部份,搞几个静态网页模板,一个门户级的网站就出来了! CMS,大概2004以前,如果想进行网站内容管理,...
    CMS其实就是内容管理系统,,,可以理解为,CMS帮你把一个网站的程序部分的事全做完了 你要做的只是一个网站里面美工的部份,搞几个静态网页模板,一个门户级的网站就出来了! <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    CMS,大概2004以前,如果想进行网站内容管理,基本上都是靠手工维护,但千变万化的信息流,但没有好的程序支持,还继续靠手工完成是不可能的事,如果有一个好的系统来支撑你的网站,那将节省大量的人力物力,开发者就可能给客户一个软件包,可以用它定期人工修改网站。只要你配置安装好,你的编辑,在线记者,更新员只要定期更新数据,剩下的事就交给CMS去处理。

    转载于:https://blog.51cto.com/zhangjie/115577

    展开全文
  • 动态语言,准确地说,指程序在运行时可以改变其结构:新的函数可以被引进,... 所谓的动态类型语言,意思就是类型的检查在运行时的,比如如下代码是不是合法的要到运行时才判断(注意运行时的类型判断): ...

    动态语言,准确地说,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。

    所谓的动态类型语言,意思就是类型的检查是在运行时做的,比如如下代码是不是合法的要到运行时才判断(注意是运行时的类型判断):

    而静态类型语言的类型判断是在运行前判断(如编译阶段),比如C#就是一个静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言却不需要,所以一般动态语言都会采用dynamic typing,常出现于脚本语言中。(idior不知道这能不能回答你对动态语言多态的疑问^_^)

    这里我需要明确说明一点,那就是,是不是动态类型语言与这门语言是不是类型安全的完全不相干的,不要将它们联系在一起!

    静态类型语言的主要优点在于其结构非常规范,便于调试,方便类型安全;缺点是为此需要写更多的类型相关代码,导致不便于阅读、不清晰明了。动态类型语言的优点在于方便阅读,不需要写非常多的类型相关的代码;缺点自然就是不方便调试,命名不规范时会造成读不懂,不利于理解等。顺便说一下,现在有这样一种趋势,那就是合并动态类型与静态类型在一种语言中,这样可以在必要的时候取长补短,Boo就是一个很好的试验性例子。^_^

    最后说一下Boo,Boo是一个静态类型语言,虽然用duck typing可以模拟dynamic typing,但是duck并不支持所有类型的操作替代,所以即使完全使用duck typing也不能达到dynamic typing。就像FantasySoft所述,Type Inference不是动态类型语言的特性,所以支持Type Inference不代表这门语言就是dynamically typed。

    再特地为Ninputer这个VB的fans说一下VB.NET^_^,VB.NET是dynamically typed语言。

    Q:

    Q: What is strong-typing versus weak-typing Which is preferred, Why

    要注意是强类型和弱类型,很多人容易将此与静态语言和动态语言的混淆。静态语言在运行时检查变量类型,动态语言在运行时检查变量类型。但这不是强类型和弱类型的区别。

    弱类型语言允许将一块内存看做多种类型。比如直接将整型变量与字符变量相加。C and C++ 是静态语言,也是弱类型语言;Perl and PHP 是动态语言,但也是弱类型语言。

    强类型语言在没有强制类型转化前,不允许两种不同类型的变量相互操作。Java、C# 和 Python 等都是强类型语言。

    也有许多大型的系统是用动态类型语言编写的,编译器捕获类型错误只能捕获很小比例的错误。加强软件测试才能产出更加可靠的系统,这无关何种类型语言的使用。

    尽管如此,使用哪种语言还是要按需而定。个人观点是,编写简单小应用,使用弱类型语言可节省很多代码量,有更高的开发效率。而对于构建大型项目,使用强类型语言可能会比使用弱类型更加规范可靠。

     

     

     

    静态类型定义语言
         一种在编译时,数据类型是固定的语言。大多数静态类型定义语言强制这一
    点,它要求你在使用所有变量之前要声明它们的数据类型。Java和C是静态类型定
    义语言。

    动态类型定义语言
         一种在执行期间才去发现数据类型的语言,与静态类型定义相反。VBScript
    和Python是动态类型定义的,因为它们是在第一次给一个变量赋值的时候找出它的
    类型的。

    强类型定义语言
         一种总是强制类型定义的语言。Java和Python是强制类型定义的。如果你有
    一个整数,如果不显示地进行转换,你不能将其视为一个字符串(在本章后面会有
    更多如何去做的内容)。

    弱类型定义语言
         一种类型可以被忽略的语言,与强类型定义相反。VBScript是弱类型定义
    的。在VBScript中,可以将字符串 '12' 和整数 3 进行连接得到字符串 '123',
    然后可以把它看成整数 123,而不需要显示转换。

     


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mikel/archive/2007/06/13/1649941.aspx

    展开全文
  • 用iptablesIP的静态映射

    千次阅读 2013-06-22 20:18:41
    其实静态映射和端口映射差不多是一个意思,只不过IP静态是整个把内部网的服务器转到internet上(或者外部网络上)去,而端口映射只是把内网的某些服务端口映射到外网服务器的某个端口上。 或许有的兄弟会奇怪为什么...
  • 近期有空研究了一下DLL和HOOK的一些知识,故此下笔记。下面以add,sub两函数和Point类为例来解释Dll与Hook的区别。 简单的说一个勾子,一个动态库注入,hook起到拦截的作用,dll的使用就很常见了。任何函数的运行...
  • 对于静态网站来说,一定程度上来说url可以每个页面唯一的"身份标志",对于搜索引擎优化(SEO)来说网站url设置是否合理,页影响着最终的效果,达到事半功倍的效果,今天我根据以往经验来说什么样网站url对于百度搜索...
  • 符号是什么意思就不用多说了,大家都在用,就是两个变量同时指向一个地址而已,那么,php函数前面加&符号的意义又是什么呢?下面先上两个演示代码,然后再解释。function &chhua(){static $b=...
  • 静态是相对真实静态来讲的.一、什么是静态技术?所谓静态的意思,就是地址中不带问号。伪静态又名URL重写,是动态的网址看起来像静态的网址。换句话说就是,动态网页通过重写 URL 方法实现去掉动...
  • 如果静态库包含了动态库,则动态库失去了它的意思。因为动态库在运行时调用的,如果包含在静态库里,意味着在编译时把动态库编译进去了。 gcc不会这么荒唐的事的。 如果动态库包含了动态库,这也没必要,因为...
  • 当时不知道是什么意思,加上这句,问题就解决了,现在对这个有点明白了 。 简单的说:这两个参数是 是关闭LingFlag 优化 选项  这个涉及到 静态库方面的知识。  什么是静态库?什么是动态库 详细介绍 请移步到...
  • static这个关键字相信程序猿朋友们都曾经深刻的理解过其含义,以前遇到的静态方法,静态变量还能理解,但是在碰到static代码块时候懵了,完全不知道是啥意思,也不懂其执行的顺序是什么,在什么时候执行,作为初学者...
  • 第一次接触nginx的时候,那时候公司还是用的一些不知名的小技术,后来公司发展问题,重新招了人,然后接触到nginx,公司 使用nginx用来代理服务器,所有...1.什么是nginx: nginx一款高性能的http 服务器,也可...
  •  近自己突然觉得网页好没意思啊,强烈的感觉啊,现在觉得去学习android和ios很好,因为觉得网页都那几个框架,一成不变啊,写来写去都这么。看来自己在程序这方面不久啊。  二:先说说静态块:  ...
  • 关于AC自动机,有静态和动态模板两种,静态好像效率比较高,速度也较快(但为什么这道题动态快一点呢),动态好像内存需求有点大,但不过都基于字典树,还是比较好写的。我觉得静态的比较好写...
  • 代理从字面意思来看就是,替代XX去某事,在我们的程序中,一般替代实际对象去进行操作,扮演着中间人的角色: 客户端 –> 业务类 客户端 –> 代理 –>业务类(代理) 什么是静态代理? 特征代理类和目标对象...
  • 本篇借鉴了很多文章,这里个记录。 有时我们的导航栏出现xx.aspx?id=x&name=xx 等等这样,会显得不好看,我们可以利用伪静态来美化我们的导航栏...想要配置一个好的URL重写,正则表达式必须知道什么意思,W3C...
  • 问:能帮我详细说明一下ip route-static 192.168.40.0 255.255.255.0 192.168.1.2是什么意思? 我只知道这是配置静态路由,后面是路由IP的地址。 前面的192.168.40.0是什么意思? 用来什么的? 答:这是一条...
  • 什么是CMS

    2008-07-21 09:26:00
    CMS是什么意思? CMS其实就是内容管理系统,可以理解为,CMS帮你把一个网站的程序部分的事全完了,你要的只是一个网站里面美工的部份,搞几个静态网页模板,一个门户级的网站就出来了! CMS,大概2004以前,如果想...
  • 什么是RTK?

    千次阅读 2020-03-23 14:53:44
    国内习惯把GNSS接收机叫成RTK这倒是真的,因为RTK技术的普及,让大家对接收机的作用就“限定”在了RTK,在之前没有RTK...不过除去GNSS接收机,你知道RTK是什么意思吗? 定位 在说RTK之前,大家首先要认识这个词的含...
  • gulp基于Nodejs的自动任务运行器,它拥有搭建静态服务器,文件保存时自动重载浏览器,使用预处理器如sass\less,优化资源,比如压缩css,压缩javascript,压缩图片等等强大的功能。 3、gulp的安装 前面说了gulp...
  • 1.1 IP、子网掩码、网关、DNS、DHCP到底都是什么意思 1.1.1 IP与MAC、子网掩码 我们现在基本用的都是ipv4协议,所谓ip就是你电脑整个网络的编号。其他电脑想访问电脑就得需要这个编号。但是这个编号很多情况下是一直...
  • 什么应用 编写一个博客应用 输入和总结 其它 关于练手项目 前后端分离,你应该知道的八件事 前后端分离 什么是前后端分离? 真的需要前后端分离吗? 前后端分离将遇到的那些挑战 前后端分离的...
  • 这个斜杠的意思就是拦截所有的静态资源,当然图片属于静态资源的,这样就相当于把图片给拦截了,因此,解决的方法就是在springmvc.xml文件里面假如以下这段话 mvc:default-servlet-handler/ 这句话的意思是使用最...
  • 英文全称是: Content Management System 中文名称是: 网站内容管理系统CMS是什么意思?CMS其实就是内容管理系统,,,可以理解为,CMS帮你把一个网站的程序部分的事全完了 你要的只是一个网站里面美工的部份,搞几...
  • 什么是cms,了解一下。

    2015-05-17 09:20:00
    英文全称是: Content Management System 中文名称是: 网站内容管理系统 CMS是什么意思?CMS其实就是内容管理系统,,,可以理解为,CMS帮你把一个网站的程序部分的事全完了 你要的只是一个网站里面美工的部份,搞几...
  • 一:这篇博客写的时候我在学校已经一个星期了,为什么又会想到写这le,因为这几天又在...最近自己突然觉得网页好没意思啊,强烈的感觉啊,现在觉得去学习android和ios很好,因为觉得网页都那几个框架,一成...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 368
精华内容 147
关键字:

做静态是什么意思