6

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

到目前为止,页面实现中的基本示例运行良好。我的 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) : error BC30203: Bezeichner erwartet. ----> 编译为 CLR 异步 lambda 表达式时出错: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。在 Object.exports.func (C:\Users\xxxxxx\coding\node\tst_win32ole\node_modules\edge\lib\edge.js:169:17) 处的错误(本机)处。(C:\Users\xxxxxx\coding\node\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:

现在我必须管理我的 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 的错误。任何想法如何让它工作?

对不起,很长的问题。这个问题解决后我会整理一下。

[/编辑]

4

1 回答 1

3

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

互操作.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 在文档方面非常糟糕,但这可能是另一个主题的内容。

于 2017-11-13T13:29:56.700 回答