C++BUILDER6做成的DLL让JAVA调用,为何函数名都要加下划线?

BCBPLC 2015-05-22 02:31:32
C++BUILDER6做DLL非常简单,生成的DLL让C++BUILDER程序调用也很简单,调用DLL函数名时并不需要加下划线,
但JAVA用JNA调用此DLL就成严重问题了,搞了两天,幸有一位网友用DLL查看工具才邦我发现我做
成的DLL函数名都有下划线,这才解决了我的大问题。
为何C++BUILDER自已调用此DLL不需下划线,而JAVA调用就必须要下划线呢,
C++BUILDER调用的函数

#define CDLL extern "C" __declspec( dllimport )
CDLL bool openHFV(); // 1
CDLL void closeHFV(); // 2
CDLL int readHFV(); //3

JAVA调用的源码
import com.sun.jna.Library;
import com.sun.jna.Native;

public class testdll {
public interface DLL extends Library
{
DLL dll = (DLL)Native.loadLibrary("usbvein.dll",DLL.class);

boolean _openHFV(); // 1号函数声明
void _closeHFV(); // 2
int _readHFV(); // 3 }
public static void main(String[] args) //主程序
{
DLL.dll._openHFV(); // 打开USB 设备
DLL.dll._readHFV(); // 启动USB
DLL.dll._closeHFV(); // 关闭USB指静脉设备
}


}
...全文
209 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
走好每一步 2015-05-24
  • 打赏
  • 举报
回复
VC++ 深入详解 孙鑫的pdf版 网上应该也有的。
走好每一步 2015-05-24
  • 打赏
  • 举报
回复
楼主可以去看下孙鑫的书 动态链接库 讲的很好,解决名字改变问题。 用def模块去导出函数就不会发生函数名称改变,Vc里的depends工具可以查看DLL中的函数名。
BCBPLC 2015-05-23
  • 打赏
  • 举报
回复
现在JAVA调用C++BUILDER的DLL 没有技术问题了。
BCBPLC 2015-05-23
  • 打赏
  • 举报
回复
加上 -stdcall ,JAVA调用此DLL是不需要 下划线了,问题又来了, C++BUILDER 自已调用此DLL又出现接错误,加上_stdcall 运行时,又出现函数定位的严重错误。 还是老实些吧。去掉 _stadcall 吧,让JAVA 调用DLL时,函数名就带用下划线吧。 知道带下划线 也就没问题了,不能追求百分百完美
ccrun.com 2015-05-22
  • 打赏
  • 举报
回复
DLL导出函数的调用方式会直接影响PE导出表中导出函数的名字。
BCBPLC 2015-05-22
  • 打赏
  • 举报
回复
#define CDLL extern "C" __declspec( dllexport ) CDLL bool _stdcal l openHFV(); // 1 CDLL void _stdcall closeHFV(); // 2 CDLL int _stdcall readHFV(); 试了下,这样改,生成的DLL用工具一看,下划线就没有了。。 许多JAVA调用DLL的人被这问题难倒
BCBPLC 2015-05-22
  • 打赏
  • 举报
回复
那在DLL定义的工程里 #define CDLL extern "C" __declspec( dllexport ) CDLL bool openHFV(); // 1 CDLL void closeHFV(); // 2 CDLL int readHFV(); //3 上面如何改成 不需要下划线呢 ?
  • 打赏
  • 举报
回复
调用方式的原因 cdecl方式 默认前面有个 _ stdcall方式就没有
1)VsDll为vs2010工程,编译生成动态库。 2)BCBCall为bcb工程,调用动态库 3)Viewdll.exe为查看DLL导出文件的工具。 注意事项一: VSDll里面有一个 KpHttps.def LIBRARY "KpHttps" EXPORTS InitKpHttp Project > Properties... > Linker > Input > Module Definition File 里面加入你刚才的KpHttps.def文件,重新编译就行了。出来的InitKpHttp函数前面没有下划线,后面没有@8或者@ABCDEF之类的。 注意事项二: 用C++Builder的implib工具生成DLL对应的lib文件。如:implib xx.lib xxx.dll。 生成lib文件之后,C++Builder便可以使用这个lib文件了。 注意事项三: 文件头的声明应该完全一样,否则(呵呵),会出现链接错误。 #ifdef DLL_API #define DLL_API extern "C" _declspec(dllexport) #else #define DLL_API extern "C" _declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif DECLDIR int __stdcall InitKpHttp(void); DECLDIR int UnInitKpHttp(void); DECLDIR int KpHttpRequest(char *strurl,char *strhost,char *strresult,int &resultle;); DECLDIR int KpHttpsRequest(char *strurl,char *strhost,char *strresult,int &resultle;); DECLDIR int KpHttpPost(char *strurl,char *strhost,char *strPost,int postlen,char *strresult,int &resultle;); DECLDIR int KpHttpsPost(char *strurl,char *strhost,char *strPost,int postlen,char *strresult,int &resultle;); DECLDIR int KpUpLoadFile(char *strurl,char *strhost,char *filebuf,int filelen,char *strresult,int &resultle;); DECLDIR int KpDownLoadFile(char *strurl,char *strhost,char *filebuf,int &filelen;,char *strresult,int &resultle;); #ifdef __cplusplus } #endif

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧