확장 모듈

외부 모듈(Extension DLL)을 사용하기 위해서는 지정된 절차에 따라 확장 모듈(DLL)을 만들어야 합니다. 새로 모듈을 만들거나 기존 모듈을 사용하기 위해 필요한 내용을 설명합니다.

개발 환경

넥사크로플랫폼에서 사용할 수 있는 외부 모듈을 만들기 위해서는 아래와 같은 도구와 라이브러리가 필요합니다.

  1. 마이크로소프트 비주얼 스튜디오 2005

    비주얼 스튜디오 버전이 2005보다 높은 경우에는 플랫폼 도구 집합을 v80으로 빌드합니다.

  2. V8 자바스크립트 엔진

    https://code.google.com/p/v8/

프로젝트 생성과 설정

프로젝트 생성

  1. [새 프로젝트]를 실행 후 [템플릿 > Visual C++ > Win32] 항목에서 [Win32 프로젝트]를 선택합니다. 이름 항목에 프로젝트 이름을 넣고 [확인]을 클릭합니다.

1

  1. 설정 확인 후 [다음] 버튼을 클릭합니다.

2

  1. [응용 프로그램 설정]에서 응용 프로그램 종류에서 DLL을 선택하고 [마침] 버튼을 클릭합니다.

프로젝트 설정

  1. [추가 포함 디렉터리]에 V8 Javascript Engine의 v8.h 경로를 추가합니다.

  2. [추가 종속성’에 'v8.lib'를 추가합니다.

  3. [추가 라이브러리 디렉터리]에 [추가 종속성]에 있는 v8 Lib의 경로를 추가합니다.

확장 모듈 제작

넥사크로플랫폼 엔진에서는 확장 모듈의 ExtensionInitialize 정보를 읽고 설정합니다. ExtensionInitialize에서는 DLL에 필요한 초기화 작업과 attach 오브젝트와 같은 function 포인터 값을 설정합니다.

Entry Funcs

v8::Object에 v8::Function 을 설정하는 함수를 지정합니다.

typedef bool (*pFnAttachObject)( v8::Handle<v8::Object>*);

Initialize

초기화 단계에서는 아래와 같은 작업을 처리합니다.

extern "C" __declspec(dllexport) bool ExtensionInitialize()

EntryPoint

EntryPoint 단계에서는 아래와 같은 작업을 처리합니다.

extern "C" __declspec(dllexport) bool ExtensionEntryPoint(EXTENSIONENTRYFUNCS*)

Shutdown

extern "C" __declspec(dllexport) void ExtensionShutdown()

넥사크로플랫폼 API

확장 모듈 개발과 관련된 넥사크로플랫폼 API는 아래와 같습니다.

nexacro._addExtensionModule

확장 모듈 로딩 시 사용하는 API 입니다.

nexacro._addExtensionModule = function(object, modulepath)

Argument

설명

object

확장 모듈의 속성, 함수 등을 저장하는 오브젝트

modulepath

확장 모듈의 전체 경로를 지정합니다.

넥사크로플랫폼에서 지원하는 Path Alias를 사용할 수 있습니다.

var ext = {};
nexacro._addExtensionModule(ext, "c:/extension.dll");
nexacro._addExtensionModule(ext, "%COMPONENT%\extension.dll");

nexacro._clearExtensionModule

확장 모듈을 더 이상 사용하지 않고 로딩된 모듈을 내려야 할 때 사용하는 API 입니다.

nexacro._clearExtensionModule = function(modulepath)

Argument

설명

modulepath

내려야 하는 확장 모듈의 전체 경로를 지정합니다.

넥사크로플랫폼에서 지원하는 Path Alias를 사용할 수 있습니다.

값을 주지 않는다면 로딩된 확장 모듈을 모두 내립니다.

nexacro._clearExtensionModule 함수로 제거된 확장 모듈의 오브젝트를 계속 사용할 경우 메모리 누수(memory leak)가 발생할 수 있으므로 로딩되지 않은 모듈의 오브젝트를 사용하면 안됩니다.