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参数?
...全文
284 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
控件是标准的ActiveX控件,适用于Windows平台下的所有开发编程工具,例如Delphi、VB、C#、C++、Java、PB等。控件封装了标准AT指令、手机与计算机的通信内容,提供了发送短信、接收短信、拨打电话、接听电话等函数和事件,非常方便二次开发。 控件需要的硬件设备是高深商公司研发的“手机盒”(见下面的名词解析)或能与计算机连接的手机(要求手机通过COM口通信)。 名词解析: 超长短信 --- 当短信超过68个字时,就是超长短信。手机自动把超长短信分成几条短信发送,接收时也分多条短信形式存储在SIM卡中,在读短信时,临时组装成超长短信。 手机盒 --- 与计算机连接的设备,插入SIM卡才能使用。该设备尺寸为100mm×58mm×24.5mm(长×宽×高,其中天线21mm),有一个标准的USB接口,通过标准的USB连接线,连接计算机。该设备不用电池,启动计算机后,就会自动开启。利用此设备,可以把计算机当成手机使用,在电脑上收发短信,拨打电话。一台计算机可以连接多个设备,并通过参数devid区分不同的手机盒。有关手机盒的更多详细信息,请拨打电话020-38259081咨询。 主要属性: BaudRate --- 与计算机连接的波特率,最好不要人工设置,而是采用设置函数SetupPort自动查找。 Port --- 与计算机连接的端口,同上不要人工设置。 JDConnected --- 与计算机是否已连接,即是否已经打开端口。 QueryATSeconds --- 当执行AT查询指令时,最长等待反应时间,默认2秒。 ReadLongSmsSeconds --- 读超长短信时,最长的延时时间,默认30秒。 ReadSmsSeconds --- 读普通短信时,最长的延时时间,默认5秒。 ReadLongSmsWay --- 读短信函数ReadSms的工作方式(针对超长短信),有0、1、2数值可选择: 0 一般用于收到短信事件OnSms中;在读超长短信时,只有当id为最后一条短信id,才完整地读超长短信; 1 常用的读短信方式;当遇到超长短信时,首先计算此超长短信第一条id,按顺序读,当不成功时,读所有短信; 2 只要是超长短信,首先把SIM卡内的所有短信都读出来,拼接成此条超长短信; 建议在OnSms事件中调用ReadSms时,ReadLongSmsWay设为0,其它时候设为1。 ReturnCompleteLongSms --- 默认False;如果设为True,ReadSms读短信,当遇到超长短信时,只有当超长短信读完整,才返回短信内容,读超长短信异常,例如超长短信还没有完整接收时,就执行ReadSms,导致超长短信不能读完整,则ReadSms返回0。 ShowRxChar --- 默认False;如果设为True,显示手机盒与计算机通讯的内容,方便调试。 ShowTip --- 默认True,表示当执行ReadSMS、ReadAllSms、QueryAT等函数时,提示手机盒正在与计算机通讯。 ExecJDSmsEvent --- 默认True,表示收到短信时自动执行OnJDSms事件;当为False时,不触发OnJDSms,即不执行OnJDSms。 主要事件: OnAfterOpen ---- 打开连接端口时触发。 OnAfterClose ---- 关闭连接端口时触发。 OnRing --- 当有电话呼入时,手机响铃,触发此事件;有2个传递参数值: no为来电号码; devid是手机盒连接标识号,整数,其值为0,1,2... OnEndRing --- 对方挂断手机,响铃结束,触发此事件;有1个传递参数值: devid是手机盒标识号,其值为0,1,2... OnJDSms --- 手机盒接收到短信,并完整读取短信时,触发此事件;事件在ExecJDSmsEvent=True时有效;有5个传递参数值: id为短信标识号,可根据此id删除SIM卡内的短信; no为发送短信号码; t为接收短信时间; s为短信内容; devid是手机盒标识号。 OnSms --- 手机盒接收到短信时,触发此事件;有2个传递参数值: id为短信标识号,可根据id值读短信; devid是手机盒连接序号; 与OnJDSms事件的不同点: OnSms不读短信,只要接收到短信,就触发此事件; OnJDSms在接收到短信时,马上读取短信,并判断短信是完整的,才触发此事件; 推荐使用OnJDSms。 主要函数: SetupPort --- 设置手机盒与计算机连接的端口,可以自动查找端口,一般在第一次使用时调用;成功时保存连接参数,并返回True。 Open --- 打开连接,JDConnected设为True。 Close --- 关闭连接,JDConnected设为False。 InitSIM300 --- 对手机盒初始化,一般在第一次使用时调用,返回设置手机盒的参数。 LoadComportParam --- 在程序启动时调用,读取手机盒与计算机的连接参数;这些参数是在 SetupPort时保存的。 GetComportCount --- 返回手机盒与计算机的连接数量。 ReadSms --- 读短信函数,返回短信数量;有5个参数: id 短信标识号,函数按id读短信;当是超长短信时,id返回超长短信的第一条短信id; no 发送短信号码,返回值; t 短信接收时间,返回值; msg 短信内容,返回值; devid 手机盒标识号,表示从哪个手机盒读短信;当只有一个手机盒与计算机连接时,赋0。 ReadAllSms --- 读取所有短信函数,返回短信数量;有2个参数: memo 所有短信内容,返回值; devid 手机盒标识号,表示从哪个手机盒读短信。 SendSms --- 发送短信函数,返回成功发送短信的号码;有3个参数: nos 要发送的手机号码,可群发,号码之间用;或空格分隔; msg 要发送的短信内容; devid 手机盒标识号,表示用哪个手机盒发短信。 DeleteSms --- 删除短信的函数;有2个参数: id 短信标识号,函数按id删除短信; devid 手机盒标识号,表示删除哪个手机盒的短信。 QueryAT --- 向手机盒发送AT指令,返回手机盒响应内容,主要用于测试;有3个参数: cmd --- AT指令; mlines --- 返回内容是否有多行; devid 手机盒标识号,表示向哪个手机盒发AT指令。 SIM300Setup --- 设置手机盒音量等参数,成功返回True;有1个参数: devid 手机盒标识号,表示设置哪个手机盒的参数。 DoDial --- 拨号函数,有2个参数: no 拨出号码; devid 手机盒标识号,表示用哪个手机盒拨号。 DoAnswer --- 接听电话函数,摘机,有1个参数: devid 手机盒标识号,表示接听哪个手机盒电话。 DoHold --- 挂断电话函数,挂机,有1个参数: devid 手机盒标识号,表示挂断哪个手机盒电话。 getCNUM --- 返回本机号码,当为空时,表示未设置本机号码;有1个devid参数。 setThisPhoneNo --- 设置本机号码,成功时返回True;有2个参数: no 要设置的本机号码,当为空时,表示清除本机号码; devid 手机盒标识号。 ShowAboutBox --- 显示OCX控件版本。 开发要点: (1)在程序启动时,调用LoadComportParam函数。 (2)在第一次使用程序时,请调用SetupPort函数,设置与计算机连接的参数;成功设置后,请调用InitSIM300初始化手机盒模块。 (3)程序启动后,请调用Open函数打开连接;如果在程序设计时,JDConnected=True,则此步骤忽略。 (4)调用DoAnswer、DoHold、DoDial函数,实现拨打、接听电话。 (5)在OnRing、OnEndRing事件中编写处理代码,可实现来电显示。 (6)在OnJDSms中编写处理代码,可自动接收短信。 (7)调用SendSms函数,可发送短信。 (8)调用ReadSms、ReadAllSms、DeleteSms函数,可读取、删除SIM卡内的短信。

110,534

社区成员

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

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

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