__cdecl、__fastcall、__stdcall是VC的三种调用规范:
调用规范决定从左至右或从右至左的参数传递,有何负责清空堆栈以及函数名称的解释调用规范 传送顺序 堆栈清除执行者 解释风格
__cdecl 右->左 调用程序 _functionName
__fastcall 右->左 被调用程序 @functionName@nnn
__stdcall 右->左 被调用程序 _functionName@nnn__fastcall改进了__cdecl的缺省情况,但用在所调用C函数至少有一个参数时,选中该项
编译器将前两个参数送到寄存器ECX DEX,而不是用堆栈,其他参数缺省传入到__cdecl堆栈
调用规范决定从左至右或从右至左的参数传递,有何负责清空堆栈以及函数名称的解释调用规范 传送顺序 堆栈清除执行者 解释风格
__cdecl 右->左 调用程序 _functionName
__fastcall 右->左 被调用程序 @functionName@nnn
__stdcall 右->左 被调用程序 _functionName@nnn__fastcall改进了__cdecl的缺省情况,但用在所调用C函数至少有一个参数时,选中该项
编译器将前两个参数送到寄存器ECX DEX,而不是用堆栈,其他参数缺省传入到__cdecl堆栈
解决方案 »
- VC编译器 release版是怎么编译的啊?我把代码写成这样怎么不报错啊?
- 谁知道有甚么好的关于VC界面编程学习的网站或教程?
- 我想编写一个api函数来替换系统api函数,怎么实现? 急!
- 不知道大家有没用网易泡泡?我想取得它的聊天窗口中的文本内容该如何做啊?
- 如何截获其它程序的窗口键盘消息,并使其它程序无法接收到该消息
- 寻找源码
- 请问AVI文件中关于视频定义的dwScale 和dwRate 是怎么定义的,虽然知道相除可以得到帧率,但怎么设定它
- Access MoveLast的问题
- 关于线程的一个很基本的问题?????
- COdList里可以存放任何类型的对象指针吗?
- 哪位大哥有简单的odbc编写数据库管理系统实现源程序,我想要来参考一下
- 华中师范大学计算机科学系9701班 向建刚 请进!
静态的导入方法;而函数或方法的导入通常采用动态的导入方法。
一.静态使用
导入类的声明:
1.DLL工程的声明最好为扩展MFC类型;
2.在DLL中有以下类声明
//MyClass.h
class AFX_EXT_CLASS CMyClass
{
............};
3.在使用DLL的类的工程中,需要以下配置
A.在Project|Setting中的Link标签页的Object/library Modules 中加入*.lib
B.在Tools|Options中的Directories 标签页中的 Show directories for:下面的
Include files 中增加Myclass.h的路径;Lib files中增加*.lib 和*.dll路径。
C.在使用工程的代码中如下即可:
#include "MyClass.h"
......
CMyClass MyClass;
二.动态使用
动态使用DLL有个前提条件,必须知道DLL中的待引用函数名,配置必须有静态使用中的B项。
使用如下:
HINSTANCE g_hSmppDll = NULL;
typedef UINT MyFunc(char *); //DLL中的函数
MyFunc *pMyFunc=NULL;
g_hSmppDll =LoadLibrary("MyDll.dll");
ASSERT(g_hSmppDll );
pMyFunc=(MyFunc *)(GetProcAddress( g_hSmppDll, "MyFunc"));//引号中为DLL中的函数名
(*pMyFunc) ("ok"); 在于一个*.lib文件。在编译动态链接库时,VC++会为动态链接库创建一个引入
库(IMPORT LIB),即*.lib。库文件中只包含一些指向外部DLL库的函数索引指针,而
不是真正的代码,用于解析DLL的加载地址,并定义动态链接库和用于声明的头文件
的完全路径名。然后为引入库定义一个头文件,用来声明DLL中的函数。开发人员在引用时,
要配置如下:
A.在Project|Setting中的Link标签页的Object/library Modules 中加入*.lib
B.在Tools|Options中的Directories 标签页中的 Show directories for:下面的
Include files 中增加Myclass.h的路径;Lib files中增加*.lib 和*.dll路径。
这是一种常用的方法。实际上,应用程序就是通过这种方式来访问Windows 的API函数。
WINDOWS为其内核动态链接库生成引入库并提供了头文件。应用程序在编译时将引入
库的信息带入可执行文件中,运行时通过引入库信息访问API函数。
********1)对普通API DLL,分析PE文件引出. 即由 IMAGE_EXPORT_DIRECTORY 结构为线索,可以找到API DLL中所有export函数等信息. VC++ 提供的工具depends的相关部分的内部实现也是大抵如此. 关于分析PE格式,网上有很多好文章.另外,Matt Pietrek的"Windows 95 System Programming Secrets"对PE格式分析也进行了详细的介绍,包括 DLL export/import table,...2)对于COM DLL,由于一般只输出用于COM注册或加载/卸载的几个标准函数外,其他功能都有接口实现. 所以,除了进行1)中处理外, 还要对 COM DLL对应的tlb文件进行分析. tlb文件或者直接包含在COM DLL中,或者单独提供 .tlb文件. 对于分析tlb文件,可以使用系统提供的接口
ITypeLib
ITypeInfo
实现. 关于这两个接口的具体信息可以参照MSDN. 另外VC++ 提供的工具OLE view中相关部分的内部实现可能使用了类似的方法.
*******
LoadLibrary
The LoadLibrary function maps the specified executable module into the address space of the calling process. For additional load options, use the LoadLibraryEx function. HMODULE LoadLibrary(
LPCTSTR lpFileName // file name of module