急求解法,C#调用COM,传递数组参数的问题,谢谢~ COM的dll是你自己写的吗?参数类型改成(int* a,int length)试试~~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是自己写的,我也改成了(int* a,int length),依然挂。是不是ref只传过去一个数据,而后面的数据没有跟着一起过去呀?应该用动态还是静态调用的啊? 记得注册表里dll的路径先写成你调试的路径,搞定了再把dll放到windows 目录下去,当然你也可以放在其他路径~~~~ 既然是调用COM,为什么还要用DllImport呢?COM公布的函数并不需要是导出函数,COM的激活和调用是另外一种机制。 int* 和int[]其实是一样的,数组做参数会退化成指针的。楼主想用PInvoke的方法,应该这样用PInvoke传递数组:[MarshalAs(UnmanagedType.LPArray, SizeConst = 4)]int Array[]我觉得用调用COM的话,应该用NETtoCOM的Marshall的方法,相关知识可以看一下msdn中Marshall。 对于楼主的问题可以这样解决:.NET调用COM的方法:第一步,注册COM server, regsvr32 *.dll(这个事进程内服务器)第二步,using System.Reflection;using System.Runtime.InteropServices;using System.Runtime.CompilerServices;[ComImport, Guid("E587FEE6-F270-4B66-B568-C69694FB2B16"),CoClass(typeof(VarComSvr2Lib.VarSvr2Class)), TypeLibType((short)0x10c0)] public interface IVarServer2 : VarComSvr2Lib.IVarSvr2 { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(1)] bool ArrayTest2([MarshalAs(UnmanagedType.LPArray), SizeConst = 10]int[] intArray, int length); }这是Import一个COM接口第三步调用要用的方法,有两种方法:早绑定(early bound)int[] intArr = new int[10];IVarServer2 svr_earlybound = new IVarServer2();svr_earlybound.ArrayTest2(intArr, 10);晚绑定(late bound)Type typeSvr = Type.GetTypeFromProgID("VarComSvr2.VarSvr2");object svr_latebound = Activator.CreateInstance(typeSvr); int[] paramarr = new int[1]; ParameterModifier p = new ParameterModifier(1); p[0] = true; ParameterModifier[] mods = { p }; System.Boolean vt_value = false; paramarr[0] = vt_value; bool retBool = (bool)typeSvr.InvokeMember( "TakeVar_VT_BOOL_AsParamByRef", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, svr_latebound, paramarr, mods, null, null );不过貌似VS2008中不可以对数组进行晚绑定。希望这些对楼主有帮助。 你的问题主要就是COM Interop过程中的数据封送问题。楼上有人已经给出了正确的答案。但是如果只获得答案,不知道原理,以后遇到了此类问题还是不知道如何下手。如果你想系统学习如何进行数据封送,我推荐你阅读刚刚出版的新书:《精通.NET互操作P/Invoke,C++Interop和COM Interop》,这本书的第5,6章都详细讲述了COM Interop中的数据封送处理,非常详细,我就是读完后才搞清楚COM Interop的。 该书的官方网站: www.interop123.com 豆瓣网信息: http://www.douban.com/subject/3671497/ 还是没有解决方法吗?书我也找过了,里面似乎没有提到用传递字符串数组到COM里去的示例嘛,有也是在COM那头用的是SAFEARRAY的,没有提到C Style 这个问题我也遇到了,有点技术,我是用C#调用ocx控件传递数组参数,搞了两天终于成功了ocx是用vc写的,这里关键是用safearray,再用variant包装safearrayc#用object传递数组哪位要实例代码,可以联系我[email protected] 请问如何在代码中动态定义Grid分成几行几列呢? 在第三方图形控件上如何再画上自己的图形 我快疯了,一个API的问题 C# winform 将某个路劲下txt文件转化成EXCEL 如何提取二进制位? 这ListView的图标怎么这么小呀 Framwork2.0beta 的困惑 找不到类名或空间名称“DBAccess”,怎么解决阿??各位求求帮帮忙!!! 如何使用cookie? 怎么能让我在office中写的宏代码保密 c# 如何删除datagridview中数据并删除数据库中的数据 外企题(续)
是不是ref只传过去一个数据,而后面的数据没有跟着一起过去呀?应该用动态还是静态调用的啊?
第一步,注册COM server, regsvr32 *.dll(这个事进程内服务器)
第二步,using System.Reflection;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;[ComImport, Guid("E587FEE6-F270-4B66-B568-C69694FB2B16"),CoClass(typeof(VarComSvr2Lib.VarSvr2Class)), TypeLibType((short)0x10c0)]
public interface IVarServer2 : VarComSvr2Lib.IVarSvr2
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(1)]
bool ArrayTest2([MarshalAs(UnmanagedType.LPArray), SizeConst = 10]int[] intArray, int length);
}这是Import一个COM接口第三步调用要用的方法,有两种方法:早绑定(early bound)
int[] intArr = new int[10];
IVarServer2 svr_earlybound = new IVarServer2();
svr_earlybound.ArrayTest2(intArr, 10);
晚绑定(late bound)Type typeSvr = Type.GetTypeFromProgID("VarComSvr2.VarSvr2");
object svr_latebound = Activator.CreateInstance(typeSvr); int[] paramarr = new int[1]; ParameterModifier p = new ParameterModifier(1);
p[0] = true;
ParameterModifier[] mods = { p };
System.Boolean vt_value = false;
paramarr[0] = vt_value; bool retBool = (bool)typeSvr.InvokeMember(
"TakeVar_VT_BOOL_AsParamByRef",
BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,
null,
svr_latebound,
paramarr,
mods,
null,
null
);不过貌似VS2008中不可以对数组进行晚绑定。希望这些对楼主有帮助。
该书的官方网站:
www.interop123.com 豆瓣网信息:
http://www.douban.com/subject/3671497/
ocx是用vc写的,这里关键是用safearray,再用variant包装safearray
c#用object传递数组哪位要实例代码,可以联系我[email protected]