关于C#调用C++dll方法总是返回true的疑问 大家好,我在C#中调用某些C++dll的方法总是返回true,但是我自己写了一个简单调用例子倒是很正常。请问一下,为什么会出现这种情况?在不能改变改C++dll代码的情况下,如何解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ...某些C++dll的方法...是哪些? 是我们自己开发的dll,但是尽量不修改该dll源代码。 它们该返回true就返回true,有什么不对的? 我同样还写了一个C++调用该dll方法的程序,某些情况下会返回false的。但是C#调用该dll方法,无论什么情况下都会返回true。 如果是非托管的,就用DllImport,举例 using System; using System.Runtime.InteropServices; class MainApp [DllImport("Kernel32")] //读取动态库文件 public static extern int GetProcAddress(int handle, String funcname); 给你讲一下我的经验: 首先 你在C#中调用的 是C++ 写的一个动态库。比如Kernel32.dll 中的 函数; 这个函数用C++写 有如下要求: 1、 必须为全局函数 2、 函数参数 必须为基本类型,也就是C++ 和C#都有的类型,否则你在public static extern int GetProcAddress(int handle, String funcname); 这里没有办法声明。 其余的 没什么了; 还有你可以参考这里:http://blog.csdn.net/jingshuaizh/archive/2009/02/04/3862019.aspx 那还需要哪些具体信息,我尽量补充吧,谢谢:)被调用的dll源代码我是没有办法得到的,因为我没有权限,但是我现在的情况就是,C#调用该dll的方法,在应该返回false的情况下它总是返回true,我改用int去接收返回值,发现这个int值很大,好像是9万多吧,不是一般的0或1,但是用C++调用就很正常,用int去接收返回值得到的也就是0或1两种情况。 已经解决,函数定义加上[return:MarshalAs(UnmanagedType.I1)]如下:[DllImport("Hello.dll", EntryPoint = "Hello")][return:MarshalAs(UnmanagedType.I1)]public static extern bool Hello();具体讨论看这里http://www.codecomments.com/archive371-2005-3-441332.html 默认的P/Invoke对int的封送平白直了,一般不会出什么问题。你要做的是找出C++和C#调用的不同,包括初始化和调用循序。 你的问题主要就是平台调用过程中的数据封送问题。楼上有人已经给出了正确的答案。但是如果只获得答案,不知道原理,以后遇到了此类问题还是不知道如何下手。如果你想系统学习如何进行数据封送,我推荐你阅读刚刚出版的新书:《精通.NET互操作P/Invoke,C++Interop和COM Interop》,这本书的第2章“数据封送”详细介绍了平台调用中的数据封送过程,非常详细,我就是读完后才搞清楚平台调用中的封送处理。 该书的官方网站: www.interop123.com 豆瓣网信息: http://www.douban.com/subject/3671497/ C#和C++的bool类型长度不同,问题解决方法:C#里面函数返回类型用byte C#连接sql server数据库连接不到的问题!!求助 C#里的SqlDataAdapter执行create table等语句,为什么结果跟踪不到 得到listview选中行数 如何读取目录下的所有图片 刷新treeview,结果节点双倍出现? js 传值问题```` 问:如何获得网站访问记录 关于一个透明的解决方案 在Winform程序如何嵌入数据库文件,只需要一个 .exe文件就可以 c# 线程问题 C#对文件进行加密时候遇到问题,请指教 当MDI一个子窗体最大化显示后,启动另个子窗体必须也得最大化?
它们该返回true就返回true,有什么不对的?
我同样还写了一个C++调用该dll方法的程序,某些情况下会返回false的。
但是C#调用该dll方法,无论什么情况下都会返回true。
using System;
using System.Runtime.InteropServices;
class MainApp
[DllImport("Kernel32")] //读取动态库文件
public static extern int GetProcAddress(int handle, String funcname); 给你讲一下我的经验:
首先 你在C#中调用的 是C++ 写的一个动态库。比如Kernel32.dll 中的 函数;
这个函数用C++写 有如下要求:
1、 必须为全局函数
2、 函数参数 必须为基本类型,也就是C++ 和C#都有的类型,否则你在public static extern int GetProcAddress(int handle, String funcname);
这里没有办法声明。 其余的 没什么了; 还有你可以参考这里:http://blog.csdn.net/jingshuaizh/archive/2009/02/04/3862019.aspx
那还需要哪些具体信息,我尽量补充吧,谢谢:)
被调用的dll源代码我是没有办法得到的,因为我没有权限,但是我现在的情况就是,C#调用该dll的方法,在应该返回false的情况下它总是返回true,我改用int去接收返回值,发现这个int值很大,好像是9万多吧,不是一般的0或1,但是用C++调用就很正常,用int去接收返回值得到的也就是0或1两种情况。
如下:[DllImport("Hello.dll", EntryPoint = "Hello")]
[return:MarshalAs(UnmanagedType.I1)]
public static extern bool Hello();具体讨论看这里
http://www.codecomments.com/archive371-2005-3-441332.html
你要做的是找出C++和C#调用的不同,包括初始化和调用循序。
该书的官方网站:
www.interop123.com 豆瓣网信息:
http://www.douban.com/subject/3671497/