生成Dll文件
新建项目,选择Win32项目,工程名:09DllDemo 确定后,选择应用程序设置, 应用程序类型选择DLL(D),附加选项上选择 导出符号(X)(便于学习)。单击完成,完成工程创建。
-----------------------------------------------------------------------------------------------------------------
打开 09DllDemo.cpp文件,因为选择导出符号的缘故,VC++自动给我们生成了
// 这是导出函数的一个示例。
extern "C"
{
// 这是导出函数的一个示例。
MY09DLLDEMO_API int fnMy09DllDemo()
{
return 42;
}
}
打开 09DllDemo.h 我们可以看到声明的函数。
//声明要导出的函数
extern "C"
{
MY09DLLDEMO_API int fnMy09DllDemo();
}
---------------------------------------------------------------------------------------------------------------------
我们自己要添加入的函数按上述格式添加就可以了。(加extern "C"能保证导出的Dll函数名不会变化。这里的描述可能有点问题)
选中项目,点生成,生成Dll文件的任务就完成了。最后09DllDemo工程产生的文件中有3个可以被其他工程所使用:09DllDemo.h 09DllDemo.dll 09DllDemo.lib。
.dll文件就是动态链接库,.lib是供程序开发用的导入库,.h文件包含了导出函数的声明。
调用Dll文件
调用Dll中的导出函数有两种方法:
1.装载期间动态加载。
模块可像调用本地函数一样调用从其他模板导出的函数(API函数就是这样调用的)。装载期间链结必须使用DLL的导入库(.lib)文件,它为系统提供了加载这个Dll和定位Dll中的导出函数所需的信息。
应用程序启动时由载入器(加载应用程序的组件)载入09DllDemo.dll文件。载入器如何知道要载入哪些Dll呢?这些信息记录在执行文件(PE文件)的idata节中。使用这种方法不用自己写代码显式加载DLL。
---------------------------
新建一个09ImportDemo的Win32控制台工程,将09DllDemo.h,09DllDemo.lib,09DllDemo.dll 3个文件拷贝到09ImportDemo目录下。
下面给出了调用导出函数fnMy09DllDemo的代码
#include "09DllDemo.h"
#include <iostream>
using namespace std;
#pragma comment(lib,"09DllDemo")
void main()
{
int a =fnMy09DllDemo();
cout<<a<<endl;
}
发布软件时必须将该软件使用的Dll与主程序一起发布。09ImportDemo.exe和09DllDemo.dll放在同一个目录下。载入器加载Dll文件时,默认情况是在应用程序的当前目录下查找,如果找不到就到系统盘"\windows\system32"文件夹下查找,还找不到就按错误处理。
--------------------------------------------------------------------------------------------------------------
2.运行期间动态加载。(只需Dll文件即可)
运行期间动态加载是在程序运行过程中显式得加载Dll库,从中导出需要的函数。
为了能够在运行期间动态导出函数,一般需要在09DllDemo工程中建立一个DEF文件来指定要导出的函数。
----添加DEF文件
打开09DllDemo工程,右键点击工程,选择添加,选择TextFile选项,输入文件名DllDemo.def
新的DllDemo.def中添加如果内容
=============================
EXPORTS
fnMy09DllDemo
=============================
重新生成下就完成了。
回到09ImportDemo工程,将程序修改为
------------------------------------------------------------------------------------------
#include <windows.h>
#include <iostream>
using namespace std;
//定义FunctionFunc为指向一个返回值为int型 无参数的函数的指针
typedef int (*FunctionFunc)();
int main()
{
FunctionFunc _FunctionFunc;
//加载目标Dll
HMODULE hModule = ::LoadLibrary(TEXT("D:\\09DllDemo.dll"));
if (hModule==NULL)//如果Dll加载失败,释放它占用的资源
{
::FreeLibrary(hModule);
}
//取得目标Dll中导出函数的地址(提醒:函数名就是函数的入口地址)
_FunctionFunc=(FunctionFunc)::GetProcAddress(hModule,"fnMy09DllDemo");
if (_FunctionFunc==NULL)
{
::FreeLibrary(hModule);
}
int a =_FunctionFunc();
cout<< a<<endl;
::FreeLibrary(hModule);
cin.get();
return 1;
}
------------------------------------------------------------------------------------------
c#中调用Dll
[DllImport("D:\\09DllDemo.dll")")]
public static extern int fnMy09DllDemo();
------------------------------------------------------------------------------------------
备注:
在没加extern "C"生成的Dll的函数名会有变化,因此在运行期间动态链结过程中,调用GetProcAddress会返回空值。
如不能修改Dll源码,可采用下面的方式解决(比较笨的方法,有好的请留言,谢谢):先用Depends.Exe(VS自带的工具)打开Dll文件,右键点击函数复制函数名。如获得的函数名为
?fnMy09DllDemo@@YAHXZ
C++中 直接
_FunctionFunc=(FunctionFunc)::GetProcAddress(hModule,?fnMy09DllDemo@@YAHXZ);
c#中
[DllImport("D:\\09DllDemo.dll", EntryPoint = "?fnMy09DllDemo@@YAHXZ")]
public static extern int fnMy09DllDemo();
分享到:
相关推荐
在IT领域,跨语言通信是常见的需求,尤其是在不同的编程环境中,比如从.NET Framework的C#调用非托管的C++代码。本主题聚焦于“通过C#调用共享MFC C++项目DLL”的过程,这涉及到COM(组件对象模型)技术、DLL(动态...
通过以上步骤,开发者可以在QT和MFC之间灵活地调用DLL,实现不同框架间的交互。然而,这样的跨框架调用可能会增加项目的复杂性,因此在设计时需要谨慎考虑依赖关系和接口的稳定性。同时,遵循良好的编程实践,如模块...
4. 调用DLL函数:由于已静态链接MFC,可以直接像使用本地函数一样调用DLL中的函数,无需`LoadLibrary`和`GetProcAddress`。 两种调用方式的比较: - 动态调用占用内存小,因为多个进程可以共享同一个DLL实例。但...
适用于收费版和免费版的插件调用,示例分了两个,前者是dll文件的生成,其中包含了免注册调用大漠,下载后别忘记找到插件放进目录;后者是调用这个dll的具体方法,其实很简单,可经常会搞错...希望对您有用。
调用DLL文件中的对话框_一个DLL的能成功_一个DLL不能成功DllDialogTest VS2010写的 一个基于对话框的MFC程序 然后创建两个常规动态DLL文件 在DLL文件中分别添加对话框 一个DLL的对话框能正常调用 另一个不行 均...
### VS2008中生成DLL项目及调用详解 #### 一、概述 本文将详细介绍如何在Visual Studio 2008 (简称VS2008)中创建DLL项目并进行调用的过程。首先解释DLL(动态链接库)与静态库的概念及其区别,接着介绍在VS2008中...
MFCDLL 生成及调用实例是C++编程领域中一个重要的实践课题,尤其是在Windows操作系统环境下,DLL(动态链接库)被广泛用于代码复用和模块化开发。本实例主要探讨如何创建MFC(Microsoft Foundation Classes)DLL以及...
5. **调用DLL**:在调用端,如"MFCApplication1",我们需要链接到生成的.lib文件,并在代码中包含DLL的头文件。对于非模态调用,我们通常使用`AfxLoadLibrary`和`AfxFreeLibrary`函数加载和卸载DLL,使用`...
现在,我们来详细讲解如何在C++ Windows工程中生成dump文件。 首先,我们需要包含相应的头文件。在`main.cpp`中,引入`windows.h`和`dbghelp.h`,这两个头文件分别提供了Windows API和用于处理dump文件的API: ```...
在VS2015中,选择“文件”>“新建”>“项目”,在模板列表中找到“Visual C++”>“MFC”,然后选择“MFC DLL”。为项目命名,例如“MFC_dll”,并设置合适的解决方案和存储位置。在项目属性中,确保“使用MFC”设置...
通过调用DLL,我们可以利用其内部实现的功能,而无需重新编写代码。 Python的`ctypes`模块提供了加载和调用DLL的方法。下面我们将详细介绍如何使用`ctypes`来调用C++编写的DLL。 1. 定义C++接口 在C++中,我们...
在C++中,我们首先需要创建一个包含DLL功能的MFC类库项目,然后定义接口函数,并生成对应的.lib文件。这个.lib文件包含了DLL的导入库,它告诉编译器如何连接到DLL中的函数。在主程序中,我们直接包含DLL的头文件,...
MFCDll调用例子是一个关于如何在Windows平台上利用Microsoft Foundation Class (MFC) 库创建和使用DLL(动态链接库)的学习资源。MFC 是一个C++类库,它为开发Windows应用程序提供了一种简化的方法,它封装了Windows...
在本文中,我们将深入探讨如何在Visual Studio 2005环境下使用MFC(Microsoft Foundation Classes)库创建和调用DLL(Dynamic Link Library)文件。首先,MFC是微软为Windows应用程序开发提供的一种C++类库,它封装...
MATLAB Compiler会生成相应的头文件和库文件,这些文件是C++调用DLL时必需的。 2. **配置VS2008 SP1项目**:在Visual Studio中创建一个新的C++项目,选择Win32控制台应用程序模板。在配置属性中,链接器的输入部分...
通过创建c++ clr项目dll_test_net,其内部封装纯c++ dll (dll_test_cpp),然后c#项目 test_net调用dll_test_net。 所有项目由vs2008创建。 防入坑提示: clr 项目 与 c# 项目 的 framework 必须一致 c++ dll 与 clr...
在MFC(Microsoft Foundation Classes)框架中调用C#编译的DLL库是跨语言编程的一个常见场景。本文将详细讲解如何实现这一过程,并提供一个实际应用实例。 首先,了解MFC与C#的背景。MFC是微软提供的C++类库,用于...
在DLL项目的源代码中,加载UI文件,实例化对应的窗口类,并提供公开的接口供MFC调用,例如: ```cpp // dllmain.h extern "C" __declspec(dllexport) void ShowQtDialog(); ``` ```cpp // dllmain.cpp #include ...
本文将通过一个简单的非MFC DLL示例来介绍DLL的基本概念、创建方法以及如何在其他程序中调用DLL中的函数。 #### 创建非MFC DLL 本示例中,我们将创建一个名为`dllTest`的非MFC DLL项目,该DLL提供了一个名为`add`...
在本文中,我们将深入探讨如何在C++环境中,特别是使用Microsoft Foundation Classes (MFC) 框架,生成和调用二维码动态库。MFC 是一个由微软开发的C++类库,它提供了构建Windows应用程序的接口。我们将讨论以下几个...