1、lib.h

 1 #ifndef LIB_H
2 #define LIB_H
3
4 #include <windows.h>
5 #include <iostream>
6
7 using namespace std;
8
9 extern "C" int __declspec(dllexport)add(int,int);
10 extern "C" int __declspec(dllexport)sub(int,int);
11
12 //int add(int,int);
13 //int sub(int,int);
14
15 #endif

lib.h

2、lib.cpp

 #include "lib.h" 

 /*BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved){
switch(ul_reason_for_call){
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}*/ int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x - y;
}

lib.cpp

3、main.cpp

 #include "lib.h"

 int main(){
//DLL句柄声明
//HINSTANCE hDll;
HMODULE hDll; //加载DLL,返回句柄:
//HMODULE WINAPI LoadLibrary( _In_ LPCTSTR lpFileName);
//hDll=LoadLibrary(_T("lib.dll"));
hDll=LoadLibrary(TEXT("lib.dll"));//hDll=LoadLibrary("lib.dll");
if(hDll==NULL)
cout << "dll加载失败!" << endl;
cout << "dll加载成功!" << endl;
cout << "dll句柄:" << hDll <<endl; //定义与add函数接受参数类型和返回值均相同的函数指针类型
typedef int(*lpAddFun)(int,int);
typedef int(*lpSubFun)(int,int); lpAddFun addFun;
lpSubFun subFun; //
//GetProcAddress函数原型:
//FARPROC GetProcAddress(
//HMODULE hModule, // DLL模块句柄
//LPCSTR lpProcName); // 函数名
LPCSTR add="add";
LPCSTR sub="sub";
int *numFun; if(hDll!=NULL){
addFun=(lpAddFun)GetProcAddress(hDll,add);
cout << "addFun :" << addFun << endl;
subFun=(lpSubFun)GetProcAddress(hDll,sub);
cout << "subFun :" << subFun << endl;
numFun=(int *)GetProcAddress(hDll,"num");
cout << "numFun1:" << numFun << endl;
if(addFun!=NULL){
int result=addFun(,);
cout << "3+2=" << result << endl;
}
if(subFun!=NULL){
int result=subFun(,);
cout << "3-2=" << result << endl;
}
if(numFun!=NULL){
cout << "numFun2:"<< numFun <<endl;//没有num函数,就返回NULL
}
FreeLibrary(hDll);//释放DLL
cout << "dll卸载成功!";
}
return ;
}

main.cpp

4、编译lib.cpp为dll

  cl /LD lib.cpp

  生成lib.dll,同时还有lib.exp、lib.lib

5、编译main.cpp为main.exe

  cl main.cpp

6、DLL中导出函数的声明有两种方式:

  6.1、一种方式为例子中给出的:

    在函数声明中加上__declspec(dllexport)
  6.2、另外一种方式是采用模块定义(.def) 文件声明

    .def文件为链接器,提供了有关被链接程序的导出、属性及其他方面的信息。
    代码中lib.cpp中注释部分演示了怎样同.def文件,

    将函数add声明为DLL导出 函数(需在dllTest工程中添加lib.def文件)

       lib.def : 导出DLL函数
      LIBRARY libdll

      EXPORTS
      add @ 1
      .def文件的规则为:
        (1)LIBRARY语句说明.def文件相应的DLL;
        (2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中
       的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调
       用时,这个序号将发挥其作用);
        (3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,
       且注释不能与语句共享一行。
    由此可以看出,例子中lib.def文件的含义为生成名为“libdll”
    的动态链接库,导出其中的add函数,并指定add函数的序号为1。

7、当使用第一种声明导出函数函数时,将"C"改为C++,

则main.cpp不能成功调用到lib.dll中的各个函数。

c/c++调用dll的更多相关文章

  1. Windows平台Go调用DLL的坑

    最近的项目中,使用了GO来开发一些服务中转程序.业务比较简单,但是有一些业务需要复用原有C++开发的代码.而在WINDOWS,用CGO方式来集成C/C++代码并不是太方便.所以用DLL把C++的代码封 ...

  2. Java 调用 C++ (Java 调用 dll)康哥手把手教你

    摘要: 本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4979243.html 因为要做点图形处理的项目,需要在Java中调用dll库,所以开发的第一步是 ...

  3. 【转】C#调用DLL

    C#中如何调用动态链接库DLL(转)     每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍.首先,您需要了解什么是托管,什么是非托管.一般可以认为:非托管代码主要是基 ...

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

    摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资 ...

  5. 外壳exe通过反射调用dll时

    外壳exe通过反射调用dll时,dll是 4.0的框架,外壳exe也需要编译成4.0的框架,如果dll本身有调用32位的dll,那么外壳exe也需要编译成32位. 调试时报的那个错,直接继续运行,不影 ...

  6. C++ exe调用dll文件

    生成dll程序 extern "C"_declspec(dllexport) void maopao(int *p,int count);void maopao(int *p,in ...

  7. 卸载AppDomain动态调用DLL异步线程执行失败

    应用场景 动态调用DLL中的类,执行类的方法实现业务插件功能 使用Assembly 来实现 但是会出现逻辑线程数异常的问题 使用AppDomain 实现动态调用,并卸载. 发现问题某个插件中开启异步线 ...

  8. C++ 生成 dll 和调用 dll 的方法实例(转)

    1)生成dll 建立两个文件 xxx.h , xxx.cpp xxx.h内容如下: #ifdef BUILD_XXX_DLL#define EXPORT __declspec(dllexport)#e ...

  9. 在VC中创建并调用DLL

    转自:http://express.ruanko.com/ruanko-express_45/technologyexchange6.html 一.DLL简介 1.什么是DLL? 动态链接库英文为DL ...

  10. [转]如何在Java中调用DLL方法

    转载地址:http://developer.51cto.com/art/200906/129773.htm Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台 ...

随机推荐

  1. python虚拟机运行原理

    近期为了面试想要了解下python的运行原理方面的东西,奈何关于python没有找到一本类似于深入理解Java虚拟机方面的书籍,找到了一本<python源码剖析>电子书,但是觉得相对来说最 ...

  2. 【BZOJ4517】[Sdoi2016]排列计数 组合数+错排

    [BZOJ4517][Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值 ...

  3. [ Office 365 开发系列 ] Graph Service

    前言 本文完全原创,转载请说明出处,希望对大家有用. 通过[ Office 365 开发系列 ] 开发模式分析和[ Office 365 开发系列 ] 身份认证两篇内容的了解,我们可以开始使用Offi ...

  4. 聚币网API[Python3版]

    代码 #!/usr/bin/env python # -*- coding:utf-8 -*- import hashlib import requests import time import ur ...

  5. Sqoop简介及使用

    一.Sqoop概述 1)官网 http://sqoop.apache.org/ 2)场景 传统型缺点,分布式存储.把传统型数据库数据迁移. Apache Sqoop(TM)是一种用于在Apache H ...

  6. android 知识收集

    1.无论是 Activity.BroadcastReceiver还是Service,只要是有长时间处理的任务,就需要重新开一个线程来处理,为什么会这样? 因为他们都是运行在主线程中的. 2.在使用Br ...

  7. python的scikit-learn的主要模块和基本使用

    在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法. 加载数据(Data L ...

  8. 在android上跑 keras 或 tensorflow 模型

    https://groups.google.com/forum/#!topic/keras-users/Yob7mIDmTFs http://talc1.loria.fr/users/cerisara ...

  9. Python学习笔记(一)数据类型

    一.整型和浮点型 Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样 age=10 num=-35 score=98.8 二.布尔类型 布尔值和布尔代数的表示 ...

  10. 深入理解Flink核心技术(转载)

    作者:李呈祥 Flink项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多的人关注Flink项目.本文将深入分析Flink一些关键的技术与特性,希望能够帮助读者 ...