C#调用OCX,传递参数问题

Tiger-3D 2013-03-05 03:10:25
OCX是用VC写的
函数原型:
	LONG TH_Layout(VARIANT* rcBoundTop);

在工程中添加给OCX控件之后,编译器将该函数对应成这样:
public virtual int TH_Layout(ref object rcBoundTop);

其中VC中VARIANT类型的参数对应着int型的数组
请问,该怎样把 int[] rcBoundTop = new int[100];中的rcBoundTop传递给C#中的rcBoundTop参数?
...全文
357 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujiahaol123 2013-12-11
  • 打赏
  • 举报
回复
遇到相同的问题,只是我这里被编译成objec,不是ref object
Tiger-3D 2013-04-27
  • 打赏
  • 举报
回复
引用 11 楼 Chinajiyong 的回复:
这个解决了没啊
没有解决
joonny 2013-03-11
  • 打赏
  • 举报
回复
没遇到过 没遇到过
EnForGrass 2013-03-11
  • 打赏
  • 举报
回复
这个解决了没啊
EnForGrass 2013-03-05
  • 打赏
  • 举报
回复
引用 9 楼 ljhtdcq 的回复:
大家遇到过这种问题吗? 我很是怀疑,这种参数传递能成功吗?
没尝试过这个,既然是自己封装成ref object,说明NET对这个有处理,用VariantWrapper封送。在MSDN上去了解一下 http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.variantwrapper(v=vs.100).aspx参考
Tiger-3D 2013-03-05
  • 打赏
  • 举报
回复
大家遇到过这种问题吗? 我很是怀疑,这种参数传递能成功吗?
Tiger-3D 2013-03-05
  • 打赏
  • 举报
回复
引用 6 楼 marclee44 的回复:
这个封装应该更适合你的处理 C# code?1234567891011 /// <summary> /// 设置转换参数 /// /// HRESULT __stdcall FMTCVT_SetPara(void* handle,void* pDecFileInfo); /// </summary……
可是我调用的是OCX,编译器已经将OCX中的函数参数类型转变成了不能改变的形式,参数类型固定为object了
Tiger-3D 2013-03-05
  • 打赏
  • 举报
回复
引用 5 楼 Chinajiyong 的回复:
试试 int[] rcBoundTop = new int[100] object rcBoundTop1= new System.Runtime.InteropServices.VariantWrapper(rcBoundTop); TH_Layout(ref rcBoundTop1);
试了,可是这样报错: 从非托管 VARIANT 转换为托管对象的过程中检测到无效 VARIANT。将无效 VARIANT 传递给 CLR 会导致意外的异常、损坏或数据丢失。
Marky 2013-03-05
  • 打赏
  • 举报
回复
这个封装应该更适合你的处理

        /// <summary>
        /// 设置转换参数 
        /// 
        /// HRESULT __stdcall FMTCVT_SetPara(void* handle,void* pDecFileInfo);
        /// </summary>
        /// <param name="handle">格式转换模块句柄</param>
        /// <param name="pDecFileInfo">目的文件信息(目的文件宽高,帧率、码率、文件类型、音频采样率等参数)</param>
        /// <returns>返回状态码</returns>
        [DllImport("HikFormatConvertDll.dll", EntryPoint = "FMTCVT_SetPara", CharSet = CharSet.Ansi,
            CallingConvention = CallingConvention.StdCall)]
        public static extern int FMTCVT_SetPara(IntPtr handle, IntPtr pDecFileInfo);
调用

            IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(m_pDecInfo));
            Marshal.StructureToPtr(m_pDecInfo, ptr, false);
            int ret = HikFormatConvertDll.FMTCVT_SetPara(hFMCVT, ptr);
            Marshal.FreeHGlobal(ptr);
EnForGrass 2013-03-05
  • 打赏
  • 举报
回复
试试 int[] rcBoundTop = new int[100] object rcBoundTop1= new System.Runtime.InteropServices.VariantWrapper(rcBoundTop); TH_Layout(ref rcBoundTop1);
Marky 2013-03-05
  • 打赏
  • 举报
回复
调用

        public static IntPtr hFMCVT;    //格式转换模块句柄

        ...

        return HikFormatConvertDll.FMTCVT_Create(ref hFMCVT);

        ...

        HikFormatConvertDll.FMTCVT_Release(hFMCVT);
Marky 2013-03-05
  • 打赏
  • 举报
回复
我当时对海康某SDK的封装

/// <summary>
/// 创建格式转换模块
///
/// HRESULT __stdcall FMTCVT_Create(void **handle);
/// </summary>
/// <param name="handle">返回格式转换模块句柄</param>
/// <returns>返回状态码</returns>
[DllImport("HikFormatConvertDll.dll", EntryPoint = "FMTCVT_Create", CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.StdCall)]
public static extern int FMTCVT_Create(ref IntPtr handle);

/// <summary>
/// 释放格式转换模块
///
/// HRESULT __stdcall FMTCVT_Release(void *handle);
/// </summary>
/// <param name="handle">格式转换模块句柄</param>
/// <returns>返回状态码</returns>
[DllImport("HikFormatConvertDll.dll", EntryPoint = "FMTCVT_Release", CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.StdCall)]
public static extern int FMTCVT_Release(IntPtr handle);
Tiger-3D 2013-03-05
  • 打赏
  • 举报
回复
我这样试过:
int[] rcBoundTop = new int[100]
object rcBoundTop1 = rcRoundTop;

TH_Layout(ref rcBoundTop1);
但是报错说“类型不匹配”。
Marky 2013-03-05
  • 打赏
  • 举报
回复
intptr
内容概要:本文档聚焦于基于Peng-Robinson状态方程的化工热力学计算研究,系统介绍了利用Matlab代码实现纯组分及多组分系统的压缩因子(z因子)和逸度系数的计算方法,并进一步拓展至泡点压力与露点压力的数值求解。资源涵盖了从状态方程推导、非线性方程求根、相平衡条件判断到迭代算法实现的完整技术路线,提供了可运行的Matlab程序代码,有助于深入理解实际工程中物性参数的计算原理与实现过程; 适合人群:具备化工热力学基础知识和一定Matlab编程能力的高校学生、科研人员及工程技术人员,尤其适合从事过程系统模拟、油气田开发、精馏设计及相关领域研究的专业人士; 使用场景及目标:① 掌握Peng-Robinson方程在真实气体物性计算中的应用;② 实现多组分混合体系的相平衡计算与泡/露点预测;③ 为Aspen Plus等商用流程模拟软件提供底层算法验证与教学参考;④ 支持科研论文复现、课程设计、毕业设计及工业过程优化中的热力学数据支撑需求; 阅读建议:建议读者结合经典化工热力学教材同步学习,重点理解立方型状态方程的根判别、迭代收敛策略与相平衡准则的数学表达,动手调试并运行所提供的Matlab代码以掌握算法细节,还可将其扩展应用于其他状态方程(如SRK、vdW)的对比分析研究。

111,130

社区成员

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

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

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