MFC点点滴滴——调用dll及会出现的问题

在编程中常常会用到别人封装好的dll文件,通常有两张调用的方法

一.隐式的加载时链接

需要xxx.dll文件、xxx.lib文件和xxx.h文件,其中将xxx.dll文件放在exe文件输出的文件夹下(debug文件夹),xxx.lib和xxx.h文件放在工程文件夹下。

(1)先将xxx.h文件添加至工程中(这个文件中有dll文件中函数声明,格式如

extern "C"__declspec(dllimport)函数返回类型
函数名
(参数列表

),然后在头文件中加入#include
"xxx.h"。

(2)将lib添加到工程中,有如下几种方法:

①LIB文件直接加入到工程文件列表中

  在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入xxx.lib文件即可。

  ②设置工程的 Project Settings来加载DLL的LIB文件

  打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中填写xxx.lib文件。

  ③通过程序代码的方式

   可以在xxx.h 文件中加入预编译指令#pragma comment (lib,"xxx.lib")

二.显式的运行时链接

只需要xxx.dll文件,将xxx.dll文件放在exe文件输出的文件夹下(debug文件夹)。

需要添加如下代码

1. typedef  函数返回值类型 ( * 函数别名 )
(参数列表);//和dll文件中定义的函数一致

2. HINSTANCE hDLL;

3. 函数别名 函数名;//定义一个函数别名类型的函数名

4. hDLL=LoadLibrary("xxx.dll");//加载动态链接库xxx.dll文件

5. 函数名=(函数别名)GetProcAddress(hDLL,"dll文件中的对应的函数名");

6.
函数名(参数);//调用函数即可

三.常见的报错信息

Debug
Error:

Program: ...

Module:

File: i386\chkesp.c

Line: 42

解决方法:

定义函数指针(二.显式的运行时链接 中代码第一行)时,声明
typedef
函数返回值类型 (CALLBACK * 函数别名)(参数列表)

其中(CALLBACK *也可以是_stdcall,WINAPI)。去掉CALLBACK。(这个问题困扰了我两天,但是还是不清楚原因,去掉winapi后,程序正常,希望有大神可以指点)

时间: 2024-10-27 14:00:16

MFC点点滴滴——调用dll及会出现的问题的相关文章

MFC动态调用dll到指定的进程中(win7系统vs2013环境下)

一.主程序 1.新建一个MFC项目,类型选择基于对话框 2.写一个简单的窗体 点击启动事件 MessageBox(L"调用Dll到程序中成功."); 二.要调用的Dll 1.新建一个win32dll 选择dll.勾选导出符号 1.生成Dll项目 此时会在主程序Main的debug文件夹中生成了Dll.dll和Dll.lib文件 三.配置主程序Main的属性 1.选择链接器--输入--附加依赖项:Dll.lib 1.选择连接器--输入--常规--附加库目录:..\Debug 1.包含头文

MFC之调用DLL的问题:error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR

今天在项目中遇到了一个小小的问题,在调用别人动态连接库(DLL)的时候,总是出现如下提示,导致程序无法正常运行,编程环境:VS2010+MFC 问题提示:error C2664: "LoadLibraryW": 不能将参数 1 从"const char *"转换为"LPCWSTR 经过查找资料,问题得以解决,感谢: 解决方法来源于:http://blog.sina.com.cn/s/blog_6a2236590100xbgl.html 1 静态调用Lib

?c++ 调用DLL函数,出现错误

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention. 错误原因

c++/c语言中如何调用DLL

参考网站如下: ?http://blog.csdn.net/yusongwhu/article/details/7577461 http://www.cnblogs.com/lhbssc/archive/2012/02/08/2342853.html 具体内容如下: (1)篇? 今天在研究怎么在vc中调用动态dll的问题,看了一个下午,总算有些眉目. 首先来说说调用的原理: 调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同

C#程序实现动态调用DLL的研究(转)

摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决“DLL Hell”提供了一种解决方案.这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也有相似的VB程序,但在某一技术论坛上提起这种设计方法时,有网友提出:“这种方法好是好,但就是启动

MFC的规则DLL与扩展DLL

一.MFC规则DLL MFC规则DLL可以在该dll内部使用MFC,但是与应用程序的接口不能是MFC的.能够被所有支持dll的编程语言所写的应用程序使用,当然也包括使用MFC创建的应用程序.在这种动态链接库中包含一个从CWinApp中继承而来的类,DllMain函数也被隐藏在其中了. 规则DLL包含俩类——静态链接到MFC上和动态连接到MFC上.静态链接到MFC上的规则DLL与MFC静态链接,将MFC的dll代码直接生成在该.dll中,在调用该dll时,使用的是该dll的资源句柄 :动态链接到M

VB6.0调用DLL

目录 第1章 VB6.0调用DLL    1 1 VC++编写DLL    1 1.1 使用__stdcall    1 1.2 使用 .DEF 文件    1 2 简单数据类型    2 2.1 传值(ByVal)    2 2.2 传址(ByRef)    3 2.3 传址(VarPtr)    4 2.4 转换为Variant    4 3 String    6 3.1 BSTR内存布局    6 3.2 StrPtr.VarPtr    7 3.3 示例代码    7 3.4 转换为V

C#调用dll 小例子

无论调用win32.dll还是mfc.dll基本过程都是一样的 下面以CALLmfcdll的C#项目调用VC++编写的MFCDLL项目为例 1.在MFCDLL.h中加上 extern "C" __declspec(dllexport) int add(int x,int y);//导出函数 2.在MFCDLL.cpp中加上 extern "C" __declspec(dllexport) int add(int x,int y){ //focus=100; retu

C#程序实现动态调用DLL的研究

原文:C#程序实现动态调用DLL的研究 摘  要:在<csdn开发高手>2004年第03期中的<化功大法--将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决"DLL Hell"提供了一种解决方案.这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也有相似的VB程序,但在某一技术论坛