一个工程怎么知道它调用了那些DLL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个工程怎么知道它调用了那些DLL相关的知识,希望对你有一定的参考价值。

我想,你应该已经在网上查到大概的用法了吧,比如:
[DllImport(“hello.dll”)]
private extern static int DeviceOpen(int aDevType, int aDevIndex, ref IntPtr aHandle);
用于调用hello.dll里的DeviceOpen函数。

但是这个时候可能会出现一些莫名其妙的问题,常见的有如下两个:
1. 函数名。C++编译器对函数名的处理与C不同,会加上一些字符用于标识函数的参数信息,比如上述的DeviceOpen函数的实际名称,可能就是:
?DeviceOpen@@YAHHHPAPAX@Z
这个可以用十六进制编辑器在你的Dll里面查找然后验证一下,一般都是前面后面加上一点字符而已。
然后使用时就这样:
[DllImport(DLL_FILE, EntryPoint = "?DeviceOpen@@YAHHHPAPAX@Z")]
private extern static int DeviceOpen(int aDevType, int aDevIndex, ref IntPtr aHandle);

2. 调用协定。对于CLR来说普通的WindowsAPI,调用协定是默认值,也就是stdcall。但是C++编译出来的函数,默认值一般是cdecl。所以想正确调用自己编写的Dll内的函数,还要指定调用协议。如:
[DllImport(DLL_FILE, CallingConvention = CallingConvention.Cdecl, EntryPoint = "?DeviceOpen@@YAHHHPAPAX@Z")]
private extern static int DeviceOpen(int aDevType, int aDevIndex, ref IntPtr aHandle);
参考技术A 谁给你这个dll谁负责你有没想过?就算你知道了引用了其他dll的名字,对方没给你,你还不一样要去找人要吗,所以提供你dll应该把其需要的全部dll给足你。 参考技术B 运行库组件
你可以在腾讯电脑管家的电脑诊断中找到软件问题,选择丢失VC++组件,点击立即修复。

在工具箱,打开电脑诊所,丢失.Dll 文件,进行一键修复

JAVA工程源文件是UTF8的,现在要调用dll传消息,而DLL只能接收GBK编码的消息,这种情况怎么办?

工程文件太多没法转换为GBK的编码

参考技术A 你可以自己写一个编码转换函数,将UTF-8转换为GBK的,UTF-8 是用三个字节表示一个汉字,GBK是用两个字节。具体的对应关系网上很多,自己查一个吧。很好写的,我以前写过。 参考技术B 转码就行了比如字符串s是GBK的
则可以用
String ss=new String(s.getBytes("GBK"),"UFT-8");
把s转成UTF-8编码的。追问

感谢回复,这个问题困扰我很久了。
我的JAVA源文件不是GBK的,s也就是UTF8的, 假设要传给DLL的消息是 "测试" ,这个消息必须是GBK的,DLL才能接收。JAVA中能用代码临时修改字符集吗?不然我的先把测试两个的GBK转为UTF8的编码 "娴嬭瘯"传给DLL,DLL才能正确知道是”测试“两个字,而我要传的消息是动态的,那就每次传都得转换了,这样不现实,DLL我们也不能修改。

追答

java中编译后字符编码就确定了,不能再更改,除非重新编译。
如果是你想传给DLL 你的java是UTF的话就
String s=”测试“;
String ss=new String(s.getBytes("UTF-8"),"GBK");

然后把ss传给DLL DLL接收的就是GBK编码的测试两个字。
至于每次转换麻烦完全可以自己写一个转换字符串编码的方法用来处理就行了
比如
public String utfToGbk(String s)
return new String(s.getBytes("UTF-8"),"GBK");


每次就只用s=utfToGbk(s);就把s转成GBK的了。

仔细研究了一下
String ss=new String(s.getBytes("UTF-8"),"GBK");
这种方法是错误的。不能误导大家。

参考技术C 工程源文件和编码有什么关系,你如何用java调用dll,jni?如果是内部编码用了GBK,而输出部分要求UTF-8,而且需要修改的地方非常多的话,建议看一下AOP追问

感谢各位回复
用的JNA调用的DLL,我用eclipse (源文件GBK编码) 调用是没问题的,后来用NETBEANS去调同样的代码就不行了,而NETBEANS的源文件编码为UTF8。如果改为GBK去调也是没问题的,问题是NETBEANS工程的其他文件原来都是按UTF8编码的,换成GBK所有的中文得全部修改,这个几乎是没法办到的。不知道哪位高手碰到过这种情况。实在不行只能重新包一下他们的DLL了。

追答

你代码里面用了中文?这个应该不困难,可以通过转码,把所有文件转换成UTF-8编码,最简单的用文本编辑器就能做到,但是一个一个来还是挺麻烦的。我觉得你自己写个批量的编码转换,搞定了再导入进NetBeans

追问

NETBEAN中的工程是用SWING写的,中间很多控件有中文。如果是直接在NETBEAN中调整源的编码从UTF-8至GBK 很多中文会变为乱码。而且文件太多,真是不敢转换!你说的批量转还没试过,可以一试,非常感谢你的回复

追答

如果数据量很大,用java那个很2的i18n还是值得的,虽说麻烦,可以有效地对付各种编码问题,并且维护起来也容易

参考技术D dll文件是自己写的吗?对dll这个比较感兴趣 但是不会 求解!追问

不是自己写的 是一个短信猫动态库,厂家提供的。

以上是关于一个工程怎么知道它调用了那些DLL的主要内容,如果未能解决你的问题,请参考以下文章

怎么调用别人的dll文件

vb dll和工程如果想要共用相同的变量应该如何声明

DLL怎么调用另一个DLL

知道DLL的.h文件怎么 调用dll类里的函数

怎样知道某个应用程序调用哪些dll文件?

win7 下BCB调用 BCB编写的DLL