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开发前台 ...
随机推荐
- Egret微端 创建项目(一)
开发环境: window7 egret engine:5.0.14 egret wing:4.1.0 微端:v0.0.14 官方教程:http://developer.egret.com/cn/git ...
- 6.2 - BBS + BLOG系统
一.简介 博客系统开发: 1.注册,登录,首页 2.个人站点,分组:(分类,标签,归档)3.文章详细页4.点赞,踩灭5.评论楼,评论树6.后台管理,发布文章,文件上传7.BeautifulSoup8. ...
- 自定义HTTP头时的注意事项(转)
原文:https://blog.gnuers.org/?p=462 HTTP头是可以包含英文字母([A-Za-z]).数字([0-9]).连接号(-)hyphens, 也可义是下划线(_).在使用ng ...
- django中使用redis
第一种 安装redis模块 1.1在app中定义一个redis的连接池的py文件 import redis POOL=redis.ConnectionPool(host='127.0.0.1',por ...
- python一两行代码完成的骚操作
分享一个前几天晚上粉丝问的问题,觉得很实用的一个问题,用python读取Excel并保存字典,如何做? 下面是该同学问题截图和代码 代码截图是下面这样的 不知道大家第一眼看了这个代码,什么感受 ...
- 怎样在QML应用中创建一个Context Menu
我们在非常多的系统中看见能够在屏幕的一个地方长按,然后就能够依据当前显示的上下文弹出一个菜单. 菜单中能够有一些选项,比方删除,改动该项.这样的一般在ListView或GridView中常见.今天,我 ...
- php 计算gps坐标 距离
在计算机或GPS上经纬度经常用度.分.秒和度.度.分.分.秒.秒的混合方式进行表示,度.分.秒间的进 制是60进制,度.度.分.分. 秒.秒的进制是100进制,换算时一定要注意.可以近似地认为每个纬度 ...
- sql server常用性能计数器
https://blog.csdn.net/kk185800961/article/details/52462913?utm_source=blogxgwz5 https://blog.csdn.ne ...
- NodeJS开发环境搭建
原创作者: zero20121222 NodeJS开发环境搭建 1.安装NodeJS 1.编译环境 源代码编译器,通常 Unix/Linux平台都自带了C++的编译器(GCC/G++).如果没有,请通 ...
- ReSharper Ultimate 2017 下载地址及破解方法
https://download.jetbrains.8686c.com/resharper/JetBrains.ReSharperUltimate.2017.1.2.exe 安装完成后,打开vs ...