zoukankan      html  css  js  c++  java
  • VC++ 创建及调用Dll

    一、_stdcall 

    被这个关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall 的前面部分由ecx,edx传), 函数调用在返回前要由被调用者清理堆栈。

    这个关键字主要见于Microsoft Visual C、C++。GNU的C、C++是另外一种修饰方式:__attribute__((stdcall))

    1.

    MathFunsStd.cpp:

     int _stdcall add(int a, int b)
    {
    return a+b;
    }
    
    int _stdcall subtract(int a, int b)
    {
    return a-b;
    }
    
    int _stdcall multiple(int a, int b)
    {
    return a*b;
    }

    MathFunsStd.def:

    LIBRARY MathFunsStd
    
    EXPORTS
    add
    subtract
    multiple

    2.MathFuns.cpp

    int add(int a, int b)
    {
    return a+b;
    }
    
    int subtract(int a, int b)
    {
    return a-b;
    }
    
    int multiple(int a, int b)
    {
    return a*b;
    }

    MathFuns.def

    LIBRARY MathFuns
    
    EXPORTS
    add
    subtract
    multiple

    3.UseHeaderAPI

    MathFunsUseHeader.h

    #ifdef MathFunsUseHeaderAPI 
    #else
    #define MathFunsUseHeaderAPI _declspec(dllimport)
    #endif
    
    MathFunsUseHeaderAPI int add(int a,int b);
    MathFunsUseHeaderAPI int subtract(int a,int b);
    MathFunsUseHeaderAPI int multiple(int a, int b);
    
    
    #define MathFunsUseHeaderAPI _declspec(dllexport)
    #include "MathFunsUseHeader.h"

    MathFunsUseHeader.cpp

    int add(int a, int b)
    {
    return a+b;
    }
    
    int subtract(int a, int b)
    {
    return a-b;
    }
    
    int multiple(int a, int b)
    {
    return a*b;
    }

    三、调用

     
    /*加载dll函数调用方式为默认调用方式*/
    HINSTANCE hInst = LoadLibrary(L"MathFuns.dll");
    if(!hInst)
    {
    printf("加载MathFuns.dll失败!
    ");
    }
    typedef int (*MathFunsAPI)(int a, int b);//定义函数指针变量类型
    MathFunsAPI Add = (MathFunsAPI)::GetProcAddress(hInst,"add");
    printf("5+3=%d
    ",Add(5,3));
    ::FreeLibrary(hInst);
    
           //调用dll函数调用方式为_stdcall
    HINSTANCE hInstStd = ::LoadLibrary(L"MathFunsStd.dll");
    if(!hInstStd)
    {
    printf("加载MathFunsStd.dll失败!
    ");
    }
    typedef int (_stdcall *MathFunsStdAPI)(int a, int b);//定义函数指针变量类型
    MathFunsStdAPI AddStd = (MathFunsStdAPI)::GetProcAddress(hInstStd,"add");
    printf("5+3=%d
    ",AddStd(5,3));
    ::FreeLibrary(hInst);
    
    return 0;
  • 相关阅读:
    MySQL命令 导出 数据和结构
    Maven web 项目工程的建立
    Maven的配置以及Eclipse的设置
    项目管理工具Maven的安装
    centos7 安装 redis
    Java + 腾讯邮箱 SSL加密问题 重要通知
    centos7 上配置Javaweb---MySQL的安装与配置、乱码解决
    关于阿里云Centos服务器搭建Java网站不能访问的问题
    浏览器使用经验
    Linux常用命令大全
  • 原文地址:https://www.cnblogs.com/blogpro/p/11339412.html
Copyright © 2011-2022 走看看