GetObject edge.js

GetObject with edge.js

我目前正在努力通过基于 node.js 和 运行 edge.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\Temphf2uw3z.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 的错误。有什么想法可以让它发挥作用吗?

抱歉这个问题太长了。解决了我再整理一下

[/edit]

好的。我想通了大部分。首先,因为您没有使用 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 在文档方面非常糟糕,但这可能是另一个主题的内容。