none
COM 抛出异常 如何更改其区域语言? RRS feed

  • 问题

  • 你好:

    目前在做脚本引擎,开发中用到COM接口,现在脚本引擎准备国际化、在初始化脚本引擎的时候设置了当前线程的区域语言为英语,但是COM抛出的异常始终是中文,有没有遇到过类似问题的,给点意见。

    2017年8月8日 9:43

答案

  • 我这里en和en-US都有效,如果是zh-TW的话肯定是要安装语言包的。不过台湾版Windows不是语言包,而是单独的一个版本。因此我认为你应该安装的是香港语言包,然后指定为zh-Hant。

    至于hr不是Windows标准异常的问题,这个只能你自己去转换了,自定义的异常当然就没有对应的错误信息了。

    • 已标记为答案 Fred.ding 2017年8月10日 5:22
    2017年8月10日 3:18
  • Fred.ding:

    反正你可以尝试两种方案,再来给予您的反馈哦:

    1)尝试结合FAE9D91C-3F07-4090-91EB-E3F70E4D0617和我的观点,安装语言包(此处下载:https://www.microsoft.com/zh-tw/download/details.aspx?id=30667)

    2)转换异常为NET标准异常。


    Reproduce your quesions with ScreenToGif is your choice.
    For IIS: IIS Forum,
    For WebSite of .NET, ASP.NET Forum,
    For others, StackExchange.
    For spam-sender or forum urgent issues, Send your Email at: forumsfeedback@microsoft.com

    • 已标记为答案 Fred.ding 2017年8月10日 5:22
    2017年8月10日 4:45
    版主

全部回复

  • COM抛出的异常是不是汉语写死在COM代码里的?你肯定它支持国际化吗?

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年8月8日 10:27
    版主
  • COM 抛出的异常没有写死,和C# Catch Exception 一样都是COM 自身抛出的异常。
    2017年8月8日 23:58
  • 没有写死COM抛出的异常 而且我只能获取抛出的异常对象,无法控制其抛出的结果。COM 相对来说是个黑洞。。。
    2017年8月9日 0:12
  • 你好:

    目前在做脚本引擎,开发中用到COM接口,现在脚本引擎准备国际化、在初始化脚本引擎的时候设置了当前线程的区域语言为英语,但是COM抛出的异常始终是中文,有没有遇到过类似问题的,给点意见。

    有没有人遇到过类似的问题?指点下
    2017年8月9日 3:36
  • 没有写死COM抛出的异常 而且我只能获取抛出的异常对象,无法控制其抛出的结果。COM 相对来说是个黑洞。。。
    你所谓的“控制抛出结果”啥意思?

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年8月9日 3:49
    版主
  • COM 抛出异常 :

    System.Runtime.InteropServices.ComTypes.EXCEPTION exception

    通过exception 获取其错误代码等信息。简而言之就是COM 内部抛出的异常,我这边只能拿到其异常对象。

    怎么样改变COM 内部的区域语言?比如我应用程序切换为英文的时候,COM抛出的异常也可以为英文

    2017年8月9日 5:26
  • Fred.ding:

    如FAE9D91C-3F07-4090-91EB-E3F70E4D0617所言,准确来说C++等的COM只会返回一个错误的类型码,不会显示抛出异常。所以您需要根据COM中返回的异常码,二次再动态地抛出NET中对应的异常,国际化去捕获,注意NET与C++中COM出错类型对应(可以使用ThrowExceptionForHR(Int32))等方法。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report

    2017年8月9日 6:30
    版主
  • 我做的是脚本引擎,脚本引擎实现了IActiveScriptError接口,只要当脚本引擎发生未知错误时候实现此接口的对象会传递给IActiveScriptError:OnScriptError方法,然后通过IActiveScriptError:GetExceptionInfo方法获取异常的具体发生的位置,还有错误代码及错误描述,此错误描述为中文 和系统区域语言想匹配,然而我安装的应用软件切换到英文版本,此错误还是中文,我想要实现的是错误描述和应用软件的区域语言想匹配。
    2017年8月9日 7:04
  • 我没有怎么过多接触C++的COM接触,但是我个人感觉只要是COM异常,拿你的举例子,一定会返回一个HRESULT(对应C#中int类型)的异常。建议您设法调用中获取这个HRESULT,然后在C#中直接抛出对应的NET异常,因为NET的异常可以被国际化控制。

    你可以拿到HRESULT吗?


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年8月9日 7:05
    版主
  • 错误代码:0x800A0401 这个的错误描述是:语句未结束。

    我的错误提示窗口可以抛出这个错误代码

    2017年8月9日 7:11
  • 错误代码:0x800A0401 这个的错误描述是:语句未结束。

    我的错误提示窗口可以抛出这个错误代码

    你这个错误可以被C#的Catch捕获吗?还是直接抛出来了?

    可以给出你的代码部分吗?


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年8月9日 7:15
    版主
  • HRESULT 这个类型在C#里面有吗?
    2017年8月9日 7:18
  • HRESULT 这个类型在C#里面有吗?

    就是C#的int类型啊。

    我不清楚你怎么调用C++代码的。就我知道的,或许类似于Windows API的方式。又或者类似于Office的COM组件直接引入进行调用。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年8月9日 7:22
    版主
  • void IActiveScriptError.OnScriptError(IActiveScriptError scriptError)

         ScriptErrorMessage="";

         string sourceLine=string.empty();

         try

         {

            scriptError.GetSourceLineText(out sourceLine);

         }

         catch(COMException comEx)

         {

                Debug.WriteLine(comEx.Message);

          }

         uint sourceContext;

         int lineNumber;

        int characterPosition;

       scriptError.GetSourcePosition(out sourceContext,out lineNumber,out characterPosition);

        System.Runtime.InteropServices.ComTypes.EXCEPTION exceptionInfo; //此处抛出异常对象

        scriptError.GetExceptionInfo(out exceptionInfo);

        string StrDescription=exceptionInfo.bstrDescription; //此处获取异常描述

    }

    • 已编辑 Fred.ding 2017年8月9日 8:08 更改
    2017年8月9日 7:57
  • 你在你的程序里边设定Thread.CurrentThread.Culture和UICulture都为en-US(扔到Form的主窗体构造函数里边)。

    如果还是不行,请直接获取:

    1)ErrorCode对象(COMException中)。

    2)ThrowExceptionForHR(Int32)


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年8月9日 8:01
    版主
  • 我这个报错的窗口是:

    voidIActiveScriptSiteWindow.GetWindow(outIntPtrphwnd)

            {

               phwnd = GetForegroundWindow();

               

    //  phwnd = Handle;


            }

    不是直接在主窗体弹出框

    2017年8月9日 8:17
  • 我的意思是:

    1)你先尝试在Form的构造函数中直接设置Thread.CurrentThread.Culture和UICulture都为en-US。然后你的代码用try……catch捕获看看。

    2)如果还是不行,请尝试在catch中获取ErrorCode对象(COMException中),然后转换成NET标准异常抛出,应该是可以的。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年8月9日 8:21
    版主
  • 按照你说的方法 我获取到HRESULT 然后转换成标准的.NET异常。异常时可以抛,但是跟我的初衷还是不一样。

    我的初衷:

          我的脚本引擎是通过实现COM公开的接口方法去执行脚本,所以COM返回的HRESULT 是VBScript 脚本的HRESULT,

          像 0x800A0401 这个码 在.NET 找不到相关的异常信息。

    2017年8月10日 2:02
  • 如果我的应用程序设置了多语言,.net Exception 抛出的异常支持多语言吗?(没有Resource文件的情况)

    我刚刚测试了一下,如果当前线程的CurrentCuture设置为zh-TW 那么Exception抛出的异常时英文的

    2017年8月10日 2:37
  • HR 是可以获取的到,我这个HR是COM返回的。但是有些HR是无法找到对应的.NET 异常类的
    2017年8月10日 2:48
  • 那现在.net 异常要支持多语言 一种方案:用资源文件方式翻译,二方案:安装语言包 ?
    2017年8月10日 2:49
  • en 有效。你en 换成 zh-TW 看看。还有就是 我COM里面执行VBScript 脚本,返回的脚本错误HR 和.net exception的异常 有的是对应不上的。
    2017年8月10日 3:10
  • 我这里en和en-US都有效,如果是zh-TW的话肯定是要安装语言包的。不过台湾版Windows不是语言包,而是单独的一个版本。因此我认为你应该安装的是香港语言包,然后指定为zh-Hant。

    至于hr不是Windows标准异常的问题,这个只能你自己去转换了,自定义的异常当然就没有对应的错误信息了。

    • 已标记为答案 Fred.ding 2017年8月10日 5:22
    2017年8月10日 3:18
  • 非自定义的异常 ,是COM执行VBS 后出现异常返回的VBS异常HR.你说的语言包是操作系统的还是.net framework
    2017年8月10日 3:34
  • Fred.ding:

    反正你可以尝试两种方案,再来给予您的反馈哦:

    1)尝试结合FAE9D91C-3F07-4090-91EB-E3F70E4D0617和我的观点,安装语言包(此处下载:https://www.microsoft.com/zh-tw/download/details.aspx?id=30667)

    2)转换异常为NET标准异常。


    Reproduce your quesions with ScreenToGif is your choice.
    For IIS: IIS Forum,
    For WebSite of .NET, ASP.NET Forum,
    For others, StackExchange.
    For spam-sender or forum urgent issues, Send your Email at: forumsfeedback@microsoft.com

    • 已标记为答案 Fred.ding 2017年8月10日 5:22
    2017年8月10日 4:45
    版主
  • 谢谢耐心的帮我解决问题
    2017年8月10日 5:23
  • FAE9D91C-3F07-4090-91EB-E3F70E4D0617

    谢谢你的意见。

    2017年8月10日 5:23
  • 谢谢耐心的帮我解决问题
    你最后怎么处理的?我们也很好奇哈。是安装语言包了吗?

    Reproduce your quesions with ScreenToGif is your choice.
    For IIS: IIS Forum,
    For WebSite of .NET, ASP.NET Forum,
    For others, StackExchange.
    For spam-sender or forum urgent issues, Send your Email at: forumsfeedback@microsoft.com

    2017年8月10日 6:29
    版主
  • 呵呵,最后是用资源文件。统一英语为标准。
    2017年8月10日 6:42