이 글을 쓰게 된 이유는 LoadLibraryW와 LoadLibraryA의 차이점을 찾아보다 알게되어서
LoadLibraryW는 입력을 유니코드 인코딩으로 받고
LoadLibraryA는 입력을 ANSI 인코딩으로 받는다
유니코드는
UTF-8: 가변 길이 인코딩 방식으로, 문자에 따라 1바이트에서 4바이트까지 사용한다. 영어와 같은 라틴 문자에 대해서는 1바이트를 사용하고, 복잡한 문자에 대해서는 더 많은 바이트를 사용한다.
UTF-16: 문자에 따라 2바이트 또는 4바이트를 사용한다. 유니코드 문자의 대다수는 2바이트로 표현된다.
UTF-32: 모든 문자를 4바이트로 고정 길이로 인코딩한다. 이 방식은 간단하지만 메모리 사용량이 크다.
ANSI는
1바이트 인코딩: 기본 ASCII 문자는 7비트로 표현되며, 확장 문자(주로 서유럽 언어에 사용되는 추가 기호)는 8비트로 인코딩된다. 하나의 문자는 항상 1바이트 크기.
확장된 코드페이지로 다른 문자도 나타낼 수 있음.
문자열 앞에 L붙이면 유니코드가 된다.
#include "windows.h"
#include "tchar.h"
int main()
{
LoadLibraryW(L"C:\\Users\\a0102\\source\\repos\\Dll1\\x64\\Release\\Dll1.dll");
LoadLibraryA("C:\\Users\\a0102\\source\\repos\\Dll1\\x64\\Release\\Dll1.dll");
Sleep(100000);
return 0;
}
디버거로 L붙인 곳이 저장된 메모리를 보면
00007FF668872260 43 00 3A 00 5C 00 55 00 73 00 65 00 72 00 73 00 C.:.\.U.s.e.r.s.
00007FF668872270 5C 00 61 00 30 00 31 00 30 00 32 00 5C 00 73 00 \.a.0.1.0.2.\.s.
00007FF668872280 6F 00 75 00 72 00 63 00 65 00 5C 00 72 00 65 00 o.u.r.c.e.\.r.e.
00007FF668872290 70 00 6F 00 73 00 5C 00 44 00 6C 00 6C 00 31 00 p.o.s.\.D.l.l.1.
00007FF6688722A0 5C 00 78 00 36 00 34 00 5C 00 52 00 65 00 6C 00 \.x.6.4.\.R.e.l.
00007FF6688722B0 65 00 61 00 73 00 65 00 5C 00 44 00 6C 00 6C 00 e.a.s.e.\.D.l.l.
00007FF6688722C0 31 00 2E 00 64 00 6C 00 6C 00 00 00 00 00 00 00 1...d.l.l.......
UTF - 16으로 인코딩되어 저장된 것을 볼 수 있다. 1글자에 2바이트
하지만 L이 안붙은 경우 디버거로 보면
00007FF6688722D0 43 3A 5C 55 73 65 72 73 5C 61 30 31 30 32 5C 73 C:\Users\a0102\s
00007FF6688722E0 6F 75 72 63 65 5C 72 65 70 6F 73 5C 44 6C 6C 31 ource\repos\Dll1
00007FF6688722F0 5C 78 36 34 5C 52 65 6C 65 61 73 65 5C 44 6C 6C \x64\Release\Dll
00007FF668872300 31 2E 64 6C 6C 00 00 00 00 00 00 00 00 00 00 00 1.dll...........
ANSI로 인코딩 되어 저장된 것을 볼 수 있다.
LoadLibraryA는 ANSI의 A 메모리에서 보면 1바이트씩
LoadLibraryW는 유니코드 UTF-16 인코딩 2바이트씩..
그리고 \를 문자에 넣고싶다면 \\를 쓰기..