dll导出函数名称和系统API名字相同冲突问题
来源:互联网 发布:叮咚智能音箱软件 编辑:程序博客网 时间:2024/06/06 19:32
参考文章:http://blog.163.com/zhangjinqing1234@126/blog/static/307302602012111295026614/
-------------------------------------------------------------------------------------------------------------------------------------------------
事情是这样的,在实际开发中,dll导出的函数名称是由客户定义的,不幸的是客户定义 的导出函数名称
和系统API的名称是一样的,这样的话API名称就产生了冲突,导致调用失败,以下就是我测试的例子和解决方法。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
头文件TestDll.h, API原型定义如下:
#pragma once// 操作系统有个API:DWORD GetVersion(VOID);void GetVersion(char *pszBuf, int *pBufLen); // 客户定义的API
cpp文件TestDll.cpp,API实现代码如下:
#include "stdafx.h"#include "TestDll.h"void GetVersion(char *pszBuf, int *pBufLen){ if (pszBuf != NULL && pBufLen != NULL && *pBufLen >= 10) { strcpy(pszBuf, "1.0.0.1"); }}
dll 导出模块定义文件TestDll.def内容如下:
LIBRARY "TestDll"
EXPORTS
GetVersion
测试程序代码如下:
#include "stdafx.h"#include "../TestDll/TestDll.h"#ifdef _DEBUG#pragma comment(lib, "../Debug/TestDll.lib")#else#pragma comment(lib, "../Release/TestDll.lib")#endifint _tmain(int argc, _TCHAR* argv[]){ char szVersion[16] = {0}; int iBufLen = 16; GetVersion(szVersion, &iBufLen); printf("%s ", szVersion); getchar();return 0;}
编译运行,产生错误提示信息如下:
1> TestDemo.cpp
1>TestDemo.obj : error LNK2019: unresolved external symbol "void __cdecl GetVersion(char *,int *)" (?GetVersion@@YAXPADPAH@Z) referenced in function _wmain
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
解决方法:
TestDll.h头文件内容修改如下:
#pragma once// 操作系统有个API:DWORD GetVersion(VOID);void GetVersion(char *pszBuf, int *pBufLen); // 客户定义的APIvoid MyGetVersion(char *pszBuf, int *pBufLen);
TestDll.cpp内容修改如下:
#include "stdafx.h"#include "TestDll.h"void GetVersion(char *pszBuf, int *pBufLen){ // 实现在MyGetVersion中}void MyGetVersion(char *pszBuf, int *pBufLen){ if (pszBuf != NULL && pBufLen != NULL && *pBufLen >= 10) { strcpy(pszBuf, "1.0.0.1"); }}
TestDll.def内存修改如下:
LIBRARY "TestDll"
EXPORTS
GetVersion=MyGetVersion
最后编译运行,效果如下:
- dll导出函数名称和系统API名字相同冲突问题
- def文件 导出的函数中不要和系统中的名字冲突 比如Add
- 解决vc dll导出函数名字发生改变问题
- 解决DLL导出函数的名字改编问题
- 动态链接库DLL导出函数名字改编问题
- dll导出函数 与mfc 函数冲突问题
- 多个dll导出相同函数时的调用问题
- dll的导出 解决函数名称改写带来的问题
- 动态加载DLL实现不同DLL的相同导出函数调用问题
- DLL导出函数名称改编的解决方法
- DLL导出函数名称改编的解决方法
- DLL导出函数名称改编的解决方法
- DLL导出函数名称改编的解决方法
- C++名字冲突问题和钻石继承
- 关于DLL函数名导出名字命名规则
- 关于函数名称和库函数名称冲突的故事
- DLL导出函数和类
- DLL导出类和导出函数
- 使用 FileSystem JAVA API 对 HDFS 进行读、写、删除等操作
- 第四章---SpringMVC----Controller详解
- SSH 框架中 service 里面有 sql 和 对象存储,执行顺序问题 Spring 事务提交顺序
- 网易资源提取步骤
- 【转载】五大常用算法之一:分治算法
- dll导出函数名称和系统API名字相同冲突问题
- ffmpeg 解码 到 opencv 之间传递
- Adnroid上的简单图像合成类——PorterDuffXfermode
- 性能调优攻略
- Unity3D学习之使用摄像机制作实时显示小地图
- Library not loaded: /Developer/Library/Frameworks/SenTestingKit.framework/SenTestingKit
- 树形结构的数据库表Schema设计 .
- Web服务器工作原理概述
- csv 导出