javascript - 使用 edge.js 获取对象

标签 javascript node.js vb.net activex edge.js

我目前正在努力通过基于运行 edge.js 的 node.js 的 REST-API 替换我在 IE 中的 ActiveX 实现

到目前为止,页面实现中的基本示例运行良好。我将 index.js 设置为

var edge = require('edge');
var edgeVb = require('edge-vb');
var path = require('path');

var helloVb = edge.func('vb', path.join(__dirname, 'simpleVbFunction.vb'));

helloVb('Testing with String', (err, res) => {
    if(err) throw err;
    console.log(res);
});

和 simpleVbFunction.vb 一样

Async Function(Input As Object) As Task(Of Object)
    Return Await Task.Run(Function()
        Return "NodeJS Welcomes: " & Input.ToString()
    End Function)
End Function

到目前为止一切顺利。现在我希望能够访问在运行 node.js 的机器上运行的应用程序。在这种情况下,Catia(也可以是 Excel)

通常为此我会使用像这样的 simpleVbFunction.vb

Async Function(Input As Object) As Task(Of Object)
    Return Await Task.Run(Function()
        Dim CATIA as Object
        set CATIA = GetObject(, "CATIA.Application")
        Return CATIA.ActiveDocument.Application.FullName
    End Function)
End Function

但是这不起作用。我收到以下错误。

Error: Unable to compile VB code. ----> Errors when compiling as a CLR library: C:\Users\xxxxxx\AppData\Local\Temp\4hf2uw3z.0.vb(1,0) : error BC30203: Bezeichner erwartet. ----> Errors when compiling as a CLR async lambda expression: C:\Users\xxxxxx\AppData\Local\Temp\cypj4ltp.0.vb(7,0) : error BC30451: "GetObject" ist nicht deklariert. Auf das Objekt kann aufgrund der Schutzstufe möglicherweise nicht zugegriffen werden. at Error (native) at Object.exports.func (C:\Users\xxxxxx\coding\node\tst_win32ole\node_modules\edge\lib\edge.js:169:17) at Object. (C:\Users\xxxxxx\coding\node\tst_win32ole\index.js:6:20) at Module._compile (module.js:570:32) at Object.Module._extensions..js (module.js:579:10) at Module.load (module.js:487:32) at tryModuleLoad (module.js:446:12) at Function.Module._load (module.js:438:3) at Timeout.Module.runMain [as _onTimeout] (module.js:604:10) at ontimeout (timers.js:386:14)

现在我必须承认我的 VB.NET 技能有点生疏,这可能只是我的 VB 代码中的一个错误,但我认为这是另外一回事。你们中有人能够通过 edge.js 访问 COM 对象吗?如果是,这怎么可能?

[编辑] 好的。通过从 VB 切换到 C#,我走得更远(至少代码被注释掉以访问 Excel 应用程序的名称)。但这又引发了另一个问题。我这里的代码看起来像这样

using System.Threading.Tasks;
using System;
using System.Runtime.InteropServices;
// using INFITF;

   public class Startup
   {
       public async Task<object> Invoke(object input)
       {
            // dynamic xl = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
            // return xl.Name;
           object CATIA0 = Marshal.GetActiveObject("CATIA.Application");
           INFITF.Application CATIA = CATIA0 as INFITF.Application;
       }
   }    

现在的问题是,当使用 Visual Studio 和编译 dll 时,会自动包含(当将 CATIA 设置为 INFITF.Application 时)。但是对于 edge.js,我会收到无法找到命名空间 INFITF 的错误。有什么想法可以让它发挥作用吗?

很抱歉这个问题很长。解决后我会整理。

[/编辑]

最佳答案

好的。我想通了大部分。首先,因为您没有使用 IDE,也不会像以前那样添加资源,这与 edge.js 的工作方式不同。您将必须找到您的 dll 并实现它。就我而言,我必须找到

Interop.INFITF.dll

来自 Catia 目录。

之后您的 node.js 代码将如下所示。 (我现在的测试功能只是每秒记录一次 Catia 中当前打开的零件的名称)

var edge = require('edge');
var path = require('path');

var getCat = edge.func({
    source: path.join(__dirname, 'accessCatia.cs')
, references :[
    './Resources/Interop.INFITF.dll'   
]});

setInterval(function(){
    getCat('someInputString', (err, res)=>{
        if(err){
            console.log('ERROR FOUND: ');
            console.log(err);
            return;
        }
        console.log(res);
    });
},1000);

我的 accessCatia.cs 看起来像这样。

using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System;


   public class Startup
   {
       public async Task<object> Invoke(object input)
       {

           object cat0 = Marshal.GetActiveObject("Catia.Application");
           INFITF.Application cat = cat0 as INFITF.Application;
           INFITF.Document doc = cat.ActiveDocument as INFITF.Document;

           return doc.FullName;

       }
   }

现在仍然悬而未决的是,接收到的对象似乎与您使用 VB.net 或通过 Internet Explorer 中的 ActiveX 获得的对象具有不同的结构。例如

doc.FullName 正常存在,但使用 C# 时将找不到 doc.Name,您必须使用 doc.get_Name()。

不幸的是,DassaultSystems 在文档方面非常糟糕,但这可能是另一个主题的内容。

关于javascript - 使用 edge.js 获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47222386/

相关文章:

vb.net - 报告服务 - 处理空日期?

asp.net - 建立与 SQL Server 的连接时出现与网络相关或特定于实例的错误

javascript - Bluebird promise 订单问题

javascript - 运行 nightwatchjs 测试时出现 TypeError [ERR_UNESCAPED_CHARACTERS]

javascript - Hammer.js 阻止 Android Webview 中的超链接点击

javascript - Codecademy flipboard 代码无法在我的电脑上运行

node.js - 我可以在 NodeJS 中混合使用回调和异步/等待模式吗?

asp.net - 在 Listview 中的 InsertItemTemplate 中查找文本框

javascript - 悬停保持事件状态,直到鼠标悬停在另一个可悬停对象上

javascript - 让主干路由与 pushstate 和 node.js/express 作为服务器一起工作