vs2010加载系统dll文件_使用vs2010制作C语言dll文件并在其他程序中调用该dll文件
文章目录
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
使用命名空间 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
相关文章
- 10-05 STM32连接esp32(stm32连接esp32
- 10-05 stm32串口dma发送和接收周期数据和随机数据(
- 10-05 stm32点亮led灯ad20 (stm32点亮l
- 10-05 esp32编程接线图(esp32编程程序接线图)
- 10-05 DAC0832波形发生器课程设计报告(dac083
- 10-05 vs2010单行读取文本_VS2010-MFC获取
- 10-05 Web漏洞-SQL注入(二)
- 10-05 phpunit thinkphp模型单元测试
- 10-05 phpunit selenium 操作 html
- 10-05 【第201期】面试官:String的长度有限制吗?
- 10-05 【第256期】面试官经常测试的21条Linux命令
- 10-05 【第256期】面试官常测试的21条Linux命令
- 10-05 【第368期】为什么阿里巴巴禁止MyBatis使用
- 10-05 【第208期】我们来敲黑板,说说如何设计秒杀系统(
- 10-05 【第208期】我们来敲黑板,说说如何设计秒杀系统(
- 10-05 【344期】面试官:如何设计群聊消息的已读未读功能
- 10-05 【第328期】Spring高频面试题:如何解决循环
- 10-05 【第305期】面试官:你用过Redis吗?那么能否
- 10-05 为什么 C++ 是最难学的编程语言?看看大神的分析
- 10-05 为什么你的设计一次又一次地改变?这4个方法助你顺利
- 最近发表