精华内容
参与话题
问答
  • 动态库的生成 打开vs 新建项目,起的名字不能有中文 2) 写代码 写代码就是我们之前写的xxx.c和xxx.h,只是不需要main()函数测试罢了。 你可以重新新建项目,重新写。 或者用之前写好的代码,生成...

    转载

    动态库的生成

    1. 打开vs 新建项目,起的名字不能有中文

     

    2)

     

    1. 写代码

    写代码就是我们之前写的xxx.c和xxx.h,只是不需要main()函数测试罢了。

     

    你可以重新新建项目,重新写。

     

    或者用之前写好的代码,生成库:

     

    步骤如下:

    1. 拷贝所需代码到工程所在目录

    B) 添加所需代码:

     

    C)

     

    D)修改代码

    生成 DLL 时,通常创建一个包含正在导出的函数原型和/或类的头文件,并将 __declspec(dllexport)  添加到头文件中的声明。

     

    xxx.c 文件中实现函数的定义,需要在函数的前面添加:

    __declspec(dllexport)

     

     

    4)生成动态库

     

    1. 生成的动态库实在Debug目录

     

    一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的

     

    1. xxx.dll、xxx.lib、xxx.h拷贝出来,给用户使用

    测试使用动态库时,

    xxx.lib和xxx.h拷贝在代码所在目录

    xxx.dll 拷贝到可执行程序目录

     

    动态库的测试使用

    1) 测试使用动态库时,

    xxx.lib和xxx.h拷贝在代码目录

     

    1. 配置环境:添加lib文件

     

    1. 编译代码,但不运行程序

     

     

    4) xxx.dll 是拷贝到可执行程序目录,运行程序

    展开全文
  • C#中创建DLL动态链接库)及其使用

    万次阅读 2019-08-11 17:40:57
    动态链接库(也称为 DLL ,即为“ Dynamic Link Library ”的缩写)是 Microsoft Windows 最重要的组成要素之一,打开 Windows 系统文件夹,你会发现文件夹中有很多 DLL 文件, Windows 就是将一些主要的系统功能以 ...

    一、DLL 与应用程序

    动态链接库(也称为 DLL ,即为“ Dynamic Link Library ”的缩写)是 Microsoft Windows 最重要的组成要素之一,打开 Windows 系统文件夹,你会发现文件夹中有很多 DLL 文件, Windows 就是将一些主要的系统功能以 DLL 模块的形式实现。

    动态链接库是不能直接执行的,也不能接收消息,它只是一个独立的文件,其中包含能被程序或其它 DLL 调用来完成一定操作的函数 ( 方法。注: C# 中一般称为“方法” ) ,但这些函数不是执行程序本身的一部分,而是根据进程的需要按需载入,此时才能发挥作用。

    DLL 只有在应用程序需要时才被系统加载到进程的虚拟空间中,成为调用进程的一部分,此时该 DLL 也只能被该进程的线程访问,它的句柄可以被调用进程所使用,而调用进程的句柄也可以被该 DLL 所使用。在内存中,一个 DLL 只有一个实例,且它的编制与具体的编程语言和编译器都没有关系,所以可以通过 DLL 来实现混合语言编程。 DLL 函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。

    下面列出了当程序使用 DLL 时提供的一些优点: [1]

    1)  使用较少的资源

    当多个程序使用同一个函数库时, DLL 可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在 Windows 操作系统上运行的程序。

    2)  推广模块式体系结构

    DLL 有助于促进模块式程序的开发。这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。

    3)  简化部署和安装

    当 DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。此外,如果多个程序使用同一个 DLL ,那么多个程序都将从该更新或修复中获益。当您使用定期更新或修复的第三方 DLL 时,此问题可能会更频繁地出现。

    二、 DLL 的创建及调用

    1、创建:新建 -> 项目->类库  ,名称为:dlltest

       

    2、添加代码

    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace dlltest
    
    {
        public class Class1
        {
            //你自己要编译成动态库的程序,以下为示例
    
            public void ShowMessage(string text)
            {
                Console.WriteLine("你调用了动态链接库!");
                MessageBox.Show(text,"消息提示");
            }
    
        }
    }

    然后生成解决方案,在工程bin/Debug下即可找到名称为dlltest.dll的文件

    3、使用:

    1)添加引用 
                右击项目-添加引用-浏览 找到本地的dll文件

    image

    2)using 该dll文件里面代码的名称空间

    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    //using 要引用的dll文件的命名空间
    using dlltest;
     
    namespace DllExample
    {
        class Program
        {
            static void Main(string[] args)
            {
                dlltest.MyClass myTest = new dlltest.MyClass();
                myTest.ShowMessage();
            }
        }
    
    展开全文
  • DLL动态链接库(Dynamic-Link Library)的缩写,相当于Linux下的共享对象。Windows系统中大量采用DLL机制,甚至内核的结构很大程度依赖于DLL机制。Windows下的DLL文件和EXE文件实际上是一个概念,都是PE格式的二...
    1. DLL即动态链接库(Dynamic-Link Library)的缩写,相当于Linux下的共享对象。Windows系统中大量采用DLL机制,甚至内核的结构很大程度依赖于DLL机制。Windows下的DLL文件和EXE文件实际上是一个概念,都是PE格式的二进制文件。一般的动态库程序有lib文件和dll文件,lib文件是编译时期连接到应用程序中的,而dll文件才是运行时才会被调用的。

    2. 为了根号的理解DLL,首先要有导入和导出的概念。
      a. 在ELF(Linux下动态库的格式),共享库中所有的全局函数和变量在默认情况下都可以被其它模块使用,即ELF默认导出所有的全局符号。DLL不同,需要显示地“告诉”编译器需要导出某个符号,否则编译器默认所有的符号都不导出。
      b. 程序使用DLL的过程其实是引用DLL中导出函数和符号的过程,即导入过程。对于从其他DLL导入的符号,需要使用“_declspec(dllimport)”显示声明某个符号作为导入符号在ELF中,使用外部符号时,不需要额外声明该符号从其他共享对象导入的

    3. 指定符号的导入导出一般有如下两种方法:
      (1)MSVC编译器提供了一系列C/C++的扩展***来指定符号的导入导出,即_declspec属性关键字***。
      a. _declspec(dllexport)表示该符号是从本DLL导出的符号
      b. _declspec(dllimport)表示该符号是从别的DLL中导入的
      (2)使用".def"文件来声明导入和导出符号,详细参考http://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/04/1792099.html

    4. 创建DLL
      这里介绍的是使用VS2017创建DLL。
      (1)
      在这里插入图片描述
      (2)
      在这里插入图片描述
      (3)
      在这里插入图片描述
      (4)运行,生成.dll和.lib文件
      在这里插入图片描述

    5. DLL的调用方式
      windows下调用方式有两种,一种是“隐式调用”,另外一种是“显示调用”(这里主要介绍隐式调用)。
      a. 显示调用:不需要使用.lib文件,直接使用函数加载库,如下图所示:
      在这里插入图片描述
      b. 隐式调用
      (1)创建一个测试工程,将使用到的dll放到对应的运行目录下,同时将dll用到的导出类的头文件也拷贝到该工程下(include文件夹)、lib文件也放到该文件夹下(lib文件夹)。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      (2)配置工程属性
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      (3)在需要使用的地方,包含头文件即可使用
      在这里插入图片描述

    展开全文
  • dll动态链接库文件编写

    千次阅读 2018-04-12 18:15:39
    dll动态链接库文件编写 转载 2017年12月02日 20:50:52 标签: ...

    dll动态链接库文件编写

    转载 2017年12月02日 20:50:52

    1.动态链接库(dll)概述

    没接触dll之前觉得它很神秘,就像是一个黑盒子,既不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其他dll调用来完成某项工作的函数,只有在其他模块调用dll中的函数时,dll才发挥作用。 
    在实际编程中,我们可以把完成某项功能的函数放在一个动态链接库里,然后提供给其他程序调用。像Windows API中所有的函数都包含在dll中,如Kernel32.dll, User32.dll, GDI32.dll等。那么dll究竟有什么好处呢?

    1.1 静态库和动态库

    • 静态库:函数和数据被编译进一个二进制文件(扩展名通常为.lib),在使用静态库的情况下,在编译链接可执行文件时,链接器从静态库中复制这些函数和数据,并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.exe)。当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。
    • 动态库:在使用动态库时,往往提供两个文件:一个引入库(.lib,非必须)和一个.dll文件。这里的引入库和静态库文件虽然扩展名都是.lib,但是有着本质上的区别,对于一个动态链接库来说,其引入库文件包含该动态库导出的函数和变量的符号名,而.dll文件包含该动态库实际的函数和数据。

    1.2 使用动态链接库的好处

    1. 可以使用多种编程语言编写:比如我们可以用VC++编写dll,然后在VB编写的程序中调用它。
    2. 增强产品功能:可以通过开发新的dll取代产品原有的dll,达到增强产品性能的目的。比如我们看到很多产品踢动了界面插件功能,允许用户动态地更换程序的界面,这就可以通过更换界面dll来实现。
    3. 提供二次开发的平台:用户可以单独利用dll调用其中实现的功能,来完成其他应用,实现二次开发。
    4. 节省内存:如果多个应用程序使用同一个dll,该dll的页面只需要存入内存一次,所有的应用程序都可以共享它的页面,从而节省内存。

    2. dll的创建

    dll的创建主要有两种方法:一是使用 __declspec(dllexport) 创建dll,二是使用模块定义(.def)文件创建dll。

    2.1 使用 __declspec(dllexport) 创建dll

    首先在VS中的Visual C++中创建一个Win32 Project,取名为Dll1。在Application Type中选择DLL,在Additional options中选择Empty project,即创建一个空的动态链接库工程。 
    这里写图片描述 
    然后为工程添加一个C++源文件:Dll1.cpp,假设我要实现的是加法和减法运算,则代码如下:

    __declspec(dllexport) int add(int a, int b){
        return a + b;
    }
    
    __declspec(dllexport) int subtract(int a, int b){
        return a - b;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    为了让dll导出函数,需要在每一个需要被导出的函数前面加上标识符:__declspec(dllexport)。 
    利用Build命令生成Dll1动态链接库,这时在Dll1/Debug目录下就会生成.dll文件和.lib文件,这两个文件即为所需的动态链接库的文件。 
    这里写图片描述 
    既然已经有了这个dll文件,是不是就可以在其他程序中访问该dll中的add和subtract函数了呢?必须注意的一点是:应用程序如果想要访问某个dll中的函数,那么这个函数必须是已经被导出的函数。 
    为了查看一个dll中有哪些导出函数,Visual Studio提供了一个命令行工具:Dumpbin。

    2.2 使用Dumpbin命令确认dll的导出函数

    首先在命令行中进入到VS的安装目录下,运行一个名为VCVARS32.bat的批处理程序(对于VS2013来说,该bat文件位于\VC\bin目录下),该文件的作用是用来创建VC++使用的环境信息。(注意,当在命令行界面执行VCVARS32.bat文件后,该文件设置的环境信息只在当前命令行窗口生效。) 
    然后输入dumpbin命令,即可列出该命令的使用方法: 
    这里写图片描述 
    那么想要查看一个dll提供的导出函数,在Dll1.dll文件所在目录下,在命令行中输入下述命令:

    dumpbin -exports Dll1.dll

    这里写图片描述

    在上图中可以看到我们导出了两个函数,但是导出函数的名称长得很奇怪,add导出函数的名称是“?add@@YAHHH@Z”,subtract导出函数的名称是“?subtrct@@YAHHH@Z”。这是因为在编译链接时,C++会按照自己的规则篡改函数的名称,这一过程称为“名字改编”。这会导致不同的编译器、不同的语言下调用dll发生问题。因此我们希望动态链接库文件在编译时,导出函数的名称不要发生变化。 
    为了实现这一目的,可以再定义导出函数时加上限定符:extern “C”,如

    extern "C" __declspec(dllexport) int add(int a, int b){
    //...
    }
    • 1
    • 2
    • 3

    但是这种方式只能解决C++和C语言之间相互调用时函数命名的问题。为了彻底解决这个问题,可以通过模块定义(.def)文件实现。

    2.3 使用模块定义(.def)文件创建dll

    使用def文件创建dll的话就不再需要__declspec(dllexport),因此将代码写成最原始的样子:

    int add(int a, int b){
        return a + b;
    }
    
    int subtract(int a, int b){
        return a - b;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    同时为工程创建一个后缀名为.def的文件,并添加进工程,编辑其内容为:

    LIBRARY Dll1
    
    EXPORTS
    add
    subtract
    • 1
    • 2
    • 3
    • 4
    • 5

    其中LIBRARY语句用于指定动态链接库的名称,该名称与生成的动态链接库名称一定要匹配。EXPORTS语句用于表明dll将要导出的函数,以及为这些导出函数指定的符号名。 
    将该模块定义文件链接到工程中,方法为工程属性页面>链接器>输入>模块定义文件中写入“Dll1.def”。 
    这里写图片描述 
    然后重新Build Solution,并用dumpbin工具查看现在dll导出的函数,可以发现函数的名字改编问题得到了解决! 
    这里写图片描述


    以上就是创建dll的两种方法,个人比较提倡使用模块定义(.def)文件创建dll,代码简洁的同时还没有名字改编的问题。 
    接下来我们来看看如何使用创建好的dll。

    3. dll的使用

    dll的使用也有两种方法,一是隐式链接的方式加载dll,二是显示加载方式加载dll。

    3.1 隐式链接方式加载dll

    为了更好地展示dll的使用,我首先创建了一个基于MFC的对话框程序,然后为其添加两个按钮。 
    这里写图片描述 
    将生成好的Dll1.dll和Dll1.lib复制到对话框程序所在的文件夹,然后在CXXXDlg.h中注册动态链接库的引入库文件。因为.lib文件包含了Dll1.dll中导出函数的符号名,相当于告诉对话框程序相关函数应该去dll中调用。

    #pragma comment(lib,"Dll1.lib")
    • 1

    然后在CXXXDlg.cpp中声明外部函数:

    _declspec(dllimport) int add(int a, int b);
    _declspec(dllimport) int subtract(int a, int b);
    • 1
    • 2

    这样我们就可以使用这两个函数了。为两个按钮添加事件响应程序,并添加如下代码:

    void CXXXDlg::OnBtnAdd()
    {
        // TODO: Add your control notification handler code here
        CString str;
        str.Format(_T("5 + 3 = %d"), add(5, 3));
        MessageBox(str);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行程序发现可以通过dll的导出函数来实现加法功能了。说明dll可以使用。 
    这里写图片描述

    3.2 显示加载方式加载dll

    另一种是通过LoadLiabrary函数显示加载dll。代码如下。需要注意的是这时候我们不再需要注册.lib文件,也不需要声明外部函数。只要在需要使用的地方调用dll文件即可。

    void CXXXDlg::OnBtnSubtract()
    {
        // TODO: Add your control notification handler code here
        HINSTANCE hInst;
        hInst = LoadLibrary(L"Dll1.dll");
        typedef int(*SUBPROC)(int a, int b);
        SUBPROC Sub = (SUBPROC)GetProcAddress(hInst, "subtract");
        CString str;
        str.Format(_T("5-3=%d"), Sub(5, 3));
        FreeLibrary(hInst);       //LoadLibrary后要记得FreeLibrary
        MessageBox(str);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这里写图片描述

    3.3 两种加载方式对比

    通过以上的例子,可以看到隐式链接和动态加载两种加载dll的方式各有优点。

    • 隐式链接方式实现简单,一开始就把dll加载进来,在需要调用的时候直接调用即可。但是如果程序要访问十多个dll,如果都采用隐式链接方式加载他们的话,在该程序启动时,这些dll都需要被加载到内存中,并映射到调用进程的地址空间,这样将加大程序的启动时间。而且一般来说,在程序运行过程中只是在某个条件满足的情况下才需要访问某个dll中的函数,如在上述例子中,我只有在点击按钮时才需要访问dll,其他情况下并不需要访问。这样如果所有dll都被加载到内存中,资源浪费是比较严重的。
    • 显示加载的方法则可以解决上述问题,dll只有在需要用到的时候才会被加载到内存中。另外,其实采用隐式链接方式访问dll时,在程序启动时也是通过调用LoadLibrary函数加载该进程需要的动态链接库的。

    本文将创建一个简单的动态链接库,并编写一个控制应用程序使用该动态链接库,该动态链接库为“JAVA调用动态链接库DLL之JNative学习”中使用的DLL,只是项目及文件名称不同。

    创建动态链接库项目:
    1、打开Microsoft Visual Studio 2010,选择文件->新建->项目。


    2、在新建项目窗口中选择其他语言->Visual C++->Win32。


    3、选择Win32 项目,设置名称:simpleDLL,设置解决方案名:simpleDLL
    4、单击确定,在出现的Win32 应用程序向导的概述对话框中点击下一步。


    5、在应用程序设置中,选择应用程序类型下的DLL。


    6、勾选附加选项下的空项目。
    7、单击完成创建项目。
    向动态链接库添加类:
    1、添加新类头文件。右键单击simpleDLL项目,添加->新建项,选择头文件(.h),设置名称为simpleDLL,单击添加。



    2、添加新类源文件。右键单击simpleDLL项目,添加->新建项,选择C++ 文件(.cpp),设置名称为simpleDLL,单击添加。



    3、为新类添加内容。内容如下:

    头文件simpleDLL.h:

    [cpp] view plain copy




    1. //—————— SimpleDLL.h —————-  

    2.   

    3. #pragma once;  

    4.   

    5. //该宏完成在dll项目内部使用__declspec(dllexport)导出  

    6. //在dll项目外部使用时,用__declspec(dllimport)导入  

    7. //宏DLL_IMPLEMENT在SimpleDLL.cpp中定义  

    8. #ifdef DLL_IMPLEMENT  

    9. #define DLL_API __declspec(dllexport)  

    10. #else  

    11. #define DLL_API __declspec(dllimport)  

    12. #endif  

    13. DLL_API int add(int x, int y); //简单方法  

    14. DLL_API const wchar_t getPlayUrl(const wchar_t mgrIp, long mgrPort, long materialId);  

    15. DLL_API const char getUrl(const char mgrIp, long mgrPort, long materialId);  

    源文件simpleDLL.cpp:

    [cpp] view plain copy
    1. //—————— SimpleDLL.cpp —————-  
    2.   
    3. //注意此处的宏定义需要写在#include “SimpleDLL.h”之前  
    4. //以完成在dll项目内部使用__declspec(dllexport)导出  
    5. //在dll项目外部使用时,用__declspec(dllimport)导入  
    6. #define DLL_IMPLEMENT  
    7.   
    8. #include “SimpleDLL.h”  
    9. #include<Windows.h>  
    10. #include <intrin.h>  
    11. #include <stdlib.h>  
    12. #include <string.h>  
    13.   
    14. int DLL_API add(int x, int y)  
    15. {  
    16.     return x+y;  
    17. }  
    18.   
    19. DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId)  
    20. {  
    21.     static wchar_t url[260] = { 0 };  
    22.     wcscpy_s(url, L”http://中文”);  
    23.     wcscat_s(url, mgrIp);  
    24.     wcscat_s(url, L”:”);  
    25.     wchar_t szPort[20] = { 0 };  
    26.     _ltow_s(mgrPort, szPort, 10);  
    27.     wcscat_s(url, szPort);  
    28.     return url;  
    29. }  
    30.   
    31. DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId)  
    32. {  
    33.     static char url[260] = { 0 };  
    34.     strcpy_s(url, ”http://中文”);  
    35.     strcat_s(url, mgrIp);  
    36.     strcat_s(url, ”:”);  
    37.     char szPort[20] = { 0 };  
    38.     _ltoa_s(mgrPort, szPort, 10);  
    39.     strcat_s(url, szPort);  
    40.     return url;  
    41. }  

    创建引用动态链接库的应用程序:
    1、在解决方案上单击鼠标右键->添加->新建项目。


    2、在添加新项目中选择其它语言->Visual C++->Win32。


    3、选择Win32 控制台应用程序,设置名称:simpleDLLTest。
    4、单击确定,在出现的Win32 应用程序向导的概述对话框中点击下一步。


    5、在应用程序设置中,选择应用程序类型下的控制台应用程序。


    6、单击完成创建项目
    在控制台应用程序中使用类库的功能:
    1、为SimpleDLLTest.cpp添加内容。如下所示:

    [cpp] view plain copy
    1. // SimpleDLLTest.cpp : 定义控制台应用程序的入口点。  
    2.   
    3. #include “stdafx.h”  
    4. #include ”../SimpleDLL/SimpleDLL.h” //添加头文件引用  
    5. #pragma comment(lib, ”..\\..\\SimpleDLL\\Release\\SimpleDLL.lib”) //添加lib文件引用   
    6. #include <process.h>  
    7. #include <locale.h>  
    8.   
    9. int _tmain(int argc, _TCHAR* argv[])  
    10. {  
    11.     setlocale(LC_ALL, ”chs”); //配置地域化信息为简体中文,否则打印出来的中文是乱码  
    12.     wprintf(L”getPlayUrl: %s\r\n”, getPlayUrl(L“127.0.0.1”, 10087, 1));  
    13.   
    14.     printf(”getUrl: %s\r\n”, getUrl(“127.0.0.1”, 10087, 1));  
    15.     system(”pause”);  
    16.     return 0;  
    17. }  
    2、引用simpleDLL项目。右键单击SimpleDLLTest项目,选择项目依赖项。


    3、依赖于窗口中勾选SimpleDLL,单击确定。


    4、设置SimpleDLLTest项目为活动项目。右键单击SimpleDLLTest项目,选择设为启动项目。


    6、生成解决方案。Debug运行结果如下:


    注意:现在创建的DLL只能由c++调用,C语言等其它语言是调用不了的!

    我们来用工具看一下,在解决方案上单击鼠标右键,在Windows资源管理器中打开文件夹


    我编译的是Release版本,所以打开Release文件夹,找到SimpleDLL.dll文件,用Depends工具打开它


    目前编译的版本对MSVCR100.DLL还有依赖,这样复制到其它没有安装VS2010的电脑上是用不了的;

    在项目上单击鼠标右键,属性:


    在左侧的配置属性中选择常规,在右侧找到MFC的使用,选择在静态库中使用MFC


    这里是修改MFC的使用,还有另一种方法:vs2010发布时去除msvcp100.dll和msvcr100.dll图解说明

    再看函数,带有一些特殊字符,这样c++之外其它语言是调用不了的;我们需要在头文件的函数声明中添加extern “C”标志,代码如下:

    [cpp] view plain copy
    1. //—————— SimpleDLL.h —————-  
    2.   
    3. #pragma once;  
    4.   
    5. //该宏完成在dll项目内部使用__declspec(dllexport)导出  
    6. //在dll项目外部使用时,用__declspec(dllimport)导入  
    7. //宏DLL_IMPLEMENT在SimpleDLL.cpp中定义  
    8. #ifdef DLL_IMPLEMENT  
    9. #define DLL_API __declspec(dllexport)  
    10. #else  
    11. #define DLL_API __declspec(dllimport)  
    12. #endif  
    13. extern “C” DLL_API int add(int x, int y); //简单方法  
    14. extern “C” DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId);  
    15. extern “C” DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);  
    重新编译,再Depends工具打开它,可以发现依赖项已经没有了,函数名称也正常了:


    参考:演练:创建和使用动态链接库 (C++)

    解决方案源码下载:http://download.csdn.net/detail/testcs_dn/7411383






    $(".MathJax").remove();

    展开全文
  • VS2017动态链接库(.dll)的生成与使用

    万次阅读 多人点赞 2017-07-31 19:39:40
    这里以VS2017为例子,讲解一下动态链接库(.dll)的生成与使用。 一、动态链接库(.dll)的生成 1、打开:“文件”-“新建”-“项目” 2、打开:“已安装”-“模板”-“Visual C++”-“Win32”-“Win32 控制台应用...
  • DLL动态链接库

    2015-07-23 11:58:02
    引子 前面介绍的几种用于实现进程之间通信的方法都是比较正统的方式, 像剪贴板,命名管道这些都还是用得比较多的, 而这里将介绍的是一种比较偏门的方法来实现进程间的通信, ...动态链接库DLL)概述
  • 什么是DLL动态链接库)? &nbsp; &nbsp;DLL是一个包含可由多个程序同时使用的代码和数据的库。例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数。因此,每个程序都可以使用该DLL中...
  • Windows平台下的动态链接库DLL

    千次阅读 2018-08-20 21:04:23
    Windows平台下的动态链接库DLL动态链接库DLL(Dynamic Link Library)文件又称"应用程序拓展",是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的...
  • DLL有三种调试方法: 方法1: 如果动态链接库是自己编写的,并且测试代码也是自己编写的,那么此时我们可以将动态链接库和测试代码的工程建立在一起,在调试测试代码的时候,可以直接调用动态链接库中的代码。...
  • Windows 动态链接库 DLL 浅析

    万次阅读 多人点赞 2013-03-26 17:51:54
    DLL:Dynamic Link Library,即动态链接库,这种库包含了可由多个程序同时使用的代码和数据。 它是microsoft在windows操作系统中实现共享函数库概念的一种实现方式。其中windows中 一些作为DLL实现的文件有: ...
  • DLL动态链接库的工作原理

    万次阅读 2012-08-29 11:12:12
    而对于DLLs,函数储存在一个独立的动态链接库文件中。在创建Windows程序时,链接过程并不把DLLs文件链接到程序上。直到程  序运行并调用一个DLLs中的函数时,该程序才要求这个函数的地址。此时Windows才在DLLs中...
  • 简单实现python调用c#dll动态链接库 在python调用c#dll库时要先安装库clr,即安装pythonnet,参考文章:https://www.cnblogs.com/kevin-Y/p/10235125.html(为在python中使用dotnet程序...
  • VS2017创建DLL动态链接库方法

    千次阅读 2019-02-20 12:11:58
    2.选择C++下面的windows桌面,右边选择动态链接库DLL)。新建成功之后,默认为x86平台。 按照你自己的需求更换平台,必须调用的和被调用的dll同为一个平台。 3.新建之后,在头文件中添加mydll.h,内容为: #...
  • C#加载C++\C的DLL动态链接库
  • 1、dll动态库文件项目生成属性中要勾选“XML文档文件”注意:1)、要选中项目,查看项目属性,选中解决方案是找不到的。2)、XML文件的名字不要修改。2、添加引用时XML文件要与DLL文件在同一个目录下。3、如果要是...
  • [DllImport("JNetSDK.dll")] public static extern long JNetLogin(string lpszIP, int iDevPort, string lpszUser, string lpszPassword, int iTimeOut, fcbJEvent * pfcbEvent, DWORD dwProtocol, long &lLogin, ...
  • modbus TCP dll 动态链接库 源码 经测试,文件可以正常解压。 如果无法正常解压的,请将压缩软件升级到最新版。
  • c#创建Dll动态链接库C#使用动态链接库 浏览: 22309 | 更新: 2011-04-12 19:04 59 32 全文阅读分步阅读 步骤 1 2 3 4 5 6 7 8 内容简介 ...
  • 【专题】C#调用动态链接库DLL

    千次阅读 2019-02-23 09:29:40
    动态链接库(Dynamic Linked Library):将写好的函数存在库中,以供其他程序开发调用,调用方式为“动态的”。  Windows为应用程序提供了丰富的函数调用,这些函数调用都包含在动态链接库中。其中有3个最重要的DLL,...
  • 如何使用Python调用dll动态链接库

    万次阅读 2018-12-08 00:11:15
    .dll是使用C或者C++编译的动态链接库,一般留有函数入口可以进行调用。 首先我们通过阅读原项目的源码,找到入口的函数名称、传参规则和类型、返回值类型。 然后使用Python ctype库加载dll库,并且调用函数,得到...
  • c#创建Dll动态链接库C#使用动态链接库 浏览:26863 |更新:2011-04-12 19:04 1 2 3 4 5 6 7 分步阅读 内容简介 介绍如何是使用C#来完成动态链接库的...
  • python调用dll动态链接库

    万次阅读 2018-05-09 17:51:58
    还是调用动态库,各种调用,但是呢,Python调用dll貌似不麻烦,至少我第一次就调用成功嘞。至于Python,我连语法都不知道,不过问题不大,边百度边写。环境:好像都可以,Python我在官网下载的python-3.6.4-amd64。...
  • 使用Java调用dll动态链接库

    千次阅读 2016-11-30 19:04:23
    DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中...
  • 最近编写C#程序调用C++语言的算法库,自己尝试在C++中封装好DLL库,并在一个工程文件中同时导出多个函数供C#调用。多个函数之间需要相互通信,但又不能互相调用,,一个很好的方法就是用全局变量来实现,其问题是,...
  • Java调用C#dll全过程

    千次阅读 2013-08-13 12:06:58
    Java调用C#dll全过程 Java调用默认邮件程序(Windows live mail & IBM Lotus)的同时加上附件 目录 ——看目录者,原地满血满蓝复活! 1.吐槽Java 2.实现的功能描述及概述 3.Java调用C# dll 步骤 4.总结 --...
  • Java下(Eclipse中)调用DLL动态链接库的方法 2011-03-09 21:26 今天试了试JNI,有了点心得体会,记下来,以备后用,也给大家一起分享分享! 使用到的工具包括:Eclipse、VC6.0、cmd、notepad Java...
  • C# DLL 注入 (转)

    千次阅读 2011-03-02 09:57:00
    C#中的DLL注入
  • KERNEL32.dll动态链接库报错解决方法

    万次阅读 2015-12-08 23:52:29
    ... 在Windows XP安装游戏或一些程序时,如百度云管理等软件面向Windows 7高版本的系统,对Windows XP兼容性不那么注重了,会出现错误提示:“定位程序输入点GetlogicalprocessorInformat
  • 怎样用VB编写.DLL动态链接库文件

    千次阅读 2010-07-13 14:20:00
    一、名词解释: DLL 的学名叫 动态链接库 二、它是干什么用的: 搜索一下有很完整详细的解释。这里,我只引用过来当中的一句话 “在Windows中,许多应用程序并不是一个完整的可执行文件,...
  • JavaWeb项目中调用dll动态链接库

    万次阅读 2017-01-07 13:45:53
    介绍 先简单介绍下遇到的问题,需要在web页面中增加身份证内的头像图片。头像图片已经通过身份证采集器采集并存储在Oracle数据库的blob中。但是存储的二进制数据是...Java调用dll动态链接库 最先尝试的是JNI的方法,

空空如也

1 2 3 4 5 ... 20
收藏数 217,582
精华内容 87,032
关键字:

dll动态链接库