使用javascript ActiveX对象触发System.Windows.Forms dll

时间:2014-08-05 10:34:35

标签: c# javascript jquery c++

我正在开发一个C ++自定义向导,其中包含一个由下拉控件组成的页面UI。 我想用该机器上安装的所有输入语言填充此下拉控件。 (输入语言是一种文化/键盘布局对,用于确定键盘上的物理键如何映射或绘制为语言中的字符。)

我正在尝试获取此列表&在C#找到了办法。

public void GetLanguages() {
// Gets the list of installed languages. 
foreach(InputLanguage lang in InputLanguage.InstalledInputLanguages) {
   textBox1.Text += lang.Culture.EnglishName + '\n';
}
}

不,我想使用javascript实现相同的功能,因为我的自定义向导使用.js 我尝试在下面做,但得到js运行时错误:“Automation Server无法创建对象”。

 <select class="sideBtn" size="1" id="LANGUAGE_LISTBOX" accesskey="L" title="Select Languages:">
                     <script type="text/javascript">
                         var obj = new ActiveXObject("System.Windows.Forms");
                         // Gets the list of installed languages.
                         for (var lang in obj.Windows.Forms.InputLanguage.InstalledInputLanguages)
                         {
                             document.write('<option value="' + lang.Culture.EnglishName + '">' + lang.Culture.EnglishName + '</option>');
                         }
                     </script>
 </select>

我试过这样的,因为我已经引用了其他文章,这些文章显示了使用javascript ActiveX对象来驱动c#dll。 Triggering C# dll using Javascript ActiveX Object

有人能帮帮我吗?

此致 Deepthi

1 个答案:

答案 0 :(得分:0)

使用此代码无法执行所需操作,因为没有COM对象注册为System.Windows.Forms。但是你所关联的问题正是你想要的。

您有两个选项可以实现此选项,并选择其中一个选项取决于您是想在Javascript端还是整个InputLanguage类中只拥有文化名称。我认为第一种方法对你来说已经足够了。对于第二个,您应该定义一个接口和一个新类,其中包含Javascript中所需的InputLanguage的所有属性。

在界面IHello中,更改此内容:

[DispId(1)]
string GetLanguages();

在课程CHello中,更改此内容:

public string GetLanguages()
{
    string[] langNames =InputLanguage.InstalledInputLanguages
            .OfType<InputLanguage>()
            .Select(lang => string.Format("{0}", lang.Culture.EnglishName))
            .ToArray(); 

    // This is a simple Join, just to give you the idea
    // You better use a proper serialization like JSON
    return string.Join(";", langNames);
}

您的javascript代码(假设您要么降低了安全级别,要么签署了ActiveX):

 <script type="text/javascript">

 myAx1 = new ActiveXObject("csharpAx.CHello");
 if(myAx1 != null)
 {
 // Gets the list of installed languages.
     for (var lang in obj.GetLanguages().split(";"))
     {
         document.write('<option value="' + 
         lang + 
         '">' + 
         lang + 
         '</option>');
     }
 }
 </script>