C# 调用C++写的COM组件 数据类型转换问题 本帖最后由 zhangqiang1283 于 2010-04-29 17:34:00 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 string pin="111";你这个pin只能是字符串么?? 不太清楚,要不试下 ref byte[] pin byte[] pin= null; pin= new ASCIIEncoding().GetBytes("111"); string myStr=new UnicodeEncoding().GetString(pin); C#中key.UsbUserLogin封装后的原型是什么?byte[] pin= System.Text.Encoding.Ascii.GetBytes("111");key.UsbUserLogin(hkey,ref pin[0] ,3); 封装后的原型是:void Ikey.UsbUserLogin(int hkey,ref byte lpPinStr,int pinStrLen) 封装后的原型是:void Ikey.UsbUserLogin(int hkey,ref byte lpPinStr,int pinStrLen)我有个不解的地方是:我在C++封装的接口返回值类型是HRESULT ,而且通过HRESULT 类型的返回值去判断与硬件key的通信是否成功。但是到C#下,封装后的接口返回值类型成了void,那我就不能获取到返回值了啊,也就不能通过返回值判断与硬件key的交互是否成功了啊! http://topic.csdn.net/u/20100416/15/237ea3e7-7162-410e-9a34-b6dd93781dd4.html调用方法没问题,但是需要手工写一个封装。用[PreserveSig]来声明不要把HRESULT吃掉http://topic.csdn.net/u/20080416/15/e17805a1-57a8-4c0a-a2ca-c03dd07e85fb.html DllImportAttribute.PreserveSig 字段http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.dllimportattribute.preservesig(VS.80).aspxhttp://msdn.microsoft.com/zh-cn/library/aa288455(VS.71).aspx在 COM 中,返回成功或失败的常用方法是返回一个 HRESULT,并在 MIDL 中有一个标记为“retval”、用于方法的实际返回值的 out 参数。在 C#(和 .NET Framework)中,指示已经发生错误的标准方法是引发异常。默认情况下,.NET Framework 为由其调用的 COM 接口方法在两种异常处理类型之间提供自动映射。 返回值更改为标记为 retval 的参数的签名(如果方法没有标记为 retval 的参数,则为 void)。标记为 retval 的参数从方法的参数列表中剥离。任何非成功返回值都将导致引发 System.COMException 异常。CodePlex开源版Tlbimp.exe的两个新功能http://blogs.msdn.com/silverlightshanghai/archive/2008/10/15/codeplex-tlbimp-exe.aspx exe 所在的目录 如何将XML文件加入到treeviee控件中呢? 如何在点击按钮后重启C#做的应用程序? SQLServer2005安装之后没有查询分析器 关于泛型结构的问题 高人入 求救!怎样修改数据中的内容? 请问怎样把一个类编译成.dll文件啊?? C# 编写的 ActiveX 控件中含有事件。在HTML中无法触发,始终提示 事件为空! 我要做一个火车售票系统,请问如何实现可以售当天及以后三天的票? 谁能帮我用C#写一个新闻系统?(仿动网.net新闻)--在线急等 新闻快客怎么做? 五个方法通用化问题!
你这个pin只能是字符串么??
pin= new ASCIIEncoding().GetBytes("111");
string myStr=new UnicodeEncoding().GetString(pin);
key.UsbUserLogin(hkey,ref pin[0] ,3);
封装后的原型是:
void Ikey.UsbUserLogin(int hkey,ref byte lpPinStr,int pinStrLen)
封装后的原型是:
void Ikey.UsbUserLogin(int hkey,ref byte lpPinStr,int pinStrLen)我有个不解的地方是:
我在C++封装的接口返回值类型是HRESULT ,而且通过HRESULT 类型的返回值去判断与硬件key的通信是否成功。
但是到C#下,封装后的接口返回值类型成了void,那我就不能获取到返回值了啊,也就不能通过返回值判断与硬件key的交互是否成功了啊!
http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.dllimportattribute.preservesig(VS.80).aspxhttp://msdn.microsoft.com/zh-cn/library/aa288455(VS.71).aspx
在 COM 中,返回成功或失败的常用方法是返回一个 HRESULT,并在 MIDL 中有一个标记为“retval”、用于方法的实际返回值的 out 参数。在 C#(和 .NET Framework)中,指示已经发生错误的标准方法是引发异常。默认情况下,.NET Framework 为由其调用的 COM 接口方法在两种异常处理类型之间提供自动映射。 返回值更改为标记为 retval 的参数的签名(如果方法没有标记为 retval 的参数,则为 void)。
标记为 retval 的参数从方法的参数列表中剥离。
任何非成功返回值都将导致引发 System.COMException 异常。CodePlex开源版Tlbimp.exe的两个新功能
http://blogs.msdn.com/silverlightshanghai/archive/2008/10/15/codeplex-tlbimp-exe.aspx