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 在文档方面非常糟糕,但这可能是另一个主题的内容。
我目前正在努力通过基于 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 在文档方面非常糟糕,但这可能是另一个主题的内容。