C++调用dll文件的两种方法

DLL中导出函数的声明有两种方式:一种是在函数声明中加上_declspec(dllexport)关键字,另一种方式就是采用模块定义文件声明。.def 文件为连接器提供了有关被链结程序的导出、属性及其他方面的信息。在连接阶段,可以使用/DEF(指定模块定义文件)连接器选项调用.def 文件。

.def 文件必须至少包含下列模块定义语句: 
1】文件中的第一个语句必须是LIBRARY 语句。此语句将 .def 文件标识为属于 DLL。 LIBRARY 语句的后面是 DLL 的名称。 链接器将此名称放到 DLL 的导入库中。 
2】EXPORTS 语句列出名称,可能的话还会列出 DLL 导出函数的序号值。在函数名的后面加上 @ 符和一个数字,给函数分配序号值。 当指定序号值时,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。使用符号时外部调用程序可以使用函数名称和序号加载函数。 
 
可以尝试以下步骤使用Def文件创建一个DLL。
1】新建一个win32 console application,选择DLL项目类型,创建一个空项目。
2】在工程中添加一个.cpp文件,输出以下代码。

     int __stdcall add(int a, int b)
    {
       return (a + b);
    }    
    int __stdcall sub(int a, int b)
    {
       return (a - b);
    }

3】在工程中添加一个.def 文件,命名为my.def,输入以下代码:
  LIBRARY my
  EXPORTS  
  add 
  sub

4】编译项目,在解决方案目录下,就会生成.dll 和 .lib 文件。

 

应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windows系统目录, 4.Windows目录,5.列在Path环境变量中的一系列目录。

  1.隐式链接

  隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为TestDll,在DllTest.h、DllTest.cpp文件中分别输入如下代码:


//Dlltest.h
#pragma comment(lib,"MyDll.lib")
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
//TestDll.cpp
#include
#include"Dlltest.h"
void main()
{int a;
a=min(8,10)
printf("比较的结果为%d\n",a);
}


  在创建DllTest.exe文件之前,要先将MyDll.dll和MyDll.lib拷贝到当前工程所在的目录下面,也可以拷贝到windows的System目录下。如果DLL使用的是def文件,要删除TestDll.h文件中关键字extern "C"。TestDll.h文件中的关键字Progam commit是要Visual C+的编译器在link时,链接到MyDll.lib文件,当然,开发人员也可以不使用#pragma comment(lib,"MyDll.lib")语句,而直接在工程的Setting->Link页的Object/Moduls栏填入 MyDll.lib既可。

  2.显式链接

  显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用 LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。


#include
#include
void main(void)
{
typedef int(*pMax)(int a,int b);
typedef int(*pMin)(int a,int b);
HINSTANCE hDLL;
PMax Max
HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
Max=(pMax)GetProcAddress(hDLL,"Max");
A=Max(5,8);
Printf("比较的结果为%d\n",a);
FreeLibrary(hDLL);//卸载MyDll.dll文件;
}

  在上例中使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针,然后通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄,然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,函数调用完毕后,使用FreeLibrary()卸载DLL文件。在编译程序之前,首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。

  使用显式链接应用程序编译时不需要使用相应的Lib文件。另外,使用GetProcAddress()函数时,可以利用MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,"Min")改为GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函数Min()在DLL中的顺序号是2),这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。

原博地址:https://blog.csdn.net/lu1012123053/article/details/8109523

  • 4
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: c 调用 dll demo 是指使用 C 语言编写程序,调用一个动态链接库(DLL)示例。动态链接库是一种包含可供其他程序调用的函数和资源的文件。通过调用 DLL,C 程序可以使用 DLL 中提供的功能,实现各种功能扩展。 首先,我们需要使用 C 语言编写一个调用 DLL 的程序。在程序中,我们需要包含 DLL 的头文件,并声明需要调用的函数的原型。然后,我们通过调用 LoadLibrary 函数加载 DLL 文件,并使用 GetProcAddress 函数获取 DLL 中需要调用的函数地址。最后,我们可以通过调用获取的函数地址来调用 DLL 中的函数。 例如,我们创建一个名为 main.c 的文件,其中包含以下代码: ```c #include <stdio.h> #include <windows.h> typedef int (*MY_DLL_FUNC)(int); // 定义函数指针类型,用于存储 DLL 中的函数地址 int main() { HMODULE hDll = LoadLibrary("demo.dll"); // 加载 DLL 文件 if (hDll == NULL) { printf("无法加载 DLL 文件。\n"); return -1; } MY_DLL_FUNC myFunc = (MY_DLL_FUNC)GetProcAddress(hDll, "my_function"); // 获取函数地址 if (myFunc == NULL) { printf("无法找到函数。\n"); return -1; } int result = myFunc(10); // 调用函数 printf("DLL 函数返回值为:%d\n", result); FreeLibrary(hDll); // 释放 DLL return 0; } ``` 在上述代码中,我们加载了一个名为 demo.dllDLL 文件,并从中获取了名为 my_function 的函数的地址。然后,我们将参数 10 传递给 my_function,并打印其返回值。 编译并运行上述代码后,即可成功调用 DLL 中的函数,并获得对应的结果。这样,我们就实现了通过 C 调用 DLL 的示例。 需要注意的是,实际的 DLL 文件中的函数名和参数类型可能会有所不同,需要根据具体情况进行修改。另外,在使用完成后,需要使用 FreeLibrary 函数释放已加载的 DLL。 ### 回答2: 调用dll demo 是指在编程中使用动态链接库(Dynamic Link Library)来实现某种功能。DLL是一种可供多个程序共享使用的库文件,其中包含一些函数和数据,通过调用这些函数可以实现一些特定的操作。下面是一个简单的调用dll demo的示例: 首先,我们需要确定要调用dll文件的名称和路径。通常,dll文件需要与程序在同一目录下,或者在系统的搜索路径中。 接下来,在程序中引入dll文件。这可以通过使用import关键字或者使用专门的函数来实现。 然后,我们需要确定要调用的函数的名称和参数。我们可以通过查看dll文件的文档或者使用一些工具来获取这些信息。一旦确定了函数的名称和参数,我们就可以使用这个函数来实现我们想要的操作。 最后,我们需要在程序中调用dll函数。这可以通过使用函数名称和参数来实现。调用dll函数的过程中,我们需要注意参数的类型和顺序,确保和dll函数的定义一致,以免出现错误。 调用dll demo的过程中,我们需要注意一些问题。首先,确保dll文件的正确性和完整性,防止出现无法调用或者调用错误的问题。其次,我们需要合理处理dll函数返回的结果,以确保程序的正确运行。此外,还需要注意程序的兼容性和可移植性,以便在不同的平台和环境中都能够正常运行。 总之,调用dll demo 是一种常见的编程技术,通过使用动态链接库可以方便地实现一些功能。在使用过程中,我们需要明确dll文件的名称和路径,引入dll文件,确定要调用的函数和参数,最后在程序中调用dll函数。同时,我们还需要注意dll文件的正确性和完整性,处理函数返回的结果,并保证程序的兼容性和可移植性。 ### 回答3: C 调用 DLL demo 是指在 C 语言中调用动态链接库(DLL)的示例程序。DLL 是一种包含可被共享和重复使用的代码和数据的文件,它可以被不同的程序同时使用,从而提高代码的重用性和灵活性。 在 C 语言中,调用 DLL 需要使用特定的函数和约定。首先,需要在程序中包含 DLL 的头文件,其中包含了 DLL 中导出函数的声明。接下来,在代码中使用提供的函数名来调用 DLL 中的函数。 具体的示例程序可能如下: ``` #include <stdio.h> #include <windows.h> // 声明 DLL 中的函数 typedef int (*AddFunction)(int, int); int main() { HINSTANCE hDll; // DLL的句柄 AddFunction add; // 对应 DLL 中的函数指针 // 加载 DLL hDll = LoadLibrary("demo.dll"); if (hDll != NULL) { // 获取 DLL 中的函数地址 add = (AddFunction)GetProcAddress(hDll, "Add"); if (add != NULL) { int result = add(3, 5); printf("The result is: %d\n", result); } else { printf("Failed to find the 'Add' function in the DLL.\n"); } // 卸载 DLL FreeLibrary(hDll); } else { printf("Failed to load the DLL.\n"); } return 0; } ``` 上述示例代码中,首先使用 `LoadLibrary` 函数加载 DLL,然后使用 `GetProcAddress` 函数获取 DLL 中的函数地址,再通过函数指针调用 DLL 中的函数。最后,使用 `FreeLibrary` 函数卸载 DLL。 当运行该示例程序时,会调用 DLL 中的 `Add` 函数,该函数接受两个整数参数并返回它们的和。程序输出结果为两个整数相加的和。 需要注意的是,上述示例中的函数名和参数类型需要根据实际情况进行修改。另外,确保 DLL 文件与程序在同一目录下或者可以通过正确的路径访问到它,以便成功加载 DLL
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值