在c#中引入com组件时,C#自动将接口函数的结构指针(形式参数)转化成
System.IntPtr类型,却删除了out关键字. 即原来的[out]int* 变成了 out int --- (这个保留了out关键字,完全没有问题)
[out]int** 变成了 System.IntPtr
---(这个被C#去掉了out关键字,因而无法将数据传出)请问怎样解决这个问题呢?(在不修改原组件的前提下)注 : 组件是用VC6 ATL写的。//====================================
这里给出我作的一个失败的试验:
(VCCOM是组件名,TwoParameter是接口,ReturnArray是TwoParameter的函数方法) VCCOMLib.TwoParameterClass tpc=new VCCOMLib.TwoParameterClass();
int[] iArray=new int[10];
fixed(int* pArray=iArray)
{
int size;
System.IntPtr intptr=new System.IntPtr((void*)pii);
tpc.ReturnArray(10,out size,intptr);
int* newArray=(int*)intptr.ToPointer();
}
这种方法编译和执行都可以通过,
但是实际上什么值都没有传出来,会发现newArray永远都是值为0的整数数组。另外,强行加out或者ref在System.IntPtr前面也不行,因为编译无法通过。
System.IntPtr类型,却删除了out关键字. 即原来的[out]int* 变成了 out int --- (这个保留了out关键字,完全没有问题)
[out]int** 变成了 System.IntPtr
---(这个被C#去掉了out关键字,因而无法将数据传出)请问怎样解决这个问题呢?(在不修改原组件的前提下)注 : 组件是用VC6 ATL写的。//====================================
这里给出我作的一个失败的试验:
(VCCOM是组件名,TwoParameter是接口,ReturnArray是TwoParameter的函数方法) VCCOMLib.TwoParameterClass tpc=new VCCOMLib.TwoParameterClass();
int[] iArray=new int[10];
fixed(int* pArray=iArray)
{
int size;
System.IntPtr intptr=new System.IntPtr((void*)pii);
tpc.ReturnArray(10,out size,intptr);
int* newArray=(int*)intptr.ToPointer();
}
这种方法编译和执行都可以通过,
但是实际上什么值都没有传出来,会发现newArray永远都是值为0的整数数组。另外,强行加out或者ref在System.IntPtr前面也不行,因为编译无法通过。
解决方案 »
- archive->WriteString(_T(" ")+_T("\r\n"))报错
- 如何使用CStringArray
- 为什么我写的网络程序只能在局域网上运行?
- MoveTo, LineTo画线的颜色,怎么设?
- 2000下编的raw socket 为什么在xp下就截不到包了??? 急问,狂给分!
- 跪求: 如何在CSplitterWnd中切换View
- 求助:在VC++中的SDI中绘制几何图形时,怎样平移坐标原点!
- 哪位有关于这方面的源代码?
- 求助呀,总解决不了!我作了两个聊天程序,如何通过proxy服务器建立连接并传递信息?
- 使用api如何得到打印机属性中的(papers per sheet)
- Splitter和Toolbar混合使用的一个错误
- 如何用ODBC对Access数据库的多个表进行操作
如果是前者,原来的组件就是 int** 的参数,我也没有办法啊还望哪位位兄台给出一个不修改原来的组件而能够传出数据的方法。。
谢谢了!!BOW
(如果可以修改COM组件的话,我已经找到解决方法,就是把[out]int**
改成[out.retval]int**, 这样的话就能把COM的返回值传出到C#中。)
待会我会另开一个帖子详细说明的。BOW TO ANALYST。