c/c++调用dll
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的更多相关文章
- Windows平台Go调用DLL的坑
		最近的项目中,使用了GO来开发一些服务中转程序.业务比较简单,但是有一些业务需要复用原有C++开发的代码.而在WINDOWS,用CGO方式来集成C/C++代码并不是太方便.所以用DLL把C++的代码封 ... 
- Java 调用 C++ (Java 调用 dll)康哥手把手教你
		摘要: 本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4979243.html 因为要做点图形处理的项目,需要在Java中调用dll库,所以开发的第一步是 ... 
- 【转】C#调用DLL
		C#中如何调用动态链接库DLL(转) 每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍.首先,您需要了解什么是托管,什么是非托管.一般可以认为:非托管代码主要是基 ... 
- C#程序实现动态调用DLL的研究(转)
		摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资 ... 
- 外壳exe通过反射调用dll时
		外壳exe通过反射调用dll时,dll是 4.0的框架,外壳exe也需要编译成4.0的框架,如果dll本身有调用32位的dll,那么外壳exe也需要编译成32位. 调试时报的那个错,直接继续运行,不影 ... 
- C++ exe调用dll文件
		生成dll程序 extern "C"_declspec(dllexport) void maopao(int *p,int count);void maopao(int *p,in ... 
- 卸载AppDomain动态调用DLL异步线程执行失败
		应用场景 动态调用DLL中的类,执行类的方法实现业务插件功能 使用Assembly 来实现 但是会出现逻辑线程数异常的问题 使用AppDomain 实现动态调用,并卸载. 发现问题某个插件中开启异步线 ... 
- C++ 生成 dll 和调用 dll 的方法实例(转)
		1)生成dll 建立两个文件 xxx.h , xxx.cpp xxx.h内容如下: #ifdef BUILD_XXX_DLL#define EXPORT __declspec(dllexport)#e ... 
- 在VC中创建并调用DLL
		转自:http://express.ruanko.com/ruanko-express_45/technologyexchange6.html 一.DLL简介 1.什么是DLL? 动态链接库英文为DL ... 
- [转]如何在Java中调用DLL方法
		转载地址:http://developer.51cto.com/art/200906/129773.htm Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台 ... 
随机推荐
- python虚拟机运行原理
			近期为了面试想要了解下python的运行原理方面的东西,奈何关于python没有找到一本类似于深入理解Java虚拟机方面的书籍,找到了一本<python源码剖析>电子书,但是觉得相对来说最 ... 
- 【BZOJ4517】[Sdoi2016]排列计数 组合数+错排
			[BZOJ4517][Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值 ... 
- [ Office 365 开发系列 ] Graph Service
			前言 本文完全原创,转载请说明出处,希望对大家有用. 通过[ Office 365 开发系列 ] 开发模式分析和[ Office 365 开发系列 ] 身份认证两篇内容的了解,我们可以开始使用Offi ... 
- 聚币网API[Python3版]
			代码 #!/usr/bin/env python # -*- coding:utf-8 -*- import hashlib import requests import time import ur ... 
- Sqoop简介及使用
			一.Sqoop概述 1)官网 http://sqoop.apache.org/ 2)场景 传统型缺点,分布式存储.把传统型数据库数据迁移. Apache Sqoop(TM)是一种用于在Apache H ... 
- android 知识收集
			1.无论是 Activity.BroadcastReceiver还是Service,只要是有长时间处理的任务,就需要重新开一个线程来处理,为什么会这样? 因为他们都是运行在主线程中的. 2.在使用Br ... 
- python的scikit-learn的主要模块和基本使用
			在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法. 加载数据(Data L ... 
- 在android上跑 keras 或 tensorflow 模型
			https://groups.google.com/forum/#!topic/keras-users/Yob7mIDmTFs http://talc1.loria.fr/users/cerisara ... 
- Python学习笔记(一)数据类型
			一.整型和浮点型 Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样 age=10 num=-35 score=98.8 二.布尔类型 布尔值和布尔代数的表示 ... 
- 深入理解Flink核心技术(转载)
			作者:李呈祥 Flink项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多的人关注Flink项目.本文将深入分析Flink一些关键的技术与特性,希望能够帮助读者 ... 
