首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-03-13 
C#调用OCX,传递参数问题OCX是用VC写的函数原型:LONG TH_Layout(VARIANT* rcBoundTop)在工程中添加给OCX控

C#调用OCX,传递参数问题
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参数?

[解决办法]
我当时对海康某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);

[解决办法]
调用

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

        ...

        return HikFormatConvertDll.FMTCVT_Create(ref hFMCVT);

        ...

        HikFormatConvertDll.FMTCVT_Release(hFMCVT);

[解决办法]
试试
int[] rcBoundTop = new int[100]
object rcBoundTop1= new System.Runtime.InteropServices.VariantWrapper(rcBoundTop);
TH_Layout(ref rcBoundTop1);
[解决办法]
这个封装应该更适合你的处理

        /// <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);

[解决办法]
引用:
大家遇到过这种问题吗?
我很是怀疑,这种参数传递能成功吗?

没尝试过这个,既然是自己封装成ref object,说明NET对这个有处理,用VariantWrapper封送。在MSDN上去了解一下
http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.variantwrapper(v=vs.100).aspx参考

热点排行