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开发前台 ...
随机推荐
- Android之dip、dp、px、sp和屏幕密度
1. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这 这个,不依 ...
- Android 代码规范 code style
/* * 文件名(可选),如 CodingRuler.java * * 版本信息(可选),如:@version 1.0.0 * * 版权申明(开源代码一般都需要添加),如:Copyright (C) ...
- python基础-第四篇-4.1内置函数
lambda表达式 lambda表达式是对简单函数的精简化表达 语法结构:函数名 = lambda:运算表达式 def f1(a): a = a + 1 return a ret = f1(1) pr ...
- LINux网络的NAPI机制详解一
在查看NAPI机制的时候发现一篇介绍NAPI引入初衷的文章写的很好,通俗易懂,就想要分享下,重要的是博主还做了可以在他基础上任意修改,而并不用注明出处的声明,着实令我敬佩,不过还是附上原文链接! ht ...
- BBS项目部署之数据库的处理
一 数据库的处理: 1.1上传bbs.sql(数据库中的数据) 1.2在mysql中创建bbs库,并导入数据库SQL脚本 在mysqld的文件夹中: mysql> create databas ...
- java-mybaits-00501-案例-映射分析-订单商品数据模型
1.数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空字段.外键 ...
- My Neural Network isn't working! What should I do?
参考文献:http://theorangeduck.com/page/neural-network-not-working 我的网络不起作用!该怎么办? 因此,你在深度学习方面正在开发下一个重大突破, ...
- How to store scaling parameters for later use
you can use sklearn's built-in tool: from sklearn.externals import joblib scaler_filename = "sc ...
- (转)Linux下配置tomcat+apr+native应对高并发
摘要:在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服 ...
- xadmin快速搭建一个后台管理系统
环境:python3.5.2 ,django 2.0 ,xadmin2.0 Firsttly, 到 https://github.com/sshwsfc/xadmin/tree/django2上下载源 ...