SE二次开发- -处理应用程序正忙的错误

适用版本:SolidEdge所有版本

一、概述

SolidEdge是Siemens PLM Software公司旗下的三维CAD软件,采用Siemens PLM Software公司自己拥有专利的Parasolid作为软件核心,将普及型CAD系统与世界上最具领先地位的实体造型引擎结合在一起,是基于Windows平台、功能强大且易用的三维CAD软件。

SolidEdge二次开发有COM和Addin两种方式,其中COM(组件对象模型)具有不依赖平台和编程语言等优点,是最常用的一种Solid二次开发方式。当通过外部方式进行访问SolidEdge应用程序时,有可能会报以下异常:

  1. 应用程序正在运行时或未响应(RPC_E_CALL_REJECTED 0x80010001)
  2. 拒绝被调用(RPC_E_SERVERCALL_RETRYLATER 0x8001010A)

发生这些错误是因为二次开发程序和SolidEdge之间的线程争用问题,可以通过实现IOleMessageFilter接口处理这些异常。

二、说明

        1. 首先创建OleMessageFilter,实现IOleMessageFilter接口,代码如下:

namespace Bizca
{
    class OleMessageFilter : IOleMessageFilter
    {
        public static void Register()
        {
            IOleMessageFilter newFilter = new OleMessageFilter();
            IOleMessageFilter oldFilter = null;

            if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA)
            {
                CoRegisterMessageFilter(newFilter, out oldFilter);
            }
            else
            {
                throw new COMException("Unable to register message filter because the current thread apartment state is not STA.");
            }
        }
        public static void Revoke()
        {
            IOleMessageFilter oldFilter = null;
            CoRegisterMessageFilter(null, out oldFilter);
        }
        int IOleMessageFilter.HandleInComingCall(
            int dwCallType,
            System.IntPtr hTaskCaller,
            int dwTickCount,
            System.IntPtr lpInterfaceInfo)
        {
            return (int)SERVERCALL.SERVERCALL_ISHANDLED;
        }
        int IOleMessageFilter.RetryRejectedCall(
            System.IntPtr hTaskCallee,
            int dwTickCount,
            int dwRejectType)
        {
            if (dwRejectType == (int)SERVERCALL.SERVERCALL_RETRYLATER)
            {
                return 99;
            }

            return -1;
        }
        int IOleMessageFilter.MessagePending(
            System.IntPtr hTaskCallee,
            int dwTickCount,
            int dwPendingType)
        {
            return (int)PENDINGMSG.PENDINGMSG_WAITDEFPROCESS;
        }
        [DllImport("Ole32.dll")]
        private static extern int CoRegisterMessageFilter(
            IOleMessageFilter newFilter,
            out IOleMessageFilter oldFilter);
    }

    [ComImport(), Guid("00000016-0000-0000-C000-000000000046"),
    InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    interface IOleMessageFilter
    {
        [PreserveSig]
        int HandleInComingCall(
            int dwCallType,
            IntPtr hTaskCaller,
            int dwTickCount,
            IntPtr lpInterfaceInfo);
        [PreserveSig]
        int RetryRejectedCall(
            IntPtr hTaskCallee,
            int dwTickCount,
            int dwRejectType);
        [PreserveSig]
        int MessagePending(
            IntPtr hTaskCallee,
            int dwTickCount,
            int dwPendingType);
    }
}
  1. 使用方法如下:
    static void Main(string[] args)
            {
                OleMessageFilter.Register();
                // Make COM calls.
                OleMessageFilter.Revoke();
            }
    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值