API Basic Declare ko - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
Declare / Lib / Alias
ClassicUO โข Basic
Declare๋ Basic ํ๋ก์์ ์ด๋ฆ์ ๋ค์ดํฐ๋ธ Windows x64 DLL์ ๋ด๋ณด๋ธ ํจ์์ ์ฐ๊ฒฐํฉ๋๋ค. ์๋ ๋ฒ์๋ ์คํ ์ค ์ฝ๋ ์์ฑ ์์ด ์ปดํ์ผ๋ ํด๋ผ์ด์ธํธ์์๋ ๋์ํ๋ฉฐ, VB.NET ์ํธ ์ด์ฉ ์ ์ฒด๋ฅผ ๋ปํ์ง ์์ต๋๋ค.
์ ํํ ๊ตฌ๋ฌธ
[Public | Private] Declare [Ansi | Unicode | Auto] Function name Lib "library.dll" [Alias "export"]([ByVal arg As Type, ...]) As ResultType
[Public | Private] Declare [Ansi | Unicode | Auto] Sub name Lib "library.dll" [Alias "export"]([ByVal arg As Type, ...])
name(arguments)
name(argumentName:=value)
ModuleName.name(arguments)
๋งค๊ฐ๋ณ์
name / Public / Privateโ ๋ก์ปฌ ์ด๋ฆ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ UO. ์์ด ํธ์ถํฉ๋๋ค. ํ์ผ ๋๋ Module ์์ค์ ์ ์ธํ๋ฉฐ ๋ณธ๋ฌธ๊ณผ End Function/End Sub๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ Public, Module ์์์๋ Private์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ธฐ์กด Basic/UO ์ด๋ฆ์ ๋ฎ์ด์ธ ์ ์์ผ๋ฏ๋ก ๋ค๋ฅธ ์ด๋ฆ๊ณผ Alias๋ฅผ ์ฌ์ฉํ์ธ์.Lib / library.dllโ ํ์ .dll ์ด๋ฆ ๋๋ ๊ฒฝ๋ก์ ๋๋ค. ๋จ์ ์์คํ ์ด๋ฆ์ System32์์ ๋จผ์ ์ฐพ๊ณ , ๋ค๋ฅธ ์๋ ๊ฒฝ๋ก๋ Include๋ฅผ ํฌํจํด ์ ์ธ ํ์ผ์ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค. ์ ๋ ๊ฒฝ๋ก๋ ํ์ฉํฉ๋๋ค. ํ์ฌ ์์ ํด๋๋ PATH๋ ๊ฒ์ํ์ง ์์ต๋๋ค. ์ข ์ DLL์ ํด๋น DLL ์์ด๋ System32์ ๋ ์ ์์ต๋๋ค.Alias / exportโ ์ ํ์ ์ธ ์ ํํ ๋ด๋ณด๋ด๊ธฐ ์ด๋ฆ์ผ๋ก ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์๋ตํ๋ฉด ๋จ์ ๋ก์ปฌ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค. ์๋ฒ ๋ด๋ณด๋ด๊ธฐ๋ ์ง์ํ์ง ์์ต๋๋ค. ์ ์ธ๊ณผ ์ ํํ ๋ง๋ ๋ค์ดํฐ๋ธ Windows x64 ํจ์๊ฐ ํ์ํ๋ฉฐ ๊ด๋ฆฌํ .NET ๋ฉ์๋๋ ์๋๋๋ค.Ansi / Unicode / Autoโ ๊ธฐ๋ณธ Ansi๋ Windows ANSI๋ก ๋ฌธ์์ด์ ๋ณต์ฌํด ํํ ๋ถ๊ฐ๋ฅํ ๋ฌธ์๊ฐ ์์ค๋ ์ ์์ต๋๋ค. Unicode๋ UTF-16์ ๋๋ค. ๋ ๋ฐฉ์ ๋ชจ๋ ์ ํํ ์ด๋ฆ์ ์ฐพ์ต๋๋ค. Auto๋ UTF-16์ผ๋ก ์ ํํ ์ด๋ฆ๋ถํฐ ์ฐพ๊ณ ์ด์ด W๋ฅผ ๋ถ์ ๋๋ค. ์ค์ ํจ์ ์ธ์ฝ๋ฉ์ ์์๋ด์ง๋ ๋ชปํ๋ฏ๋ก Unicode API๋ Unicode์ ๋ช ์์ ์ธ W ์ด๋ฆ์ ๊ถ์ฅํฉ๋๋ค.ByVal arg As Typeโ ๋งค๊ฐ๋ณ์๋ 0~4๊ฐ๋ก ๊ฐ ํญ๋ชฉ์ ByVal๊ณผ As Integer, Double, Boolean ๋๋ String์ด ํ์ํฉ๋๋ค. Integer๋ ๋ถํธ ์๋32๋นํธ, Double์64๋นํธ, Boolean์32๋นํธ Windows BOOL์ด๋ฉฐ C/C++ bool์ด ์๋๋๋ค. String์ ์ฝ๊ธฐ ์ ์ฉ ์์ NUL ์ข ๋ฃ ์ ๋ ฅ ๋ณต์ฌ๋ณธ์ผ๋ก ์ต๋1048576 UTF-16๋จ์์ด๋ฉฐ ๋ด๋ถNUL์ ๊ธ์ง๋ฉ๋๋ค. DLL์ ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ๋ฒํผ์ ์ฐ๋ฉด ์ ๋ฉ๋๋ค. ๋ช ๋ช ๋ ์ธ์๋ ๋ก์ปฌ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค. ByRef, Optional, ParamArray, ๋ฐฐ์ด, ๊ตฌ์กฐ์ฒด, ํฌ์ธํฐ๋ ์ง์ํ์ง ์์ต๋๋ค.As ResultType / Subโ Function์ As Integer, Double ๋๋ Boolean์ด ํ์์ ๋๋ค. Sub๋ As ์์ด Unit์ ๋ฐํํฉ๋๋ค. Integer/Boolean ์ธ์๋ Integer ๊ฐ์ด์ด์ผ ํ๋ฉฐ Double์ Integer๋ ๋ฐ์ต๋๋ค. ํ์ํ๋ฉด CInt/CDbl/CStr๋ก ๋ช ์ ๋ณํํ์ธ์. ๋ฌธ์์ด, ํฌ์ธํฐ,64๋นํธ ์ ์ ๋ฐํ์ ์ง์๋๋ ์๋ช ์ ๋ค์ดํฐ๋ธ ๋ํผ๊ฐ ํ์ํฉ๋๋ค.
๋ฐํ๊ฐ
Integer๋ ๋ค์ดํฐ๋ธ ํจ์๊ฐ ์๋ฏธ๋ฅผ ์ ํ๋ ๋ถํธ ์๋32๋นํธ ์ซ์๋ก, ๋ฐ๋์ ์ฑ๊ณต ์ฌ๋ถ๋ ์๋๋๋ค. Double์64๋นํธ ์ค์์ ๋๋ค. As Boolean์0์0/False, ๋ค๋ฅธBOOL์1/True๋ก ์ ๊ทํํฉ๋๋ค. ์ด๋ฌํ ํ๋๊ทธ์์๋1/0๊ณผTrue/False ๋น๊ต๊ฐ ๊ฐ์ต๋๋ค. Sub๋ ๊ฐ์ด ์์ต๋๋ค(Unit). ์์ ๊ฒฐ๊ณผ๋1, "3:8", "missing export:1"์ ๋๋ค.
๋์
- ์ง์ํ์ง ์๋ ์ ์ธ์ ์คํ ์ ์ SC031๋ก ๊ฑฐ๋ถํฉ๋๋ค. ๋ฃจํธ ์คํฌ๋ฆฝํธ๋น ์ ์ธ256๊ฐ, ๋ก๋๋ DLL64๊ฐ๊น์ง์ ๋๋ค. ๋ถ์๊ณผIDE์์ฑ์DLL์ ๋ก๋ํ์ง ์์ต๋๋ค. ์ค์ ๋ค์ดํฐ๋ธ ์๋ช ์ ์ ์ ์์ผ๋ฏ๋ก ์๋ชป ์ ์ธํ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์ถฉ๋ํ ์ ์์ต๋๋ค.
- ์ฒซ ํธ์ถ์DLL์ ๋ก๋ํ๊ณ ์ดํ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฃผ์๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค. ์ธ์๋ ์์ฑ ์์๋๋ก ํ ๋ฒ ํ๊ฐํ ๋ค ์ด๋ฆ์ ๋ง๊ฒ ์ฌ๋ฐฐ์นํฉ๋๋ค. ๋ก๋, ์ํคํ ์ฒ, ๋ด๋ณด๋ด๊ธฐ, ๋ณํ ์ค๋ฅ๋Try/Catch๋ก ์ฒ๋ฆฌํ ์ ์์ง๋ง ๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ ์๋ฐ์ ์ผ๋ฐ์ ์ธ ๋ณต๊ตฌ ๊ฐ๋ฅ ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ์๋๋๋ค.
- ๋ณํ ์ค๋ฅ๋ฅผ ํฌํจํด ํธ์ถ์ด ๋๋๋ฉด ์์ ๋ฌธ์์ด์ ํด์ ํฉ๋๋ค. ๋ฃจํธ ์คํฌ๋ฆฝํธ ์๋ฃยท์คํจยท์ทจ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํด์ ํฉ๋๋ค. IDE๋ง ๋ซ์ผ๋ฉด ์คํ ์ค์ธ ์คํฌ๋ฆฝํธ์DLL์ ์ ์ง๋ฉ๋๋ค.
- ์คํฌ๋ฆฝํธ ์์ปค์์ ๋๊ธฐ ํธ์ถํฉ๋๋ค. ์ผ์์ ์ง์ ์ค์ง๋ ํธ์ถ ์ ํ์ ๊ฒ์ฌํ๋ฉฐ, ๋์์ค์ง ์๋ ๋ค์ดํฐ๋ธ ํจ์๋ฅผ ์์ง์ด ์ค๋จํ ์๋ ์์ต๋๋ค. ์งง์ ์์ ์ ์ฌ์ฉํ๊ณ ๊ธฐ๋ค๋ฆด ๋๋Basic Wait๋ฅผ ์ฌ์ฉํ์ธ์. ๊ด๋ฆฌํ DLL, Basic ์ฝ๋ฐฑ, ๊ฐ๋ณ ์ธ์ ๋ด๋ณด๋ด๊ธฐ, ์์ ํฌ์ธํฐAPI๋ ์ง์ํ์ง ์์ต๋๋ค.
์์
1. ํด๋ผ์ด์ธํธ ํ๋ก์ธ์คID
# ClientProcessId๋kernel32.dll์GetCurrentProcessId๋ฅผ ์ธ์ ์์ด ํธ์ถํฉ๋๋ค. Main์ Windows ์ซ์ID๋ฅผprocessId์ ์ ์ฅํ๊ณ processId > 0 ๋น๊ต๋ก1/True๋ฅผ ๋ฐํํฉ๋๋ค. ID ์์ฒด๋Boolean์ด๋UO์๋ฆฌ์ผ์ด ์๋๋๋ค.
Option Explicit On
Declare Function ClientProcessId Lib "kernel32.dll" Alias "GetCurrentProcessId"() As Integer
Sub Main()
Dim processId = ClientProcessId()
Return processId > 0
End Sub
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
ClientProcessId๋kernel32.dll์GetCurrentProcessId๋ฅผ ์ธ์ ์์ด ํธ์ถํฉ๋๋ค. Main์ Windows ์ซ์ID๋ฅผprocessId์ ์ ์ฅํ๊ณ processId > 0 ๋น๊ต๋ก1/True๋ฅผ ๋ฐํํฉ๋๋ค. ID ์์ฒด๋Boolean์ด๋UO์๋ฆฌ์ผ์ด ์๋๋๋ค.
2. ๋ฌธ์์ด, ๊ฑฐ๋ญ์ ๊ณฑ, ์ด๋ฆ ์ธ์
# TextLength(text)๋UTF-16์lstrlenW์ ์ ๋ฌํด ๊ธธ์ด๋ฅผ ๋ฐํํฉ๋๋ค. Power(value, exponent)๋๋Double๋กpow๋ฅผ ํธ์ถํฉ๋๋ค. Describe("ore", 2, 3)๋์ธ์ธ์๋ฅผ ๋ฐ๊ณ Power์ ์ด๋ฆ ์ธ์๋ฅผ ๋ฐ๋ ์์๋ก ์์ฑํ์ฌ"3:8"์ ๋ฐํํฉ๋๋ค. ๋ณด์กฐ ํจ์๋ ๋ชจ๋ ์ ์ํฉ๋๋ค.
Option Explicit On
Declare Unicode Function TextLength Lib "kernel32.dll" Alias "lstrlenW"(ByVal text As String) As Integer
Declare Function Power Lib "ucrtbase.dll" Alias "pow"(ByVal value As Double, ByVal exponent As Double) As Double
Function Describe(ByVal text As String, ByVal value As Double, ByVal exponent As Double) As String
Dim length = TextLength(text:=text)
Dim powered = Power(exponent:=exponent, value:=value)
Return CStr(length) & ":" & CStr(powered)
End Function
Sub Main()
Return Describe("ore", 2, 3)
End Sub
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
TextLength(text)๋UTF-16์lstrlenW์ ์ ๋ฌํด ๊ธธ์ด๋ฅผ ๋ฐํํฉ๋๋ค. Power(value, exponent)๋๋Double๋กpow๋ฅผ ํธ์ถํฉ๋๋ค. Describe("ore", 2, 3)๋์ธ์ธ์๋ฅผ ๋ฐ๊ณ Power์ ์ด๋ฆ ์ธ์๋ฅผ ๋ฐ๋ ์์๋ก ์์ฑํ์ฌ"3:8"์ ๋ฐํํฉ๋๋ค. ๋ณด์กฐ ํจ์๋ ๋ชจ๋ ์ ์ํฉ๋๋ค.
3. ์๋ ๋ด๋ณด๋ด๊ธฐ
# NativeDemo.MissingExport๋ ์ผ๋ถ๋ฌ ์๋ ์ด๋ฆ์
๋๋ค. TryRead๊ฐ ์ค๋ฅ๋ฅผ ์ก์ status="missing export", Finally๊ฐ finished=1๋ก ์ค์ ํ๊ณ Main์ "missing export:1"์ ๋ฐํํฉ๋๋ค. Private๋ ์ ์ธ์ ๋ชจ๋ ์์ผ๋ก ์ ํํฉ๋๋ค. ์ผ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ ์์ด๋ฉฐ ๊ธด๊ธ ์ทจ์ ๋ค ์คํฌ๋ฆฝํธ ์ ๋ฆฌ๊ฐ ์คํ๋๋ค๋ ๋ณด์ฅ์ ์๋๋๋ค.
Option Explicit On
Module NativeDemo
Private Declare Function MissingExport Lib "kernel32.dll" Alias "BasicManualMissingExport_71cf"() As Integer
Public Function TryRead() As String
Dim status = "unexpected export"
Dim finished = 0
Try
MissingExport()
Catch problem
status = "missing export"
Finally
finished = 1
End Try
Return status & ":" & CStr(finished)
End Function
End Module
Sub Main()
Return NativeDemo.TryRead()
End Sub
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
NativeDemo.MissingExport๋ ์ผ๋ถ๋ฌ ์๋ ์ด๋ฆ์ ๋๋ค. TryRead๊ฐ ์ค๋ฅ๋ฅผ ์ก์ status="missing export", Finally๊ฐ finished=1๋ก ์ค์ ํ๊ณ Main์ "missing export:1"์ ๋ฐํํฉ๋๋ค. Private๋ ์ ์ธ์ ๋ชจ๋ ์์ผ๋ก ์ ํํฉ๋๋ค. ์ผ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ ์์ด๋ฉฐ ๊ธด๊ธ ์ทจ์ ๋ค ์คํฌ๋ฆฝํธ ์ ๋ฆฌ๊ฐ ์คํ๋๋ค๋ ๋ณด์ฅ์ ์๋๋๋ค.
๋ด๋ถ ํจ์: ํธ์ถ๋ถํฐ ๊ฒฐ๊ณผ๊น์ง
Declare๋ Basic ํ๋ก์์ ์ด๋ฆ์ ๋ค์ดํฐ๋ธ Windows x64 DLL์ ๋ด๋ณด๋ธ ํจ์์ ์ฐ๊ฒฐํฉ๋๋ค. ์๋ ๋ฒ์๋ ์คํ ์ค ์ฝ๋ ์์ฑ ์์ด ์ปดํ์ผ๋ ํด๋ผ์ด์ธํธ์์๋ ๋์ํ๋ฉฐ, VB.NET ์ํธ ์ด์ฉ ์ ์ฒด๋ฅผ ๋ปํ์ง ์์ต๋๋ค.
1. ExternalDeclaration
์ง์ํ์ง ์๋ ์ ์ธ์ ์คํ ์ ์ SC031๋ก ๊ฑฐ๋ถํฉ๋๋ค. ๋ฃจํธ ์คํฌ๋ฆฝํธ๋น ์ ์ธ256๊ฐ, ๋ก๋๋ DLL64๊ฐ๊น์ง์ ๋๋ค. ๋ถ์๊ณผIDE์์ฑ์DLL์ ๋ก๋ํ์ง ์์ต๋๋ค. ์ค์ ๋ค์ดํฐ๋ธ ์๋ช ์ ์ ์ ์์ผ๋ฏ๋ก ์๋ชป ์ ์ธํ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์ถฉ๋ํ ์ ์์ต๋๋ค.
source -> typed declaration -> SC031 on unsupported ABI
ํ๋ก์ ํธ ์์ค: external/InjectionScript/src/InjectionScript/Runtime/ExternalDeclaration.cs; ํจ์ ExternalDeclaration.
2. LibraryPath / GetCallable
ํ์ .dll ์ด๋ฆ ๋๋ ๊ฒฝ๋ก์ ๋๋ค. ๋จ์ ์์คํ ์ด๋ฆ์ System32์์ ๋จผ์ ์ฐพ๊ณ , ๋ค๋ฅธ ์๋ ๊ฒฝ๋ก๋ Include๋ฅผ ํฌํจํด ์ ์ธ ํ์ผ์ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค. ์ ๋ ๊ฒฝ๋ก๋ ํ์ฉํฉ๋๋ค. ํ์ฌ ์์ ํด๋๋ PATH๋ ๊ฒ์ํ์ง ์์ต๋๋ค. ์ข ์ DLL์ ํด๋น DLL ์์ด๋ System32์ ๋ ์ ์์ต๋๋ค.
first call -> absolute DLL path -> cached library -> exact export
ํ๋ก์ ํธ ์์ค: external/InjectionScript/src/InjectionScript/Runtime/ExternalLibraries.cs; ํจ์ LibraryPath / GetCallable.
3. Invoke
๋งค๊ฐ๋ณ์๋ 0~4๊ฐ๋ก ๊ฐ ํญ๋ชฉ์ ByVal๊ณผ As Integer, Double, Boolean ๋๋ String์ด ํ์ํฉ๋๋ค. Integer๋ ๋ถํธ ์๋32๋นํธ, Double์64๋นํธ, Boolean์32๋นํธ Windows BOOL์ด๋ฉฐ C/C++ bool์ด ์๋๋๋ค. String์ ์ฝ๊ธฐ ์ ์ฉ ์์ NUL ์ข ๋ฃ ์ ๋ ฅ ๋ณต์ฌ๋ณธ์ผ๋ก ์ต๋1048576 UTF-16๋จ์์ด๋ฉฐ ๋ด๋ถNUL์ ๊ธ์ง๋ฉ๋๋ค. DLL์ ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ๋ฒํผ์ ์ฐ๋ฉด ์ ๋ฉ๋๋ค. ๋ช ๋ช ๋ ์ธ์๋ ๋ก์ปฌ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค. ByRef, Optional, ParamArray, ๋ฐฐ์ด, ๊ตฌ์กฐ์ฒด, ํฌ์ธํฐ๋ ์ง์ํ์ง ์์ต๋๋ค.
evaluate arguments once -> validate kinds -> copy input strings -> select compiled call shape
ํ๋ก์ ํธ ์์ค: external/InjectionScript/src/InjectionScript/Runtime/ExternalLibraries.cs; ํจ์ Invoke.
4. CallInteger / CallDouble / CallVoid
Function์ As Integer, Double ๋๋ Boolean์ด ํ์์ ๋๋ค. Sub๋ As ์์ด Unit์ ๋ฐํํฉ๋๋ค. Integer/Boolean ์ธ์๋ Integer ๊ฐ์ด์ด์ผ ํ๋ฉฐ Double์ Integer๋ ๋ฐ์ต๋๋ค. ํ์ํ๋ฉด CInt/CDbl/CStr๋ก ๋ช ์ ๋ณํํ์ธ์. ๋ฌธ์์ด, ํฌ์ธํฐ,64๋นํธ ์ ์ ๋ฐํ์ ์ง์๋๋ ์๋ช ์ ๋ค์ดํฐ๋ธ ๋ํผ๊ฐ ํ์ํฉ๋๋ค.
Windows x64 argument slots -> native call -> declared result
ํ๋ก์ ํธ ์์ค: external/InjectionScript/src/InjectionScript/Runtime/ExternalCallSites.cs; ํจ์ CallInteger / CallDouble / CallVoid.
5. Dispose
๋ณํ ์ค๋ฅ๋ฅผ ํฌํจํด ํธ์ถ์ด ๋๋๋ฉด ์์ ๋ฌธ์์ด์ ํด์ ํฉ๋๋ค. ๋ฃจํธ ์คํฌ๋ฆฝํธ ์๋ฃยท์คํจยท์ทจ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํด์ ํฉ๋๋ค. IDE๋ง ๋ซ์ผ๋ฉด ์คํ ์ค์ธ ์คํฌ๋ฆฝํธ์DLL์ ์ ์ง๋ฉ๋๋ค.
finally: free temporary strings; root exit: release DLL handles in reverse order
ํ๋ก์ ํธ ์์ค: external/InjectionScript/src/InjectionScript/Runtime/ExternalLibraries.cs; ํจ์ Dispose.
Integer๋ ๋ค์ดํฐ๋ธ ํจ์๊ฐ ์๋ฏธ๋ฅผ ์ ํ๋ ๋ถํธ ์๋32๋นํธ ์ซ์๋ก, ๋ฐ๋์ ์ฑ๊ณต ์ฌ๋ถ๋ ์๋๋๋ค. Double์64๋นํธ ์ค์์ ๋๋ค. As Boolean์0์0/False, ๋ค๋ฅธBOOL์1/True๋ก ์ ๊ทํํฉ๋๋ค. ์ด๋ฌํ ํ๋๊ทธ์์๋1/0๊ณผTrue/False ๋น๊ต๊ฐ ๊ฐ์ต๋๋ค. Sub๋ ๊ฐ์ด ์์ต๋๋ค(Unit). ์์ ๊ฒฐ๊ณผ๋1, "3:8", "missing export:1"์ ๋๋ค.