欢迎来到Introzo百科
Introzo百科
当前位置:网站首页 > 技术 > vs2010加载系统dll文件_使用vs2010制作C语言dll文件并在其他程序中调用该dll文件

vs2010加载系统dll文件_使用vs2010制作C语言dll文件并在其他程序中调用该dll文件

日期:2023-09-29 14:18

文章目录

1。创建win32控制台程序 2.包含目录、库目录、附加包含目录、附加库目录、附加依赖项简介 3.显式加载dll库 4.隐式加载dll和lib库

1。创建win32控制台程序

2。 include目录、库目录、附加包含目录、附加库目录、附加依赖项介绍

将所需的dll、lib、.h文件复制到项目路径

除了复制到项目路径外,还可以创建单独的文件夹并在项目属性中设置。详情参见:https://www.introzo.com/u012043391/article/details/54972127

VC++目录C/C++ -> 通用链接器 -> 通用链接器 -> 输入附加包含目录——添加工程的头文件目录:

Project->Properties->Configuration Properties->C/C++>General->Additional Include Directory:添加头文件的存放目录;附加库目录—添加文件引用的lib静态库路径:

Project->Properties->Configuration Properties->Linker->General->Additional Library Directory:添加lib文件的存放目录;其他依赖项 - 添加项目引用的 lib 文件名:

项目->属性->配置属性->链接器->输入->附加依赖项:添加lib文件名。

3。显式加载dll库

// dll_invoke.cpp:定义控制台应用程序的入口点。

//

#include“stdafx.h”

#包括

#include

#include // 必须包含windows API的头文件才能实现显式加载

使用命名空间 std;

int a=1;

int b=2;

int arr[5]={1,2,3,4,5};

void InvokeMethod1_Test();

void InvokeMethod2_Test();

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

{

cout<<"输入数据 a=1,b=2;\narr[5]=___noise___ 1008\n" << endl;

// 显式负载测试

InvokeMethod1_Test();

系统(“暂停”);

返回0;

}

/*

* 调用方式一:显式加载(只需dll文件)

*/

void InvokeMethod1_Test(){

cout << "[DLL显式加载(仅需要dll文件)]" << endl;

HINSTANCE hInstLibrary = LoadLibrary(L"dll_create.dll");//加载动态链接库dll_create.dll文件;

if (hInstLibrary == NULL)

{

FreeLibrary(hInstLibrary);

}

/* 测试 1:函数调用并返回 */

typedef int(*pTest1)(int a,int b);//函数指针

pTest1 test1 = (pTest1)GetProcAddress(hInstLibrary,"DLL_add");

int sum = test1(a,b);

cout << "DLL_add(a,b):\t"<< sum <

/* 测试2:信息打印 */

typedef void (*pTest2)();

pTest2 test2 = (pTest2)GetProcAddress(hInstLibrary,"DLL_hello");

cout << "DLL_hello():\t";

test2();

/* 测试3:通过指针修改数组 */

typedef void (*pTest3)(int *arr, int length);

pTest3 test3 = (pTest3)GetProcAddress(hInstLibrary,"DLL_modifyArr");

cout << "DLL_modifyArr(arr):\t";

test3(arr,5);

int arrLen = sizeof(arr)/sizeof(arr[0]);

for(int i=0;i

cout << "arr[" << i << "]=" << arr[i] << " ";

}

FreeLibrary(hInstLibrary);//卸载dllTest.dll文件;

cout << endl << endl;

}

运行结果:

4。隐式加载dll和lib库

// dll_create.cpp:定义控制台应用程序的入口点。

//

#include“stdafx.h”

#包括

#include

#include "dll_create.h" //引入隐式加载头文件

#pragma comment(lib,"dll_create.lib") //引入lib库的隐式加载

使用命名空间 std;

int a=1;

int b=2;

int arr[5]={1,2,3,4,5};

void InvokeMethod1_Test();

void InvokeMethod2_Test();

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

{

cout<<"输入数据 a=1,b=2;\narr[5]=___noise___ 1006\n" << endl;

// 隐式负载测试

InvokeMethod2_Test();

系统(“暂停”);

返回0;

}

/*

* 调用方式二:隐式加载

*/

void InvokeMethod2_Test(){

cout << "[DLL隐式加载(需要lib文件、dll文件和.h头文件)]" << endl;

/* 测试 1:函数调用并返回 */

int sum = DLL_add(a,b);

cout << "DLL_add(a,b):\t"<< sum <

/* 测试2:信息打印 */

cout << "DLL_hello():\t";

DLL_hello();

/* 测试3:通过指针修改数组 */

cout << "DLL_modifyArr(arr):\t";

DLL_modifyArr(arr,5);

int arrLen = sizeof(arr)/sizeof(arr[0]);

for(int i=0;i

cout << "arr[" << i << "]=" << arr[i] << " ";

}

cout << endl << endl;

}

运行结果:

为什么80%的程序员不能成为架构师? >>> ??

①将.dll复制到项目.exe所在目录; ②将.lib复制到项目源程序所在目录; ③添加同名.h文件路径:?? ?项目--->属性--->配置属性--->C/C++--->常规--->添加include目录,添加同名.h文件所在目录; ④添加lib库引用:?? ?Project--->Properties--->Configurationproperties--->Linker--->Input--->Additional dependency,添加库名称,如:my_API.lib,或者替换为代码#pragma cpp 源文件中的 comment(lib, "my_API.lib") ; ⑤添加库文件路径,添加附加库路径:?? ?Project--->Properties--->Configuration Properties--->Linker--->General--->Additionallibrarydirectory,添加库所在路径; ⑥添加同名.h文件:?? ?Project--->添加现有项目并添加同名.h文件; ⑦添加.lib文件:?? ?项目--->添加现有项目并添加.lib文件; ⑧在需要使用的程序中包含同名的.h文件,并使用.h文件中的类来创建对象! ! !

?

此方法与以下相同:

VS调用开源库的配置方法

http://www.introzo.com/zhang2531/article/details/52143473

转载于:https://www.introzo.com/qtplus/blog/677103

1。为什么需要dll

代码复用是提高软件开发效率的重要途径。一般来说,只要某部分代码是通用的,就可以构造成相对独立的功能模块,并在后续项目中复用。比较常见的例子是各种应用框架,如ATL、MFC等,它们都是以源代码的形式发布的。由于这种复用是在“源代码级别”,源代码完全暴露给程序员,因此被称为“白盒复用”。 “白盒复用”的缺点很多,总结起来有四点。

源码公开;很容易与程序员的“普通”代码发生命名冲突;多份造成存储浪费;功能模块更新困难。

其实,以上四点可以概括为“源代码暴露”导致“代码耦合严重”。为了弥补这些缺点,“二进制级”代码复用被提出。采用二进制级别的代码复用在一定程度上隐藏了源代码,对缓解代码耦合现象起到了一定的作用。这种重用称为“黑盒重用”。

Windows操作系统中有两种可执行文件,后缀名为.exe和.dll。它们的区别在于.exe文件可以独立加载到内存中运行; .dll文件不能,它只能被其他进程调用。但是,无论什么格式,它们都是二进制文件。上面提到的“二进制级”代码重用可以使用.dll来实现。

与白盒复用相比,.dll很大程度上弥补了以上四大缺点。 .dll是一个二进制文件,因此源代码是隐藏的;如果使用“显式调用”(后面会提到),一般不会发生命名冲突;由于.dll是动态链接到应用程序的,因此它在链接和生成程序时不会被原封不动地复制; .dll文件相对独立存在,因此更新功能模块是可行的。

注:实现“黑盒复用”的方法不只有一种,还有dll、静态链接库甚至更高级的COM组件。本文只讨论dll。

2。 C语言创建dll文件

1。启动vs2010,?

2。创建dll工程

  a。文件 -> 新建 -> ?项目 -> win32 控制台应用程序 —>?

  b。输入项目名称,如dll,点击确定

  c。点击下一步,在“应用程序设置界面”中勾选dll和空项目,点击完成按钮

  d。 View -> Solution Explorer -> 头文件右键,Add -> New item,这里使用dll.h,

  e。?右键“源文件”,Add->New Item,这里我们添加dll.c,dll工程就完成了。?

3。 dll.h

#ifndef AXLPLUGIN_H

#define AXLPLUGIN_H

/**/

#ifdef _WINDOWS

#define DLL_DECLARE __declspec(dllexport)

#其他

#define DLL_DECLARE

#endif

DLL_DECLARE int Min(int a, int b);

/* 在此列出所有函数声明 */

#endif

4。 dll.c

#include "dll.h"

#包括

/*根据需要添加相应的头文件*/

DLL_DECLARE int Min(int a, int b)

{

如果 (a >= b)

返回b;

其他

返回a;

}

/* 在这里实现所有声明的函数*/

5。生成dll lib文件

点击构建->构建dll

这样,dll和lib文件就生成了。

5。 dll文件的使用

经测试证明dll.dll文件应该与dll.lib、dll.h文件一起使用?

三、加载程序中的dll

创建一个新的“Win32应用程序”进行测试?操作:

   ?a.文件->新建->项目->Win32 控制台应用程序。

?  ?b。输入项目名称,这里我们使用test_dll,点击确定按钮。

??????c.点击下一步,在“应用程序设置界面”中设置“控制台应用程序”和“空项目”,然后点击完成按钮。??

??????d.将工程dll目录下的dll.h/dll.dll/dll.lib复制到工程test_dll目录下。 ??

??????e。 View->Solution Explorer,右键“头文件”,Add->New Item,这里我们使用dll.h??

?????????右键“源文件”,Add->New Item,这里我们添加test_dll.c,右键“资源文件”,??

?????????添加->“现有项”,选择dll.lib,至此test_dll工程就完成了。 ??

  3.??编辑test_dll.c文件,内容如下?

#include "dll.h"

#包括

int main()

{

printf("Min(2, 4) = %d\n", Min(2, 4));

printf("Min(5, 2) = %d\n", Min(5, 2));

返回0;

}

4。 dll和test_dll项目的目录结构?

../test_dll/

│ test_dll.sdf

│test_dll.sln

│ test_dll_dir.txt

├─调试

│ test_dll.exe

│ test_dll.ilk

│ test_dll.pdb

├─ipch

│ └─test_dll-eb5063a1

│ test_dll-c06c53e7.ipch

└─test_dll

│ dll.dll

│ dll.h

│ dll.lib

│ test_dll.c

│ test_dll.vcxproj

│ test_dll.vcxproj.filters

│ test_dll.vcxproj.user

└─调试

cl.command.1.tlog

CL.read.1.tlog

CL.write.1.tlog

link-cvtres.read.1.tlog

link-cvtres.write.1.tlog

link.3004-cvtres.read.1.tlog

link.3004-cvtres.write.1.tlog

link.3004.read.1.tlog

link.3004.write.1.tlog

link.command.1.tlog

link.read.1.tlog

link.write.1.tlog

mt.command.1.tlog

mt.read.1.tlog

mt.write.1.tlog

rc.command.1.tlog

rc.read.1.tlog

rc.write.1.tlog

test_dll.Build.CppClean.log

test_dll.exe.embed.manifest

test_dll.exe.embed.manifest.res

test_dll.exe.intermediate.manifest

test_dll.lastbuildstate

test_dll.log

test_dll.obj

test_dll_manifest.rc

vc100.idb

vc100.pdb

?

转载于:https://www.introzo.com/wangjz/p/4808803.html

关灯