2011-03-02 2 views
0

나는 하나의 콘솔 응용 프로그램을 만들었으며, Jint-JavaScript Interpreter를 사용하여 javascript 기능을 실행했습니다. 하지만 javascript에서 activexobject를 사용하면 코드 오류가 발생합니다.은 Jint를 사용하여 exe 파일을 실행합니다. Javascript Interpreter

string script= @" 
        function square() { 
        MyObject = new ActiveXObject('WScript.Shell'); 
        MyObject.Run('file:///D:/test/Tools/ofc.exe D:/test/Tools/ofc.ini') ; 
        return 2 * 2; 
        }; 

        return square(); 
        "; 

var result = new JintEngine() 
        .Run(script); 

아무도 말해 줄 수 있습니까?

+0

무엇이 오류입니까? –

+0

오류 : ActiveXObject가 정의되지 않았습니다. 줄 : 3 문자 : 20 소스 코드가 없습니다. –

답변

1

Jint는 ActiveXObject이 무엇인지 모르기 때문에 Jint에게 알려야합니다. 당신은 자바 스크립트 생성자로 취급 할 수있는 JintEngine에 뭔가를 통과 할 수 있을지 모르겠어요,하지만 당신은 주어진 COM ProgID를위한 인스턴스를 생성하는 사용자 정의 함수를 등록 할 수 있습니다 :

private delegate object CreateActiveXObjectDelegate(string progId); 

private static object CreateActiveXObject(string progId) 
{ 
    var type = Type.GetTypeFromProgID(progId); 
    if(type!=null) 
    { 
     return Activator.CreateInstance(type); 
    } else 
    { 
     return null; // alternatively throw an exception or whatever is suitable in your situation 
    } 
} 

그런 다음 당신이 등록 할 수 있습니다를 다음 스크립트에서 호출 할 수 있습니다 JintEngine의 함수로이 방법은 : 그것은 오류가 방법이 정의되지 않은 말을 내 예에 실패 MyObject.Run를 호출 할 때

string script = @" 
      function square() { 
      MyObject = createActiveXObject('WScript.Shell'); 
      MyObject.Run('whatever'); 
      return 2 * 2; 
      }; 

      return square(); 
      "; 
var jintEngine = new JintEngine(); 
jintEngine.DisableSecurity(); // required, cannot tell why exactly 
jintEngine.SetFunction("createActiveXObject", (CreateActiveXObjectDelegate)CreateActiveXObject); 
var result = jintEngine.Run(script); 

jint를 반사를 사용합니다 : 실행. 나는 Run COM-Interop과 반사가 까다로워 질 수 있기 때문에 (나는 MethodInfo이 기본 COM 유형에서 검색 될 수 없다고 생각한다) 호출하지 않는다고 생각한다. (: System.Diagnostics.Process.Start 어쩌면 더 나은 또는) :

private delegate void Runner(string progId); 

private static void ShellRun(string command) 
{ 
    var type = Type.GetTypeFromProgID("WScript.Shell"); 
    if(type!=null) 
    { 
     var shell = Activator.CreateInstance(type); 
     type.InvokeMember("Run", BindingFlags.InvokeMethod, null, shell, new object[] {command}); 
    } 
} 

그런 다음 스크립트 (run로 등록) 당신에게서 ShellRun 전화 :

string script = @" 
       function square() { 
       run('whatever'); 
       return 2 * 2; 
       }; 

       return square(); 
       "; 

var jintEngine = new JintEngine(); 
jintEngine.DisableSecurity(); // required, cannot tell why exactly 
jintEngine.SetFunction("run", (Runner)ShellRun); 
var result = jintEngine.Run(script); 

다른 접근 방법은 단순히 WScript.Shell.Run를 호출하는 기능을 등록 할 수 있습니다

희망이 도움이됩니다.