我目前正在通过基于 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 的错误。任何想法如何让它工作?
对不起,很长的问题。这个问题解决后我会整理一下。
[/编辑]