从C#向COM(ocx)传递int array,Typelib直接转换过来的类型是ref int&无法传递

brallow 2009-03-02 03:27:34
代码说明:int array应由C#生成,由ocx的函数填充并返回填充后大小;

尝试方案:
直接使用
int[100] abc = new int[100];
ocx.Get(ref abc[0]); //虽然这明显不行,但我还是尝试了;

试着通过AllocHGlobal申请4*100大小的内存区域然后将第一个int传入
程序消失了,没有报任何异常。

我查找了一些资料,似乎有一些方法可用:
1、需要反编译Interop.xxx.dll为il,然后修改il代码再传递native int,但此方法修改后无法编译il代码;
2、有无其它标准方案?



...全文
229 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fjchenqian 2009-09-17
  • 打赏
  • 举报
回复
请问一下。这个问题你解决了吗?我也遇到和你类似的问题。
brallow 2009-03-23
  • 打赏
  • 举报
回复
MVP也木有搞定,看来是这个OCX有问题,感谢各位的帮助!我还是用蠢办法好了。
北京的雾霾天 2009-03-03
  • 打赏
  • 举报
回复
可以说设置OCX的程序没有考虑全面,如果使用它使用SafeArray应该不会有问题了。使用指针来表示数据只有在非托管的C++程序使用最方便了。
brallow 2009-03-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jinjazz 的回复:]
C# codeint[] abc=newint[100];intabc_p=Marshal.UnsafeAddrOfPinnedArrayElement(abc,0).ToInt32();
ocx.Get(refabc_p);

试试
[/Quote]
NEG
仍然是消失了,看来这个OCX也不是个什么好东西。
jinjazz 2009-03-02
  • 打赏
  • 举报
回复
int[] abc = new int[100];
int abc_p = Marshal.UnsafeAddrOfPinnedArrayElement(abc,0).ToInt32();
ocx.Get(ref abc_p);


试试
brallow 2009-03-02
  • 打赏
  • 举报
回复
呵呵,可以改OCX的话我就不用OCX而改用其它形式了,可惜了:)
oyljerry 2009-03-02
  • 打赏
  • 举报
回复
如果可以修改ocx的话,就可以修改参数,让它参数使用SAFEARRAY方式,这样比较适合跨语言等来调用,以及传递参数等
readfuture 2009-03-02
  • 打赏
  • 举报
回复
不会,帮顶
北京的雾霾天 2009-03-02
  • 打赏
  • 举报
回复
BOOL GetXXXX(long* Data, long* Size);
----------------
在C#里估计看到的不是一个数组,而是两个整数类型的参数。

在ActiveX里输入输出数据使用SAFEARRAY是合适的。这样比如在C#里经过转换后就是一个Array类型的,当然可以是强类型的比如int[]类型,这主要是看怎么OCX里声明的方式。


不过对于像这种声明我觉得可能需要使用C#的UnSafe来写代码。因为在UnSafe里是可以通过指针来操作数据的。而默认的是不可以的。
ls3697264 2009-03-02
  • 打赏
  • 举报
回复
UP
oyljerry 2009-03-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 phy 的回复:]
BOOL GetXXXX(long* Data, long* Size);
[/Quote]
这个接口是C++方式调用,你要么通过C++ 等dll来调用
brallow 2009-03-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 oyljerry 的回复:]
要么就走其他媒介,比如先存到xml文件等,然后转换后,再传入ocx等,符合ocx的要求
[/Quote]
这个方案我试过了,可行。不过觉得不够完美,所以来求助一下:)
oyljerry 2009-03-02
  • 打赏
  • 举报
回复
要么就走其他媒介,比如先存到xml文件等,然后转换后,再传入ocx等,符合ocx的要求
brallow 2009-03-02
  • 打赏
  • 举报
回复
BOOL GetXXXX(long* Data, long* Size);
北京的雾霾天 2009-03-02
  • 打赏
  • 举报
回复
那OCX的方法是怎么声明的呢?
brallow 2009-03-02
  • 打赏
  • 举报
回复
是滴,过年HAPPY去了:)哈哈……
我姓区不姓区 2009-03-02
  • 打赏
  • 举报
回复
好久不见楼主
brallow 2009-03-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hbxtlhx 的回复:]
这不取决于你的C#代码,而是看OCX是怎么实际的。按理OCX中应该使用SafeArray,这样声明的数据和C#等其它语言是可以很好的交互的。
[/Quote]
怎么解决这个问题?我如果想取得这个数据的话。没办法修改OCX.
sxmonsy 2009-03-02
  • 打赏
  • 举报
回复
我是板登
北京的雾霾天 2009-03-02
  • 打赏
  • 举报
回复
这不取决于你的C#代码,而是看OCX是怎么实际的。按理OCX中应该使用SafeArray,这样声明的数据和C#等其它语言是可以很好的交互的。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧