2017-11-10 42 views
6

Tôi hiện đang làm việc để thay thế ActiveX-Triển khai trong IE thông qua REST-API dựa trên node.js với chạy edge.jsGetObject với edge.js

Cho đến nay các ví dụ cơ bản từ trang được triển khai khá tốt. Tôi có index.js tôi thiết lập để

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); 
}); 

Và simpleVbFunction.vb như

Async Function(Input As Object) As Task(Of Object) 
    Return Await Task.Run(Function() 
     Return "NodeJS Welcomes: " & Input.ToString() 
    End Function) 
End Function 

Cho đến nay rất tốt. Bây giờ tôi muốn có thể truy cập một ứng dụng chạy trên máy chạy node.js. Trong trường hợp này Catia (cũng có thể là Excel mặc dù)

thường cho điều này tôi muốn sử dụng một simpleVbFunction.vb như thế này

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 

Tuy nhiên điều này không hoạt động. Tôi nhận được lỗi sau.

Error: Unable to compile VB code. ----> Errors when compiling as a CLR library: C:\Users\xxxxxx\AppData\Local\Temp\4hf2uw3z.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)

Bây giờ tôi phải quản trị các kỹ năng VB.NET của tôi hơi bị gỉ và điều này có thể chỉ là một lỗi trong VB-Code của tôi nhưng tôi nghĩ đó là thứ khác. Có ai trong số các bạn đã có thể truy cập vào một COM-Object thông qua edge.js và nếu có thì điều này có thể như thế nào?

[sửa] OK. Tôi đã đi xa hơn một chút bằng cách chuyển sang C# từ VB (Ít nhất mã đã nhận xét để truy cập vào tên của ứng dụng Excel hoạt động). Nhưng điều này đã mở ra một vấn đề khác. Mã của tôi ở đây trông như thế này

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; 
     } 
    }  

Bây giờ vấn đề là, rằng khi làm việc với Visual Studio và biên soạn dlls được bao gồm tự động (khi thiết CATIA như INFITF.Application). Nhưng với edge.js tôi nhận được lỗi rằng không gian tên INFITF không thể được tìm thấy. Bất kỳ ý tưởng làm thế nào để có được rằng làm việc?

Xin lỗi vì câu hỏi dài. Tôi sẽ dọn dẹp nó sau khi điều này được giải quyết.

[/ edit]

Trả lời

3

OK. Tôi đã tìm ra hầu hết. Đầu tiên là bạn không làm việc với một IDE và bạn sẽ không thêm Ressources như bạn đã từng làm việc này, nó sẽ làm việc khác với edge.js. Bạn sẽ phải tìm dll của bạn và thực hiện nó. Trong trường hợp của tôi, tôi phải tìm số

Interop.INFITF.dll

từ thư mục Catia.

Sau đó, mã node.js của bạn sẽ trông như thế này. (Chức năng của tôi để thử nghiệm bây giờ chỉ là một lần thứ hai tôi sẽ đăng nhập tên của phần hiện đang mở tại 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 của tôi sẽ trông như thế này.

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; 

     } 
    } 

Bây giờ những gì vẫn mở là các đối tượng nhận được dường như có cấu trúc khác với cấu trúc bạn muốn với VB.net hoặc qua ActiveX trong Internet Explorer. Ví dụ:

doc.FullName tồn tại như thường lệ nhưng doc.Name sẽ không được tìm thấy khi sử dụng C# thay vào đó bạn phải sử dụng doc.get_Name().

Thật không may DassaultSystems là khá xấu về tài liệu nhưng đó có thể là công cụ cho một chủ đề khác.

Các vấn đề liên quan