2013-06-16 2 views
4

내가 설정에 내가 작성하는 방법에 대한 예제 코드를 찾을 수 있지만 Node.js를 모듈반복해서 Node.js를 함수를 호출 ++

의 일부인 함수를 호출 할 수 있어야 C++ 응용 프로그램을 시도하고 c를에서 C++ Node.js를위한 애드온 및 C에서 V8 코드를 호출하는 방법도 몇 가지 예 ++ 나는 접근 방식이 될 것 내가 이상적으로 생각 C++

에서 Node.js를 함수를 호출처럼 무언가로 실행하지 않은

  • 설정 node.js 환경, 예
  • 는 C++ 응용 프로그램은, "사용 가능한"중 하나가 인수
  • 읽기와 기능을 Node.js를 호출 할 필요가있을 때 일단 필요한 모든 모듈을 컴파일하고 함수의 반환이 이상적으로 Node.js를 코드를

값 처리 C++ 코드는 동일한 프로세스 컨텍스트에서 실행되므로 인수의 마샬링과 일부 스트림 유형의 추상화를 통한 값 반환이 필요하지 않습니다.

모든 정보는 환영합니다!

나는 결국이 시작되도록 노드/V8 이벤트 루프를 처리하는 방법입니다 함께 내가 가장 고생 무엇

가는 뭔가를 얻을 수 있었다

+0

이 몇 가지 질문처럼 보인다 게시하지 않는 게 좋을 제한됩니다. 함수를 호출하는 방법을 알고 싶습니까, 아니면 우리가 while 모듈을 작성하기를 원하십니까? 첫 번째 작업은 만족 스럽지만 누구도 시작 코드가없는 전체 모듈을 작성하지는 않습니다. – loganfsmyth

+0

귀하의 반응에 감사드립니다. standalone 어플리케이션에서 node.js 스크립트를로드하여 node.js 모듈 내의 기능을 실행할 수 있도록 node.js 오브젝트 파일과 링크되는 독립 실행 형 C++ 어플리케이션을 만들고 싶습니다. . 모든 도움말 (예 : 비슷한 일을하는 예제 코드에 대한 포인터가 도움이 될 것입니다. 나는 누군가가 코드를 작성하지는 않을 것이라고 생각하지만 접근 방법에 대한 예민한 점을 높이 평가할 것이다. Tx. 베드로. – Peter

답변

5

텍사스

피터 때 자바 스크립트 함수 자바 스크립트 함수가 완료 될 때 호출 C++ 메소드가 계속 실행되도록 멈추고 기본적으로 모든 노드 비동기 처리가 끝날 때까지 기다린다. 내가 무슨 짓을했는지

간단히 훨씬 node.cc 방법 노드 : 초기화 및 노드 :: 시작과 전달처럼, 먼저 노드를 초기화

  • 의 라인을 따라 뭔가를 수행하는 C++ 클래스를 편집하다

  • 그런 다음 javascript 함수가 최종 콜백으로 사용할 노드의 전역 이름 공간에 C++ 함수를 등록하십시오. 더 많은 이하

    같은
    v8::Locker locker; 
    v8::HandleScope handle_scope; 
    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); 
    global->Set(v8::String::New("functionCallback"), v8::FunctionTemplate::New(fnCallback,v8::External::Wrap(this))); 
    
  • 그런 다음 자바 스크립트 함수를 호출

    v8::Handle<v8::Value> value = global->Get(v8::String::New(functionName.c_str())); 
    v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(value); 
    v8::Handle<v8::Value> *v8Args = new v8::Handle<v8::Value>[functionArguments.size()]; 
    for (std::vector<std::string>::const_iterator it = functionArguments.begin(); it != functionArguments.end(); ++it) { 
        int ix = distance(functionArguments.begin(),it); 
        v8Args[ix] = v8::String::New((*it).c_str()); 
    } 
    v8::Handle<v8::Value> fnResult; 
    fnResult = func->Call(global, functionArguments.size(), v8Args); 
    uv_run(uv_default_loop(),UV_RUN_DEFAULT); 
    
  • 결국 글로벌 콜백을 호출하는 자바 스크립트 함수가 (자바 스크립트)

    global.functionCallback(result); 
    
  • 같이 호출하는 것이 중요하다
  • 이 콜백 (C++)은 결과를 저장하고 이벤트 루프를 종료합니다.

    static v8::Handle<v8::Value> fnCallback(const v8::Arguments& args) { 
    ... 
    // Stop node event loop so that the "calling" app continues (loop is started in execFn) 
    uv_stop(uv_default_loop()); 
    ... 
    

나는 이것이 약간 간결하다는 것을 알고있다.누군가가 관심이 있다면 나는 C++ 클래스를 공유 할 수 있습니다하지만 내 C++/V8/노드 지식은 매우 그래서 오히려 전체에

피터

+0

나는 C++ 클래스에 관심이있다. 제게 이메일로 보내 주실 수 있나요? – theliberalsurfer

관련 문제