__cdecl、__fastcall、__stdcall是VC的三种调用规范:
调用规范决定从左至右或从右至左的参数传递,有何负责清空堆栈以及函数名称的解释调用规范  传送顺序 堆栈清除执行者 解释风格
__cdecl    右->左  调用程序      _functionName
__fastcall 右->左  被调用程序    @functionName@nnn
__stdcall  右->左  被调用程序    _functionName@nnn__fastcall改进了__cdecl的缺省情况,但用在所调用C函数至少有一个参数时,选中该项
编译器将前两个参数送到寄存器ECX DEX,而不是用堆栈,其他参数缺省传入到__cdecl堆栈

解决方案 »

  1.   

    DLL的使用分为两种,静态导入和动态导入DLL。其中整个类的导入常采用
    静态的导入方法;而函数或方法的导入通常采用动态的导入方法。
    一.静态使用
    导入类的声明:
    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