VS2008静态库和动态库的创建和调用
VS2008新建、发布、调用Web服务

1、文件>>新建网站2、写一个简单的方法具体代码如下:using System;using System.Linq;using System.Web;using System.Web.Services;using System.Web.Services.Protocols;using System.Xml.Linq;[WebService(Namespace = "/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]// 若要允许使用 AJAX 从脚本中调用此Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]public class Service : System.Web.Services.WebService{public Service () {//如果使用设计的组件,请取消注释以下行//InitializeComponent();}[WebMethod]public string HelloWorld() {return"Hello World";}[WebMethod]public int Add(int a, int b){return a + b;}}3、启动调试,会看到浏览器中有如下效果:红色线框内显示的”Add”和”HelloWorld”即为上面代码中实现的两个WebMethod。
4、单击”Add”,会有如下效果:5、在步骤4中输入参数5和6,得到如下效果:<?xml version="1.0" encoding="utf-8" ?><int xmlns="/">11</int>这说明所写的方法没有错,建立Web服务的第一步就算成功了。
易语言支持库制作学习笔记

3.文件结尾处加入自己的代码
1) 定义 LIB_INFO 这段代码是定义模块信息的,只在动态模块中使用,所以加入宏__E_STATIC_LIB 来定义。 也就是说,如果是静态库那么这段代码就不会被编译。 静态库编译的时候只需在项目设置的 C++ -> 预处理器 中加入 __E_STATIC_LIB 即可。
接下来我们就可以定义库中需要使用的函数,类型,常量 了。 这些都定义在 mylib_ProcessNotifyLib 函数的前面,且都定义在宏中 #ifndef __E_STATIC_LIB
... #endif 因为这些只需包含在动态模块里,不需要静态中定义。
2) 定义常量 Consts
#ifndef __E_STATIC_LIB LIB_CONST_INFO Consts[] = { /* { 中文名称, 英文名称, 常量布局, 常量等级(LVL_), 参数类型(CT_), 文本内容, 数值内 容 } */ { _WT("常量_ZERO"), _WT("ZERO"), NULL, LVL_SIMPLE, CT_NUM, NULL, 0 },//数值常 量
return (INT)"mylib_ProcessNotifyLib"; else if(nMsg == NL_GET_DEPENDENT_LIBS) return (INT)NULL;
使用vs建立动态链接库dll过程和使用方法

使用vs建立动态链接库dll的过程和使用方法创建动态链接库(DLL)的过程可以分为几个步骤。
我将使用Visual Studio 来演示这个过程:创建DLL的步骤:1.打开Visual Studio,选择“文件”->“新建”->“项目”。
2.在新项目窗口中,选择“Visual C++”->“Windows桌面向导应用程序”。
3.输入项目名称和位置,然后点击“确定”。
4.在“解决方案资源管理器”中,右键单击项目名称->添加->新建项。
5.在“添加新项”窗口中,选择“DLL”,输入DLL名称,然后点击“添加”。
编写DLL代码:现在你已经有了一个空的DLL,你可以开始编写你的代码了。
例如,你可以添加以下代码到你的.cpp文件中:在这个例子中,我们创建了一个简单的函数add,它接收两个整数并返回它们的和。
extern "C"部分告诉编译器使用C链接规则创建导出函数,__declspec(dllexport)部分使得该函数可以从DLL中导出。
编译和生成DLL:在Visual Studio中,你可以通过点击“生成”菜单然后选择“生成解决方案”来编译和生成你的DLL。
如果编译成功,你可以在你的项目文件夹的Debug或Release 文件夹中找到生成的DLL文件。
使用DLL:使用DLL的过程可以分为几个步骤:1.加载DLL:使用Windows API函数LoadLibrary可以加载DLL。
例如:HMODULE hMod = LoadLibrary(TEXT("MyDLL.dll"));。
这个函数会返回一个模块句柄,如果DLL加载成功的话。
2.获取函数地址:使用GetProcAddress函数可以获取DLL中函数的地址。
例如:add_proc = (int (*)(int, int))GetProcAddress(hMod, "add");。
静态库的使用与创建

静态库的使用与创建静态库是一种预编译的库,它包含了一组已经编译好的目标文件(.o文件)。
使用静态库可以将一些常用的函数、类或其他代码打包成一个单独的文件,以便在多个应用程序中重复使用。
使用静态库:1. 创建静态库:首先需要将要打包的源代码编译成目标文件,然后使用静态库工具(如ar)将目标文件打包成静态库文件(.a文件)。
2. 链接静态库:在编译应用程序时,需要引用静态库文件,并将其链接到应用程序的可执行文件中。
可以使用编译器的命令行选项来指定链接静态库的路径和名称。
创建静态库的一般步骤如下:1. 编写源代码文件:创建需要打包进静态库的源代码文件(.c、.cpp、.h等)。
2. 编译源代码文件:使用编译器将源代码文件编译成目标文件(.o文件)。
例如,使用gcc编译C文件:`gcc -c file.c -o file.o`。
3. 打包目标文件:使用静态库工具(如ar)将目标文件打包成静态库文件。
例如,使用ar工具创建静态库:`ar rcs libfile.a file1.o file2.o ...`。
4. 链接静态库:在应用程序的编译过程中,使用编译器的命令行选项来链接静态库文件。
例如,使用gcc链接静态库:`gcc main.c -o main -L<path_to_lib> -lfile`。
注意事项:在创建静态库时,需要保持相应源代码文件的可移植性和独立性,以便在不同的项目中使用。
链接静态库时,需要确保目标文件和静态库文件的路径正确,并且编译器能够找到它们。
如果静态库依赖于其他库,需要确保这些依赖库也正确链接到应用程序中。
使用静态库可以提高代码的重用性和管理性,尤其是对于一些通用的函数或模块。
这种方法适用于部署到嵌入式设备、静态链接的可执行文件等场景。
C静态库(lib)及动态库(dll)的创建及调用

C静态库(lib)及动态库(dll)的创建及调用一、静态库的创建及调用最近在编程序的时候,用到静态库和动态库的创建和调用,将自己的一些心得总结如下,希望对各位有所帮助,有不恰当之处欢迎评论留言。
静态库和动态库的区别可以参考博客:windows中静态库lib和动态dll的区别及使用方法_dxzysk的专栏-CSDN博客_动态dll和静态库的区别1、静态库的创建为了方便大家学习,从空项目进行演示,实现输入两个数求出两数之和及两数之差,本文使用VS2017编译器。
(1)创建空项目(2)新建头文件.h和源文件.cpp其中test工程为后面测试用工程,现在不用考虑。
(3)修改项目属性,将目标文件扩展名和配置类型均修改为.lib (4)在项目头文件testLib.h中编写代码方法一和方法二均可以生成和调用(5)源文件testLib.cpp代码编写(6)工程生成可以看到工程目录下生成了testLib.ib和testLib.pdb文件,代表静态库生成成功。
2、静态库的调用(1)为了方便演示,在静态库生成的同解决方案下创建测试工程test,本地创建的是控制台应用程序。
(2)创建完测试工程后,在test.cpp文件中编写静态库调用程序(3)将test工程设置为启动工程,编译运行,会出现报错(4)针对(3)出现的报错,需要在项目中引入静态库文件路径静态库生成工程和测试工程目录如下:引入静态库的相对路径再次编译就可以成功。
运行结果如下至此,静态库的创建及调用讲解结束。
二、动态库的创建及调用1、动态库的创建动态库的创建介绍两种方式:__declspec(dllexport)和.def文件导出。
1.1、动态库的创建(__declspec(dllexport))(1)同静态库一样创建空项目testDll,创建头文件和源文件(2)修改项目属性,将目标文件扩展名和配置类型均修改为.dll(3)修改项目头文件testDll.h,本文介绍三种dll库生成的方法动态生成库的关键字为__declspec(dllexport)方法一和方法二的区别就是标识符是否被定义,如果标识符TESTDLL被定义则重新定义标识符TESTDLLAPI,并使用重新定义的标识符进行函数导出;如果标识符TESTDLL未被定义,则使用当前定义的标识符进行函数导出。
OSG在VS2008下的配置安装心得

在XP(32位)安装OSG2.8.2。
安装心得如下:一、准备安装资料包括程序(请到官方网站都可以下载)1. OpenSceneGraph-2.8.2.zip (源程序包)2. cmake-2.8.3-win32-x86.zip (安装源代码需要的工具)3. OpenSceneGraph-Data-2.8.0.zip (数据文件包)4. 3rdParty_VC9sp1_x86_x64.7z (第三方插件库:WINDOWS支持的图形库)(问题:详细作用)(rdParty只是一个统称,通常指的是某个软件所依赖的所有其它软件的集合。
例如,界面图形接口库Qt依赖于libjpeg,libmng,libpng,freetype等多种第三方库,以实现各种图形和字体格式的支持。
由于这些第三方库的存在,Qt不需要再额外编写和测试图形文件读写的代码,并且相应的功能可以随着这些第三方库的更新而更新,十分方便且稳定。
而OpenSceneGraph的第三方库主要用于实现各种模型、图形、字体文件的读写,如果需要某种格式的支持,请首先下载相应的第三方库(例如ttf格式对应freetype,hdr格式对应OpenEXR等)源代码,使用您自己的编译器生成第三方库的链接文件(DLL,LIB等),再编译OSG的对应插件;有些第三方库也会直接提供编译好的链接库文件,可以直接使用。
)友情提示:其中1、3、4可在下载,2可在/cmake/resources/software.html或/files下载,注意在下载过程中与自己使用的VC版本相对应,比如VS2008的为VC9。
二、安装过程:1. 为了统一方面,在D盘新建一个OSG目录(根据自己的情况放置),并将源程序包解压到此目录。
将各压缩包程序也解压到指定目录:D:\OSG\OpenSceneGraph (放置OSG库文件)D:\OSG\3dParty (放置图形库)D:\OSG\Data (放置演示等例子和数据)2. 用CMake生成Project & Solution files。
vs动态库的创建和使用

#define GTLDECLSPEC __declspec(dllimport)
#endif
extern "C" void GTLDECLSPEC print(void);
3、添加源文件,实现类或者函数。
例如:
#include <cstdio>
#include "print.h"
1、新建一个空的工程。
2、添加头文件,包括控制导入导出的宏定义,类或者函数声明。如果动态库可能被c程序调用,需要加extern "C"声明。
例如:
#ifdef TEST_DLL_EXPORTS//编译器预先定义的宏
#define GTLDECLSPEC __declspec(dllexport)
3、可以将动态库相关的文件放在一个文件夹里面。然后在C/C++的General项添加附加的头文件包含目录。
在Linker的General项设置动态库的导入库文件路径,在Inout项添加导入库文件。
4、编译运行程序。
void print(void)
{
printf("hello译,得到.lib和.dll文件。
-----------------------------------------------------
1、新建一个空的工程。
2、添加头文件和源文件,并且调用动态库的函数或者接口。
使用VC#2008开发类库及调用类库及类库调用显示说明

在.net中,可调用的dll(动态链接库)文件其实就是一个类库。
我们可以通过写一个类,然后把它编译成dll文件形式,在其他的项目中就可以直接调用此编译好的dll文件,而不用重复写这个类的代码。
下面详细介绍此过程:一、开发dll文件(1)打开vs2005,新建项目中模板选择“类库”(2)在解决资源管理器里面添加一文件夹“First”,在其中添加两个类MathAdd 和MathMinus,在其父目录里直接添加一个名为yun(写这个类的时候,我已经晕了,不知道取什么名字好,于是就yun了)的类。
下面是各个类的代码,注意类前一定要加上public,不然这个类会被当做是私有的,不能够被引用,当初我就是犯了这个错误,弄个了好久才想起,真是追悔莫及啊。
类中的方法为静态或非静态都可以。
MathAdd类代码using System;using System.Collections.Generic;using System.Text;namespace noo.First{public class MathAdd{public int add( int a,int b){return a + b;}public static int Muti(int a, int b) {int mutiSum;mutiSum = a * b;return mutiSum;}}}MathMinus类代码using System;using System.Collections.Generic;using System.Text;namespace noo.First{public class MathMinus{public static int minus(int a, int b) {return a - b;}}}yun类代码using System;using System.Collections.Generic;using System.Text;namespace noo{public class yun{public int add(int a, int b,int c){return a + b-c;}}到此,dll代码其实已经写好,这里我们可以发现,其实dll文件就是一个一个封装好的类库而已。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return x + y; } 然后编译生成静态库 libTest.lib.(该文件默认生成在 debug 中)
(2)调用动态库
创建一个 Win32 Console 控制台工程.工程名叫 TestLib 如下:
创建完成后,在 TestLib.cpp 文件中代码如下: #include "stdafx.h" #include "libTest.h" //调用静态库中的头文件 #include <iostream> #pragma comment (lib, "libTest.lib") //连接.lib文件 using namespace std;
{ fPrintFun();
cout << "输入两个参数, 15" << endl;
cout << "AddFun(12, 15):" << fAddFunc(12, 15) << endl;
cout << "MaxFun(12, 15):" << fMaxFunc(12, 15) << endl;
HINSTANCE hInstance = LoadLibraryA("dllTest.dll");//加载
动态库 if(NULL == hInstance) { cout << "Error" << endl; FreeLibrary(hInstance); } else { fAddFunc = (pAddFunc)GetProcAddress(hInstance,
typedef int (*pAddFunc)(int, int);//定义函数指针 typedef int (*pMaxFunc)(int, int); typedef void (*pPrintFun)(void);
int _tmain(int argc, _TCHAR* argv[]) {
pAddFunc fAddFunc; pMaxFunc fMaxFunc; pPrintFun fPrintFun;
点击 Next> 进入下一页面,选择 DLL 和 Export symbols(集成工具提供的部 分例子代码)
点击 Finish.工程建立成功. 现在查看 dllTest.h 中的代码 // This class is exported from the dllTest.dll class DLLTEST_API CdllTest { public:
//求最大的 DLLTEST_API int MaxFun(int x, int y) {
return ((x)>(y))?(x):(y);
} //求和 DLLTEST_API int AddFun(int x, int y) {
return x + y; } //输出 DLLTEST_API void PrintFun(void) {
int _tmain(int argc, _TCHAR* argv[]) {
PrintFun();;//调用静态库函数
cout << "输入两个参数, 15" << endl; cout << "AddFun(10, 15):" << AddFun(10, 15) << endl; ;// 调用静态库函数 getchar(); return 0; }
#endif //LIB_TEST_H 在 libTest.cpp 添加代码如下: #include "stdafx.h" #include "libTest.h" #include <iostream> using namespace std;
void PrintFun(void) {
cout << "调用静态库函数" << endl; }
态库> 中指定的路径有关
然后编译运行.运行结果:
这些是自己学习的一部分总结,但还有很多知识需要学习.
总结:
GetProcAddress 返回错误代码 127
采用“运行期间动态链接”自己的 dll 文件,LoadLibrary 成功获取 dll 模块句 柄,但是 GetProcAddress(hModule, "ExportFunc")却返回 NULL,GetLastError 获取错误代码 127,意思是“找不到指定程序”。 问题所在:用 Depends 工具(VS2010 默认没有,需另行下载: /),查看 dll 的导出函数名称。发现导出函 数名不再是“ExportFunc”,而根据函数的返回类型和参数进行了“decorate”, 变为了“?ExportFunc@@YAXPB_W@Z”。 解决方法: (1)修改 GetProcAddress 的第二个参数为真正的导出函数名称即可; (2)在 dll 工程中添加 DEF 文件,写入如下内容: EXPORTS ExportFunc
然后分别在 HeaderFiles 和 SourceFiles 下分别添加 libTest.h 和 libTest.cpp 文件.
在 libTest.h 添加代码如下: #ifndef LIB_TEST_H
#define LIB_TEST_H
void PrintFun(void); int AddFun(int x, int y);
return 42; } // This is the constructor of a class that has been exported. // see dllTest.h for the class definition CdllTest::CdllTest() {
return; } 这部分代码是自动提供的导出类,导出变量,导出函数定义和实现.
} else {
printf("Error:%d\n",GetLastError()); } } getchar(); return 0; }
在编译运行之前,要把dllTest工程中生成的动态库dllTest.dll文件拷贝到
该工程的文件路径下.和代码
<HINSTANCE hInstance = LoadLibraryA("dllTest.dll");//加载动
VS2008 静态库和动态库的创建和调用
1 静态库的创建和调用
(1)创建 libTest 静态库工程
创建一个 Win32Project 命名为 libTest,点击 OK, 弹出下一页面.
点击 Next 进入下一页面.
选 择 Static Library, 和 默 认 的 Precompiled hearder. 然 后 点 击 Finish.创建完成如下:
说明:extern "C" 防止 GetProcAddress 返回错误代码 127
(但这样可能会不能实现 C++的函数重载-个人理解)
在 dllTest.cpp 添加代码 #include "windows.h" #include <iostream> using namespace std; //自己添加的函数调用
上面这部分代码是提供的模板.现在要写自己的函数调用方法.
在 dllTest.h 添加代码
//自己添加的函数调用 extern "C" DLLTEST_API int MaxFun(int x, int y); extern "C" DLLTEST_API int AddFun(int x, int y); extern "C" DLLTEST_API void PrintFun(void);
CdllTest(void); // TODO: add your methods here. }; extern DLLTEST_API int ndllTest; DLLTEST_API int fndllTest(void); 这部分代码是自动提供的导出类,导出变量,导出函数声明.
查看 dllTest.cpp 中代码 // This is an example of an exported variable DLLTEST_API int ndllTest=0; // This is an example of an exported function. DLLTEST_API int fndllTest(void) {
重新编译 dll 工程。再次用 Depends 工具查看导出函数名称,即为“ExportFunc”。
参考:
/breaksoftware/article/details/362384 7 /violetwangy/item/c35b3b95ecf5374cf042 152a /link?url=CeEbebC7yYb1iS5pptVf6NMsw 41Lt6dUj4-R2klDxlrTnrCjE_WItxgyD9viDQLozcJ9F65qxVPtNPsXs5 vcuytQH8Nx96CN4tvsqU10LVu
TestDll.cpp 中全部代码 // TestDll.cpp : Defines the entry point for the console application. //
#include "stdafx.h" #include "windows.h" #include <iostream> using namespace std;