借人气,问下C#调用COM中传BYTE数组的

purexiafeng 2009-06-17 01:14:27
我用VC写了个COM组件写了个方法如下

在 CTEST3Ctrl.h里声明:
LONG AddIn(BYTE* pFrame, LONG* plSize);
在CTEST3Ctrl.cpp实现
LONG CCTEST3Ctrl::AddIn(BYTE* pFrame, LONG* plSize)
{
。。。
}

在IDL声明
[id(1), helpstring("方法AddIn")] LONG AddIn(SAFEARRAY(byte)pFrame, LONG* plSize);
在CTEST3Ctrl.cpp映射的类型
BEGIN_DISPATCH_MAP(CCTEST3Ctrl, COleControl)
DISP_FUNCTION_ID(CCTEST3Ctrl, "AddIn", dispidAddIn, AddIn, VT_I4, VTS_PUI1 VTS_PI4)
END_DISPATCH_MAP()


但是我在C#里调用时总是报类型不匹配

try
{
int size = 200;
byte[] d = new byte[200];
axCTEST31.AddIn(d, ref size);
}
catch (COMException c)
{
MessageBox.Show(c.Message.ToString());
}


请问各位大侠,我代码哪里有问题?我是照着MSDN上的那个例子写的

MSDN例子:

为提高交互操作,可以在非托管方法签名中将参数作为 SAFEARRAY 键入。例如:

复制代码
HRESULT DoSomething(SAFEARRAY(byte)buf);
...全文
196 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
purexiafeng 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 majunfanxuejia 的回复:]
希望对你有帮助

利用反射进行动态加载和调用.
Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载

加载dll后,需要使用dll中某类.
Type type=ass.GetType("namespace.ClassName");//利用类型的命名空间和名称获得类型

需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
Object obj = Activator.CreateInstance(type,params[]);//利用指定的参数实例话类型
//params[] 为 new…
[/Quote]
我就想传个byte数组给 COM控件里。。。
gtiroy 2009-06-18
  • 打赏
  • 举报
回复
[DllImport(xxx.dll)]
dll中的方法。
直接调用就可以了。
saturn4263195 2009-06-18
  • 打赏
  • 举报
回复
数据流
XX青龙 2009-06-18
  • 打赏
  • 举报
回复
希望对你有帮助

利用反射进行动态加载和调用.
Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载

加载dll后,需要使用dll中某类.
Type type=ass.GetType("namespace.ClassName");//利用类型的命名空间和名称获得类型

需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
Object obj = Activator.CreateInstance(type,params[]);//利用指定的参数实例话类型
//params[] 为 new object[]{}参数

调用类型中的某个方法:
需要首先得到此方法
MethodInfo mi=type.GetMethod("MehtodName");//通过方法名称获得方法

然后对方法进行调用,多态性利用参数进行控制
mi.Invoke(obj,params[]);//根据参数直线方法,返回值就是原方法的返回值
自动返回返回值



yangjiang113 2009-06-18
  • 打赏
  • 举报
回复
顶一个
kangbo818 2009-06-18
  • 打赏
  • 举报
回复
帮顶
evaa006 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gtiroy 的回复:]
[DllImport(xxx.dll)]
dll中的方法。
直接调用就可以了。
[/Quote]
UP
oo_2008 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 purexiafeng 的回复:]
下毛的班。来人解决下撒,不解决都不准下班
[/Quote]
呵呵.....
chenchangxiong 2009-06-17
  • 打赏
  • 举报
回复
int size改成Int32试试
Neil198 2009-06-17
  • 打赏
  • 举报
回复
Mark
purexiafeng 2009-06-17
  • 打赏
  • 举报
回复
下毛的班。来人解决下撒,不解决都不准下班
moonshineidolon 2009-06-17
  • 打赏
  • 举报
回复
帮顶
gwf25sz 2009-06-17
  • 打赏
  • 举报
回复
要下班啦,哈哈
顶顶
xxyping 2009-06-17
  • 打赏
  • 举报
回复
下班!mark!
purexiafeng 2009-06-17
  • 打赏
  • 举报
回复
有高人能回答下吗
okkq2000 2009-06-17
  • 打赏
  • 举报
回复
实在不懂.帮你顶到前边去..希望高手解答
purexiafeng 2009-06-17
  • 打赏
  • 举报
回复
-_-领导有规定
evaa006 2009-06-17
  • 打赏
  • 举报
回复
ding
ghost5216 2009-06-17
  • 打赏
  • 举报
回复
你做成dll吧
using System.Runtime.InteropServices;
然后
[DllImport()]
purexiafeng 2009-06-17
  • 打赏
  • 举报
回复
-_-
加载更多回复(1)

111,097

社区成员

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

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

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