2017-11-10 65 views
6

Obecnie pracuję zastąpić mój Implementacja ActiveX w IE poprzez REST API opartego na node.js z systemem edge.jsGetObject z edge.js

Dotychczas podstawowe przykłady ze strony wykonawczych obrobione całkiem dobrze. Mam moje index.js skonfigurować do

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

A simpleVbFunction.vb jak

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

tej pory tak dobrze. Teraz chcę mieć dostęp do aplikacji uruchomionej na komputerze, na którym działa node.js. W tym przypadku Catia (mogą być równie dobrze Excel chociaż)

Zazwyczaj do tego bym użyć simpleVbFunction.vb jak ten

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 

Jednak to nie działa. Otrzymuję następujący błąd.

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)

Teraz muszę Administrator VB.NET moje umiejętności są trochę zardzewiały, a to może być po prostu błąd w mojej VB-Code, ale myślę, że to coś innego. Czy ktokolwiek z was był w stanie uzyskać dostęp do obiektu COM za pośrednictwem pliku edge.js, a jeśli tak, to w jaki sposób było to możliwe?

[edycja] OK. Przyszedłem trochę dalej, przełączając się na C# z VB (Przynajmniej kod został skomentowany, aby uzyskać dostęp do nazwy prac aplikacji Excel). Ale to otworzyło kolejny problem. Mój kod tutaj wygląda to

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

Teraz problemem jest to, że podczas pracy z Visual Studio i kompilacji bibliotek DLL uzyskać włączone automatycznie (przy ustawianiu CATIA jako INFITF.Application). Ale z plikiem edge.js dostanę błąd, że nie można znaleźć przestrzeni nazw INFITF. Jakieś pomysły, jak to działa?

Przepraszamy za długie pytanie. Sprzątnę to po tym, jak zostanie rozwiązany.

[/ edit]

Odpowiedz

3

OK. Rozgryzłem większość tego. Po pierwsze, ponieważ nie pracujesz z IDE i nie dodasz Ressources, tak jak kiedyś, to będzie działać inaczej z edge.js. Będziesz musiał znaleźć swoją bibliotekę DLL i ją wdrożyć. W moim przypadku musiałem znaleźć

Interop.INFITF.dll

z katalogu Catia.

Po tym twój kod node.js będzie wyglądał następująco. (My funkcjonalność do testowania teraz było tylko, że raz drugi będę zalogować nazwę aktualnie otwartego udziału w 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); 

Moi accessCatia.cs będzie wyglądać następująco.

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; 

     } 
    } 

Teraz co wciąż jest otwarta, że ​​obiekty otrzymaliśmy wydają się mieć inną strukturę, niż to, co można uzyskać z VB.net lub poprzez ActiveX w Internet Explorer. Na przykład:

doc.FullName istnieje jako zwykły, ale plik doc.Name nie zostanie znaleziony podczas używania C#, zamiast tego trzeba użyć funkcji doc.get_Name().

Niestety DassaultSystems jest dość zły pod względem dokumentacji, ale może to być materiał na inny temat.