Link Search Menu Expand Document

외부함수 등록 방법

enuSpace에서는 외부함수를 등록할 수 있는 모듈을 지원한다.

내부에서 지원하는 Script 함수 외에 필요한 함수를 사용자가 직접 C++코드에서 작성하여 Script에서 사용할 수 있다.

외부함수 등록 모듈 생성 방법


Visual Studio에서 MFC 동적 연결 라이브러리로 새 프로젝트를 만든다.

외부함수 작성 방법


#define USE_SDK
#include "enuspace_sdk/x64/header/enuLibrary.h" // EnuSpace SDK Include는 필수!!!

int Adder(lua_State* L)
{
	/// /////////////////////////////////////////////////////////
	// 외부함수 사용시 디폴트 파라미터 영역입니다. 아래영역은 수정하지 마세요.
	const char* str;
	str = luaL_checkstring(L, 1);
	CString strPageName(str);

	str = luaL_checkstring(L, 2);
	CString strScriptName(str);
	/// /////////////////////////////////////////////////////////

	int first = lua_tonumber(L, 3);
	int second = lua_tonumber(L, 4);
	int cc = first + second;

	lua_pushnumber(L, cc);  //출력하는 값
	return 1;
}


extern "C" __declspec(dllexport) bool OnLoad()
{
	enuRegisterFunction(L"UserAdder", Adder);   // enuRegisterFunction(L"script에 등록할 함수 명", 등록할 함수 포인터)
	return true;
}
extern "C" __declspec(dllexport) bool OnUnload()
{
	enuDeleteFunction(L"UserAdder", Formula);  // enuDeleteFunction(L"script에서 제거할 함수 명", 제거할 함수 포인터)
	return true;
}

  • Script로부터 입력받는 Parameter 설정
lua_tonumber(L, 3); // 함수의 첫 번쨰 Parameter
lua_tonumber(L, 4); // 함수의 두 번쨰 Parameter

// 입력받는 인자가 number일 때는 lua_tonumber 사용
// 입력받는 인자가 string일 때는 luaL_checkstring 사용
  • 출력 값 설정
lua_pushnumber(L, cc);  // 출력하는 값이 number
lua_pushstring(L, str); // 출력하는 값이 string

// 출력하는 값이 number일 때는 lua_pushnumber 사용
// 출력하는 값이 string일 때는 lua_pushstring 사용

return 1; // 출력하는 값의 개수를 return 한다.

// 만약 출력하는 값이 없을 때는 return 0;

주의사항


1) 외부함수 등록 함수(enuRegisterFunction)는 Onload()에서 수행하고, 외부함수 제거 함수(enuDeleteFunction)는 OnUnload()에서 수행한다.

extern "C" __declspec(dllexport) bool OnLoad()
{
	enuRegisterFunction(L"UserAdder", Adder);   // enuRegisterFunction(L"script에 등록할 함수 명", 등록할 함수 포인터)
	return true;
}
extern "C" __declspec(dllexport) bool OnUnload()
{
	enuDeleteFunction(L"UserAdder", Formula);  // enuDeleteFunction(L"script에서 제거할 함수 명", 제거할 함수 포인터)
	return true;
}

참조 : enuRegisterFunction, enuDeleteFunction

2) Deadlock 발생 가능성

등록한 외부함수로 작동하는 함수 내부에서 동기 함수(예: enuGetObjectById)를 사용 시 지속적인 return 대기가 발생, 즉 DeadLock 발생 가능성이 있다.

환경설정


1) enuspace_sdk의 enuLibrary.h를 include한다. SvgDefine.h를 enuLibrary.h 내부에서 include 하도록 설정되어 있다.

#define USE_SDK
#include "enuspace_sdk/x64/header/enuLibrary.h" // EnuSpace SDK Include는 필수!!!

2) 속성 페이지에서 추가 종속성 설정한다.

enuSpaceLib.lib와 lua53.lib를 추가 종속성에 설정한다.

  • 구성속성 -> 링커 -> 입력 -> 추가종속성 설정
    • enuspace_sdk\x64\lib\enuSpaceLib.lib
    • enuspace_sdk\x64\header\lua53\lua53.lib

3) 디버깅 설정

외부함수 등록 모듈을 통해 바로 enuSpace를 실행시켜 디버깅 할 수 있도록 설정한다.

[필수]

  • 구성속성 -> 디버깅 -> 명령
    • 실행 파일인 enuspace.exe의 Path를 입력한다.
    • 예시 : D:\Git\enuspace.exe

[선택 사항]

  • 구성속성 -> 디버깅 -> 명령 인수
    • 실행 하려는 프로젝트의 파일을 입력한다. 이곳에 입력시 enuSpace.exe에서 프로젝트파일 설정 없이 바로 프로젝트가 열린다.
    • 예시 : D:\Git\Sample\Sample.enup

enuSpace에서 함수 등록 방법

Project tree 창에서 ExternalFunction 폴더 마우스 우 클릭 이벤트를 통해 외부함수 등록 모듈을 추가와 제거한다.

외부함수 등록 모듈이 EnuSpace 등록에 성공할 시, 아래의 그림처럼 외부함수 등록 모듈이 Project tree에 나타난다.


외부 함수 등록 성공 시 출력 창에 아래와 같은 메세지가 출력된다.

  • 출력 창 메세지
    • 등록 성공 시 : RegisterFunction Sucess
    • 해제 성공 시 : DeleteFunction Success

등록된 외부함수 Script에서 사용방법

function Sample()
	local a = 3
	local b = 4
	local c = UserAdder(a,b) -- 등록된 외부함수 사용
end

Script에서 위와 같이 외부 함수를 사용한다.