VS2010 c++生成和调用dll例子(转载)

一、动态链接库简介



动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库
,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于
一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和
资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。

dll优点和作用:

 

    1、扩展了应用程序的特性;
  2、可以用许多种编程语言来编写;
  3、简化了软件项目的管理;
  4、有助于节省内存;
  5、有助于资源共享;
  6、有助于应用程序的本地化; 


二、创建并使用动态链接库




1.使用_declspec(dllexport)关键字导出函数,使用静态调用dll

    在VisualStudio工程向导中建立一个Windows Console Application,在“应用程序类型”选项中选择DLL,在“附加选项”中选择空项目。如下:


    在项目中添加cpp文件,加入代码如下:

 

[cpp]  view plain  copy
 
  1. /**********************************************/  
  2. /*FileName:DllDemo.cpp                        */  
  3. /**********************************************/  
  4.   
  5. #define DllDemoAPI _declspec(dllexport)  
  6. #include "DllDemo.h"  
  7. #include <stdio.h>  
  8.   
  9. DllDemoAPI int add(int a, int b)  
  10. {  
  11.     return a+b;  
  12. }  
  13.   
  14. DllDemoAPI int subtract(int a, int b)  
  15. {  
  16.     return a-b;  
  17. }  
  18.   
  19. DllDemoAPI int multiple(int a, int b)  
  20. {  
  21.     return a*b;  
  22. }  
  23.   
  24. DllDemoAPI void Point::Print(int x, int y)  
  25. {  
  26.     printf("x=%d,y=%d",x,y);  
  27. }  



 

    在项目中添加.h头文件,加入代码如下:

    

 

[cpp]  view plain  copy
 
  1. /**********************************************/  
  2. /*FileName:DllDemo.h                          */  
  3. /**********************************************/  
  4.   
  5. #ifdef DllDemoAPI  
  6. #else  
  7. #define DllDemoAPI _declspec(dllimport)  
  8. #endif  
  9.   
  10. DllDemoAPI int add(int a, int b);  
  11. DllDemoAPI int subtract(int a, int b);  
  12. DllDemoAPI int multiple(int a, int b);  
  13.   
  14. class DllDemoAPI Point  
  15. {  
  16. public:  
  17.     void Print(int x, int y);  
  18. };  



 

    编辑,生成,可以看到Debug目录里生成了以下这些文件:
    
    
    调用dll:
    新建一个控制台应用程序,取名InvokeDll,如下图:
    在InvokeDll.cpp中添加以下代码:
    

[cpp]  view plain  copy
 
  1. // InvokeDll.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <Windows.h>  
  6. #include "..\DllDemo\DllDemo.h"  
  7.   
  8. int _tmain(int argc, _TCHAR* argv[])  
  9. {  
  10.     /*加载dll函数调用方式为默认调用方式*/  
  11.        
  12.     printf("5+3=%d\n",add(5,3));   
  13.   
  14.     Point p;  
  15.     p.Print(5,3);  
  16.       
  17.       
  18.     return 0;  
  19. }  



    
    选择InvokeDll项目,点击右键,选择“属性”选项,在“链接”选择的字选项“输入”|“外部依赖项”中添加DemoDll.lib
    
    编译运行得结果:
    

2.通过应用程序定义文件,并动态调用

 

    在VisualStudio工程向导中建立一个Windows Console Application,在“应用程序类型”选项中选择DLL,在“附加选项”中选择空项目。
    在项目中添加cpp文件,加入代码如下:

 

[cpp]  view plain  copy
 
  1. /**********************************************/  
  2. /*FileName:DllDemo.cpp                        */  
  3. /**********************************************/  
  4.   
  5. #define DllDemoAPI _declspec(dllexport)  
  6. #include "DllDemo.h"  
  7. #include <stdio.h>  
  8.   
  9. DllDemoAPI int add(int a, int b)  
  10. {  
  11.     return a+b;  
  12. }  
  13.   
  14. DllDemoAPI int subtract(int a, int b)  
  15. {  
  16.     return a-b;  
  17. }  
  18.   
  19. DllDemoAPI int multiple(int a, int b)  
  20. {  
  21.     return a*b;  
  22. }  



    在项目中添加.def头文件,加入代码如下:

 

 

[cpp]  view plain  copy
 
  1. LIBRARY DllDemo  
  2.   
  3. EXPORTS  
  4. add  
  5. subtract  
  6. multiple  


    

 

    编辑,生成,可以看到Debug目录里生成了以下这些文件:
    
    
    调用dll:
    同上,新建一个控制台应用程序,取名InvokeDll
    在InvokeDll.cpp中添加以下代码:
    
    

[cpp]  view plain  copy
 
  1. #include "stdafx.h"  
  2. #include <Windows.h>   
  3.   
  4. int _tmain(int argc, _TCHAR* argv[])  
  5. {  
  6.     /*加载dll函数调用方式为默认调用方式*/  
  7.     HINSTANCE hInst = LoadLibrary(L"DllDemo.dll");  
  8.     if(!hInst)  
  9.     {  
  10.         printf("加载MathFuns.dll失败!\n");  
  11.     }  
  12.     typedef int (*DllDemoAPIProc)(int a, int b);  
  13.     DllDemoAPIProc Add = (DllDemoAPIProc)::GetProcAddress(hInst,"add");  
  14.     printf("5+3=%d\n",Add(5,3));  
  15.     ::FreeLibrary(hInst);  
  16.       
  17.       
  18.     return 0;  
  19. }  



      
    编译运行得结果:

 

 

点此下载示例源代码

参考 http://blog.csdn.net/big_wang5/article/details/8216557 
c++新手 
一、DLL简介 
包含能被可执行程序或其他DLL调用的函数。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。 
若要访问dll中的函数,该函数必须是导出的(_declspec(dllexport)关键字),在命令提示符下使用dumpbin函数查看导出情况。

二、DLL的2中加载方式:隐式连接和显示加载。

1.隐式连接 
生成dll 
使用_declspec(dllexport)关键字导出函数,使用静态调用dll 
VS2010中新建控制台程序,在“应用程序设置”页面的“应用程序类型”下,选择“DLL”和空项目。 
创建头文件,命名为DllDemo.h

    /**********************************************/  
    /*FileName:DllDemo.h                          */  
    /**********************************************/  

    #ifdef DllDemoAPI  
    #else  
    #define DllDemoAPI _declspec(dllimport)  
    #endif  

    DllDemoAPI int add(int a, int b);  
    DllDemoAPI int subtract(int a, int b);  
    DllDemoAPI int multiple(int a, int b);  

    class DllDemoAPI Point  
    {  
    public:  
        void Print(int x, int y);  
    };  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

创建源文件,命名为DllDemo.cpp

    /**********************************************/  
    /*FileName:DllDemo.cpp                        */  
    /**********************************************/  

    #define DllDemoAPI _declspec(dllexport)  
    #include "DllDemo.h"  
    #include <stdio.h>  

    DllDemoAPI int add(int a, int b)  
    {  
        return a+b;  
    }  

    DllDemoAPI int subtract(int a, int b)  
    {  
        return a-b;  
    }  

    DllDemoAPI int multiple(int a, int b)  
    {  
        return a*b;  
    }  

    DllDemoAPI void Point::Print(int x, int y)  
    {  
        printf("x=%d,y=%d",x,y);  
    }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

生成,Debug目录里生成了以下这些文件 
这里写图片描述

调用dll 
新建控制台应用程序InvokeDll,默认即可。 
InvokeDll.cpp中添加如下代码:

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

    #include "stdafx.h"  
    #include <Windows.h>  
    #include "F:\PCLBOOK\DllDemo\DllDemo\DllDemo.h"  

    int _tmain(int argc, _TCHAR* argv[])  
    {  
        /*加载dll函数调用方式为默认调用方式*/  

        printf("5+3=%d\n",add(5,3));   

        Point p;  
        p.Print(5,3);  

        system("pause");  
        return 0;  
    }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

右键InvokeDll项目,选择“属性”选项,在“链接器”选择的字选项“输入”|“外部依赖项”中添加DemoDll.lib 
编译运行得结果 
这里写图片描述

错误提示: 
1、这里写图片描述 
项目–属性–清单工具–输入输出–嵌入式菜单–将是改成否即可。 
2、error LNK1104: 无法打开文件“DllDemo.lib” 
在“属性”-》链接器-》常规-》附加库目录 和“属性”-》链接器-》输入-》附加依赖项 中都添加上了Dll1.lib库文件的完整路径如“F:\PCLBOOK\DllDemo\Debug\DllDemo.lib”后就成功了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++生成DLL文件供Java调用,您可以按照以下步骤进行操作: 1.在C++中编写函数,并将其导出为DLL 例如,我们有以下函数: ```c++ extern "C" __declspec(dllexport) int add(int a, int b) { return a + b; } ``` 这个函数使用了 `__declspec(dllexport)` 来明确将其导出为DLL,这个函数将两个整数相加并返回结果。 2.编译DLL文件 在Visual Studio中,您可以选择“Win32”作为平台并选择“DLL”项目类型。然后,在项目属性中,将“配置类型”设置为“动态库(.dll)”,将“常规”选项卡中的“输出目录”设置为您想要的目录,并将“C/C++”选项卡中的“预处理器定义”设置为“MYDLL_EXPORTS”(或您自己的导出标志)。最后,编译项目以生成DLL文件。 3.在Java中调用DLL 在Java中,您可以使用JNI(Java Native Interface)来调用DLL文件。首先,您需要定义DLL中的函数原型。例如,对于上面的add函数,您可以在Java中定义如下: ```java public class MyDll { public static native int add(int a, int b); } ``` 然后,您需要在Java中加载和使用DLL。例如: ```java public class Main { static { System.load("path/to/mydll.dll"); } public static void main(String[] args) { int result = MyDll.add(1, 2); System.out.println(result); } } ``` 这个例子在静态代码块中加载DLL文件,并在main函数中调用add函数。 希望这可以帮助您开始在C++生成DLL文件并在Java中调用它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值