小弟正在做一个设备的接口开发,是用VB写的OCX,我用C#调用有一个方法调用一直不正确,请大师指导一下:
添加OCX引用后,其方法在C#中看到的定义如下:
GetAllData(string ip, ref int rowCount, ref string[] gra_Date, ref string[] gra_No);方法的作用是:从设备返回所有数据,rowCount是记录数,gra_Date是日期((应定义有 10 个元素的数组),gra_No是编号((应定义有 10 个元素的数组),厂家的技术支持提供了VB的DEMO,能正确返回结果,无C#的(问了说不懂C#,没办法,我们必须在C#中做)。该方法在C#中一直没成功返回结果。我查了一下网上的资料,好像说OCX是非托管代码,要进行封装什么的,不懂啊,这个问题已经折腾1个星期了,请各位大侠指教啊,不然要失业了。
谢谢!
添加OCX引用后,其方法在C#中看到的定义如下:
GetAllData(string ip, ref int rowCount, ref string[] gra_Date, ref string[] gra_No);方法的作用是:从设备返回所有数据,rowCount是记录数,gra_Date是日期((应定义有 10 个元素的数组),gra_No是编号((应定义有 10 个元素的数组),厂家的技术支持提供了VB的DEMO,能正确返回结果,无C#的(问了说不懂C#,没办法,我们必须在C#中做)。该方法在C#中一直没成功返回结果。我查了一下网上的资料,好像说OCX是非托管代码,要进行封装什么的,不懂啊,这个问题已经折腾1个星期了,请各位大侠指教啊,不然要失业了。
谢谢!
解决方案 »
- 听说CSDN牛人多,特来求助....
- 如何实现登录与退出时将登录ID写入数据库的一个表中
- 有没有睡的吗?转入一个datatable然后进过下面处理,再返回一个datatable 结果传入的table里面的值也变了。
- stringbuilder100次拼装字符串所消耗的时间
- 关于双击BUTTON按钮后,事件写在哪里
- 关于windows 服务宿主(.net)
- 急,急,急!vs2005 与 office 结合!
- windows应用程序开发好还是asp.net开发好?
- 请问在C#里面可不可以实现三维效果来啊?
- datagrid中怎么让显示null的地方显示为空?
- C#连接SQL server 2008 的问题
- 一个判断的语句来让推荐+1的判断
int count = 0;
string[] gra_Date = new string[14];
string[] gra_No = new string[14];int retVal = tbocx.GetAllData("192.168.0.100", ref count, ref gra_Date, ref gra_No);正确执行,retVal应该返回为0, 数据是保存在数组中的。
我现在执行返回结果为负数。OCX的其它方法都调用正确,就只有这个方法的参数是数组,其它方法的参数都是简单类型。
C#我是折腾了一个星期都没解决到。
这个已经做了,OCX的其它方法我都能正确调用
GetAllData(string ip, ref int rowCount, ref object gra_Date, ref object gra_No);
调用时:
int count = 0;
object gra_Date = new VariantWrapper("日期");
object gra_No = new VariantWrapper("编号");
int retVal = tbocx.GetAllData("192.168.0.100", ref count, ref gra_Date, ref gra_No);
你的函数签名是错的?
我在C#中添加OCX引用后,声明OCX对象后,它的方法的参数类型就是string[],不是object啊。
运行Visual Studio程序组下面Microsoft Windows SDK Tools -> OLE/COM Object View
File->View TypeLib...
c#在和ocx的交互上,数据类型确实是个很麻烦的东西。
你在右边的引用栏,点击这个ocx,看看这个方法到底是不是你说的这样:
GetAllData(string ip, ref int rowCount, ref string[] gra_Date, ref string[] gra_No);如果确实是这样,你把在C#中的代码贴出来看看。
通过添加控件的方法,在C#中看到这个方法的定义:
GetAllData(string ip, ref int rowCount, ref Array gra_Date, ref Array gra_No);通过Aximp.exe生成DLL添加引用,看到的就是string[],而不是Array.提供的VB,DEMO,代码很简单,
Dim gra_count As Long
Dim gra_Date(14) As String
Dim gra_No(14) As String
Me.OCX1.GetAllData(IP, Record_Num, gra_Date(), gra_No())
string[] gra_Date=new string[14]{""};
int gra_No=0;
string[] gra_No=new string[14]{""};int retVal = tbocx.GetAllData("192.168.0.100", ref count, ref gra_Date, ref gra_No);
byte[] tempbyte = new byte[50];
int retVal = tbocx.GetAllData("192.168.0.100", ref count, tempbyte[0], tempno[0]);
Public Function GetAllData(ByVal IP As String, ByRef RowCount As Long,
ByRef GRA_Date() As String, ByRef GRA_No() As String) As Long我通过Aximp.exe生成DLL添加引用,看到的参数类型就是string[]。难道是Aximp.exe生成有误?
GetAllData(string ip, ref int rowCount, ref string[] gra_Date, ref string[] gra_No);
另外,你的疑问Aximp.exe生成有误时完全可能的。俺用BCB时IDE自带的工具生成的代码连头文件的声明都是错的,所有的注释被它当做代码。
int count = 0;
string[] gra_Date = new string[14];
string[] gra_No = new string[14];int retVal = tbocx.GetAllData("192.168.0.100", ref count, ref gra_Date, ref gra_No);正确执行,retVal应该返回为0, 数据是保存在数组中的。
我现在执行返回结果为负数。OCX的其它方法都调用正确,就只有这个方法的参数是数组,其它方法的参数都是简单类型。
----------------------------------------------------------------------
这里gra_Date和gra_No只是分配了制定数目的引用,而没有分配sring对象,我怀疑是不是这儿的代码问题。
string[] gra_Date = new string[14];
for (int i = 0; i < 14; ++i)
{
gra_Date[i] = new string();
}
string[] gra_No = new string[14];
for (int i = 0; i < 14; ++i)
{
gra_No[i] = new string();
}
VB是VS里自带的那个吗?