带有edge.js的GetObject

时间:2017-11-10 12:04:06

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

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

到目前为止,页面实现的基本示例运行良好。我将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

然而,这不起作用。我收到以下错误。

  

错误:无法编译VB代码。       ---->编译为CLR库时出错:       C:\ Users \ xxxxxx \ AppData \ Local \ Temp \ 4hf2uw3z.0.vb(1,0):错误BC30203:Bezeichner erwartet。       ---->编译为CLR异步lambda表达式时出错:       C:\ Users \ xxxxxx \ AppData \ Local \ Temp \ cypj4ltp.0.vb(7,0):错误BC30451:“GetObject”ist nicht deklariert。 Auf das Objekt kann   aufgrund derSchutzstufemöglicherweisenichtzugegriffen werden。       在错误(本机)       at Object.exports.func(C:\ Users \ xxxxxx \ coding \ node \ tst_win32ole \ node_modules \ edge \ lib \ edge.js:169:17)       在对象。 (C:\用户\ XXXXXX \编码\节点\ tst_win32ole \ index.js:6:20)       在Module._compile(module.js:570:32)       在Object.Module._extensions..js(module.js:579:10)       在Module.load(module.js:487:32)       在tryModuleLoad(module.js:446:12)       在Function.Module._load(module.js:438:3)       在Timeout.Module.runMain [as _onTimeout](module.js:604:10)       在ontimeout(timers.js:386:14)

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

[编辑] 好。我通过从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的错误。任何想法如何工作?

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

[/编辑]

1 个答案:

答案 0 :(得分:3)

行。我想出了大部分内容。首先,因为您没有使用IDE,并且您不会像以前一样添加Ressources,因此这将与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在文档方面非常糟糕,但这可能是另一个话题。