포트폴리오 만들기

5.Engine.dll - Script.dll class 간의 상속

Roka_is_back 2023. 12. 19.

Engine에서 Component와 Script를 구현한다.

원래 Script.dll 은 Engine.dll 에 의존적이기 때문에 dll 끼리의 상속을 진행하였다.

 

Script.dll 과 Engine.dll 의 상속

관계

Test를 위해 Engine.dll 에는 CScript만 구성.
Script.dll는 CTestScript를 구성하였다.

CTestScript의 Print가 호출되면 부모인 CScript와 자신의 Print를 호출하도록 했다.

Script.dll 에서 Engine 정보 링크.

이 관계에서는 CScript라는 타입을 참조만 하는 것이 아니라 실제 함수 호출도 이루어지기 때문에
Script.dll 에서 .h 선언뿐 아니라 lib 링크를 해줘야 한다.

script.dll pch.h - lib 링크
script.dll cTestScript.h - CScript.h 선언

 

실제 애플리케이션에서의 호출

처음에 자꾸 Script.dll 을 혼자 호출하는데 null이 떠서 애먹었는데 

Engine.dll 에 의존적이기 때문에 함께 호출해줘야 하며, Engine.dll 을 먼저 호출해줘야한다.

이렇게만 호출하면 null 반환된다.
정상 호출

실제 테스트

애플리케이션에서 사용.

결과

Component와 Script

멤버 함수 Virtual 붙여주자.

이유는 명시적 호출시 함수들은 런타임에 dll 로 매칭이 될텐데 컴파일 시점에는 모르기 때문에 링크 에러가 발생한다.

virtual 을 붙이면 vtbl 과 rtti 등이 붙을텐데 이러한 정보들은 런타임에 처리한다는 점을 깜빡했다.

일반적인 함수들은 컴파일 타임에 해결.

 

아래 TestScript의 virtual 을 빼고 실행하면 링크 에러가 발생한다.

만약 virtual 을 빼고 실행하면 링크 에러가 뜬다.
링크 에러

궁금증

.exe 실행 도중에 dll 파일을 수정하면 런타임중 문제없이 교체될까?

 

 

 

만약 런타임중 교체를 허용하려면 엔진에서 game play 상태를 stop 으로 한뒤 다시 load 하도록 따로 처리해주어야 하지 않을까 싶다.

그것에 대해서는 따로 공부해야할듯.

 

다음 할일

1.visual studio console mode 에서 window app 으로 변경하기

2. 윈도우 포커스 아웃했다가 포커스 인할때 1번 모든 script의 변경점을 찾아서 다시 빌드하기.
3. script 변경점은 메타파일? 해시로 찍고 변했는지 관찰??

 

댓글