现在VS2005 C#的环境下调用一个VC做成的OCX,
1、其中有个函数:vc
long CKeyOcx::ReadLockList(long sys_code, long password, long* lock_list)
{
long result;
static BYTE parms[] =
VTS_I4 VTS_I4 VTS_PI4;
InvokeHelper(0xb, DISPATCH_METHOD, VT_I4, (void*)&result, parms,
sys_code, password, lock_list);
return result;
}
2、做成OCX,在C#中调用时的格式:
int ReadLockList(int sys_code,int password, ref int lock_list);
3、而在VC调用上面那个VC函数的利子为:
void CKeyOcxTestDlg::OnReadLockList()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CString m_str;
long list[3080];
long length = m_keyocx.ReadLockList(m_edit1,m_edit2,list);
if(length != 10000)
{
m_edit27 = "";
for(long i=0; i<length; i++)
{
m_str.Format("%d ",list[i]);
m_edit27 = m_edit27+m_str;
}
UpdateData(FALSE);
}
else
{
MessageBox("读锁具列表失败!");
}
}
谁能把这个VC调用的例子翻译成C#的啊?在线等................
1、其中有个函数:vc
long CKeyOcx::ReadLockList(long sys_code, long password, long* lock_list)
{
long result;
static BYTE parms[] =
VTS_I4 VTS_I4 VTS_PI4;
InvokeHelper(0xb, DISPATCH_METHOD, VT_I4, (void*)&result, parms,
sys_code, password, lock_list);
return result;
}
2、做成OCX,在C#中调用时的格式:
int ReadLockList(int sys_code,int password, ref int lock_list);
3、而在VC调用上面那个VC函数的利子为:
void CKeyOcxTestDlg::OnReadLockList()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CString m_str;
long list[3080];
long length = m_keyocx.ReadLockList(m_edit1,m_edit2,list);
if(length != 10000)
{
m_edit27 = "";
for(long i=0; i<length; i++)
{
m_str.Format("%d ",list[i]);
m_edit27 = m_edit27+m_str;
}
UpdateData(FALSE);
}
else
{
MessageBox("读锁具列表失败!");
}
}
谁能把这个VC调用的例子翻译成C#的啊?在线等................
int ReadLockList(int sys_code,int password, ref int[] lock_list); public void OnReadLockList()
{
UpdateData(true);
String m_str;
int[] list=new long[3080];
int length = ReadLockList(m_edit1,m_edit2,list);
if(length != 10000)
{
m_edit27 = "";
for(int i=0; i <length; i++)
{
m_edit27 = String.Format("{0}{1:d}",m_edit27,list[i]);
}
UpdateData(false);
}
else
{
MessageBox.Show("读锁具列表失败!");
}
}
这个函树的格式是:
int ReadLockList(int sys_code,int password, ref int lock_list);
而不是:
int ReadLockList(int sys_code,int password, ref int[] lock_list); 写OCX的人说,要用指针,就不怎么写了。
int ReadLockList(int sys_code,int password,ref int lock_list); 如果在C#中传int 整型的参数进去,只能取出lock_list中的第一个值
int[] list=new long[3080];
int length = ReadLockList(m_edit1,m_edit2,list); 运行时就出现下面的错误:
与“AxKEYOCXLib.AxKeyOcx.ReadLockList(int, int, ref int)”最匹配的重载方法具有一些无效参数
参数“3”: 无法从“ref int[]”转换为“ref int”
事实上应该是指针,是表示一个长整数数组的指针看VC的调用:
long list[3080]; //这就是那个长指针
long length = m_keyocx.ReadLockList(m_edit1,m_edit2,list); 你可以用不安全代码,定义一个长整数数组,然后把这个数组的地址转成int传到C#自动生成的方法里面。我没具体试过,但感觉这样应该可以
然后你把那个数组用Marshal.Copy方法拷贝到一个IntPtr变量里面传入
IntPtr arrptr=IntPtr.Zero;
long list[3080]={0};
MarShal.Copy(list,0,arrptr,list.Length);
int length = ReadLockList(m_edit1,m_edit2,arrptr.ToInt32);
long[] list=new long[3080];
for (int p = 0; p < 3080;++p )
list[p] = 0;
Marshal.Copy(list, 0, arrptr, list.Length);
int abc=arrptr.ToInt32();
RecordCount = axKeyOcx1.ReadLockList(sys_code, password, ref abc);
int mm = 0;
if (RecordCount != 10000)
{
string strlock_list = "";
for (int i = 0; i < RecordCount; ++i)
{
mm = (int)list[i];
strlock_list = strlock_list + mm.ToString() + " ";
}
this.textBox1.Text = strlock_list; }
调试到:Marshal.Copy(list, 0, arrptr, list.Length);
出现异常:
未处理 ArgumentNullException
值不能为空。
参数名: destination这是什么问题呢?