본문 바로가기

쓰기

콘솔...이라고 써뒀지만 콘솔도 아닙니다 'ㅅ'

걍 Shift-JIS로 된 파일을 휙 던져 넣으면 알아서 번역해서
파일명_new.확장자로 번역해서 만들어주도록 되어있는 녀석입니다.


QuickTrans 쓰려다가 영 귀찮아서 MFC판 QuickTrans 만드는데 연습할 겸 해서
일단 스마가 기준으로 만들었는데,
한가지 문제가 발생합니다.



아랄트랜스의 ezTransXP.dll을 '네번' 로드한뒤
번역 명령을 내리는 식으로 멀티스레드를 구현했는데,

결과적으로는 네개를 동시에 불러도 돌아가긴 똑같이 돌아가는듯한 느낌입니다 -_-?

왜 그럴까요?
조회 수 :
13001
등록일 :
2009.08.11
22:08:24
엮인글 :
https://arallab.hided.net/26373/488/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/26373

whoami

2009.08.12
23:34:41
음. 질문의 요지가 명확치는 않군요. 쓰레드가 4개 돌아가는데 쓰레드 1개 돌아가는 것과
 일하다는 것인지 아니면 ezTransXP.dll 을 4개 로드했는데 ezTransXP.dll 을 1개 로드한것과
 같다는 뜻인지.. 혹은 전혀 다른 질문인지..

일단, 소스를 한번 훑어보니 확실히 잘못 알고 계신 것이 하나 있어 말씀드립니다.

DLL 은 같은 이름 (같은 path 의 같은 이름의 dll) 인 경우 메모리에는 *단 한번* 올라갑니다.
두 번째 부터는 실제 DLL 이 올라가는 것이 아니라 레퍼런스 카운트만 하나씩 올라갑니다.
그러다가 FreeLibrary 가 불릴 때 마다 레퍼런스 카운트를 하나씩 빼 가다가 마지막 하나가
FreeLibrary 되는 순간 메모리에서 삭제됩니다.

그래서.. 어떤 프로그램이 Kernel32.dll 을 불러 사용하고, 또 그 프로그램이 불러오는 각각의
다른 DLL 마다 Kernel32.dll 을 또 불러 사용하는데도 (Dependency Walker 로 확인할 수 있습니다)
메모리 부족 에러가 나지 않고 제대로 돌아가는 것입니다. 반대로, MFC 등을 사용할 때 MFC라이브러리를
동적으로 링크 시킬 때 메모리가 많이 절약되는 이유이기도 하고요.

DllMain() 이라는 함수를 기억하실지 모르겠네요. DLL 의 엔트리 포인트 격의 역할을 하는
함수인데요, 맨 처음 DLL이 메모리에 Load되면 DLL_PROCESS_ATTACH 를 받고,
그 이후부터는 DLL_THREAD_ATTACH 를 받으며, Free 될 때마다 DLL_THREAD_DETACH
를 받다가.. 마지막에 메모리에서 사라질때 DLL_PROCESS_DETACH 를 받습니다.
자세한 사항은 DllMain() 관련 설명을 참조하세요.

그러다보니.. 주의사항도 있습니다. DLL 에서는 *전역변수* 를 쓰는 것을 조심해야 합니다.
왜냐하면 메모리에 단 한번 로드되기 때문에 그 전역변수를 모든 쓰레드에서 공유하기 때문이죠.

예를 들어.. A.exe 라는 프로그램이 B.dll, C.dll 을 쓰는데, B.dll 은 내부적으로 C.dll 을 불러 쓴다고
합시다. 그런데 C.dll 에는 내부에서 전역변수로 strWorkFile 이라는 변수를 두고 여기에 현재 작업중인
파일명을 저장해 둡니다.

이제 A.exe 에서 strWorkPath = C:/work.txt 로 해서 작업을 하고 있다가 B.dll 의 함수 하나를 불렀습니다.
B.dll 은 strWorkPath 를 내부적으로 C:/temp.txt 로 바꾸고 작업을 했습니다. 이제 A.exe 에서 strWorkPath
를 다시 불러와 작업을 하려고 보니 작업한 내용을 못 찾는 것이죠.

이와 같은 문제가 MultiPlugin 에서도 있었습니다.. 갑자기 아랄트랜스와 연관된 주제가 나와서 놀라셨죠? ^^
예전 MultiPlugin1 에서는 Translate() 만을 통해서 아랄 - 필터(pre) - 번역 - 필터(post) - 아랄 로 돌려주게
되어 있었습니다. 그러다보니 필터(pre)와 필터(post) 로 두 번 로드시켜야 하는데 메모리에는 한 번밖에
로드가 안되니 환장할 노릇이었죠. 처음에는 bool 전역변수로 pre 에서 true 로 바꿔놓고 post 에서
false 로 하는 방법을 사용했는데.. 그러다보니 중간에 번역포기를 할 때 방법이 없더군요; 그래서
pre필터, post필터 로 같은 DLL 을 2개 만들어 보았더니.. pre 와 post 로 2개 나뉘어서 복잡할 뿐더러
두 DLL 간의 데이터 공유가 어려웠습니다.. 그래서 결국은 인터페이스 규약을 확장시켜서
PreTranslate() 와 PostTranslate() 를 따로 사용하는 MultiPlugin2 가 나오게 된 것이랍니다. ^^

현재의 플러그인 (알고리즘, 필터, 번역 포함)은 "반드시 한번만 Load 된다" 라는 전제를 가지고
제작되며 또 아랄에서 그렇게 제어하기 때문에 전역변수를 마음껏 사용해도 됩니다만.. 필터 추가창을
잘 보시면 "중복 추가 허용" 체크박스가 있고 그걸 체크하면 중복 추가도 가능합니다. 물론
중복 추가를 염두에 두고 만든 필터만 사용해도 부작용이 없으며 체크시 경고문이 뜨는 이유도
여기에 있습니다.

뭐.. 이걸로 이야기하다 보면 또 한이 없으니.. 더 궁금하신게 있으면 그때 다시 적도록 하죠.
List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155439   2008-08-03 2008-12-16 00:03
149 Talk 아나 ㅅㅂ VS2008 안쓸랍니다. [5] Hide_D 12867   2009-04-02 2009-04-03 21:16
제컴이 ㅄ인지 설치할때 ㅄ이 된건진 잘 모르겠는데, 쓰기 갑갑해 미치겠습니다ㅣ -_-; Visual Studio 2008 SP1입니다. 자주 발생하는 현상이 예를 들어 int j=0; for(int i=0;i<28;i++) { j+=i; } for(int i=0;i<28;i++) { j+=i; } _wsprintf(L"%d",j); 요런 ...  
148 Archive ATPluginFrame 프레임워크 20090901 테스트 버전.. file whoami 12897   2009-09-01 2009-09-01 22:49
 
147 Talk 정음 글로벌 2005에 내장된 번역기 [5] Hide_D 12901   2008-11-09 2008-11-09 15:24
ezTransXP보다 좀더 좋아보이네요. 특히 구어표현이 훨씬 낫네요 단순 후커사전 제보 문장들 중에 절반은 수정이 필요없을정도  
146 Archive [플러그인,소스] KoFilter 테스트 버전 20081119 file whoami 12902   2008-11-19 2009-01-06 01:10
 
» Talk [소스] ConsoleTrans + 질문 [1] file Hide_D 13001   2009-08-11 2009-08-12 23:34
콘솔...이라고 써뒀지만 콘솔도 아닙니다 'ㅅ' 걍 Shift-JIS로 된 파일을 휙 던져 넣으면 알아서 번역해서 파일명_new.확장자로 번역해서 만들어주도록 되어있는 녀석입니다. QuickTrans 쓰려다가 영 귀찮아서 MFC판 QuickTrans 만드는데 연습할 겸 해서 일단 ...  
144 Archive [플러그인] FixLine 테스트버전 081230 [4] file Hide_D 13238   2008-12-30 2008-12-31 00:39
 
143 Talk QuickTrans2 자료 백업 file Hide_D 13246   2009-08-26 2009-08-26 02:53
 
142 Talk [아랄0.3] 후킹주소 추가하고 번역인자 선택시 오류인지 [3] 암흑마제 13263   2009-12-21 2009-12-21 23:22
아랄// 아랄님 ^^ 0.3 실행하여 0.2에서 찾은 코드로 적용을 할려고 하니 문제가 있는 듯 하네요 뭐냐면 후킹주소 넣고 번역인자 추가했을때 한 후킹주소에 번역인자가 2개가 있는 경우가 더러 있잖아요 그때 처음 인자 말고 두번째 인자는 무조건 아무것도 ...  
141 Talk [질문]번역플러그인에서 필터후처리로 넘어갈때.. [1] 호기 13282   2009-12-19 2009-12-19 03:08
우선 0.3 출시 축하드리고요...^^마침 전국란스 깔려 있어서 테스트 해보았는데... 음 실행 파일 해시가 안맞는다고 나오네요.. 머 이거야 제가 호환되는 버전의 전국란스를 다시 설치하거나 혹은... 이 실행파일 버전을... 추가등록시켜주시던가 하면 될거 같...  
140 Talk 튕기는 문제에 대해서 [6] Hide_D 13286   2009-11-26 2009-12-15 02:55
뭐 다들 아시다시피(?) 대부분의 문제는 보안툴이나 백신에 대해선 충돌하기 때문인데, 여태까지는 소극적으로 대응해왔는데 이젠 좀 적극적으로 뭐가 문제인지를 찾아봐야겠습니다. 해서 다음을 조사해서 보고서를 작성하는 프로그램을 만들어볼 예정입니다~ ...  
139 Talk 아랄0.3 20일자 업데이트 적용시 구동 스샷(반반??) [4] file 암흑마제 13305   2009-12-21 2009-12-21 18:35
 
138 Archive [플러그인,소스] Korean Duplication Checker 20090115 [2] file Hide_D 13334   2009-01-14 2009-01-19 23:34
 
137 OtherFiles fixline 테스트 2차 file 처음처럼만 13341   2008-12-16 2008-12-16 15:52
 
136 Talk [오류] 확장자가 ats 인 파일 실행시 오류 납니다. [1] 암흑마제 13360   2009-12-20 2009-12-20 21:08
auto run invalid parameter or setting file! 이라고 뜨는데요 확장자가 ats 인 파일을 실행시키면 이렇게 되네요 참고로 아랄0.3이고 0.3은 설치 잘 되었습니다.  
135 Archive [플러그인,소스] FixLine 테스트버전 081220_2 [2] file Hide_D 13376   2008-12-20 2008-12-21 08:29
 
134 Archive [플러그인, 소스] FixLine 테스트 버전 Archive(08.31 12:12 갱신) [1] file Hide_D 13429   2008-08-30 2009-01-18 20:11
 
133 Talk 번역기(eztransXP)가 만드는 몇가지 문제들 - 1 [1] Hide_D 13437   2009-12-16 2009-12-16 21:32
이지트랜스가 만드는 몇가지 문제에 대해서 다뤄보려고 합니다. 우선 첫번째로 일본어의 히라가나, 또는 가타카나 한글자가 번역기로 입력될경우 결과물이 공백(length = 0)이라는 문제입니다. 이 문제는 대개 게임 엔진에서 '강제로 한글자씩 출력하는 경우'(...  
132 Archive [플러그인, 소스] ATCode 테스트 버전 20080721 [10] file whoami 13514   2008-07-21 2011-06-28 01:25
 
131 Talk 참 오묘한 윈도우~ 호기 13568   2009-04-04 2009-04-04 01:02
실수로.... malloc으로 잡은걸 HeapFree 하고 있었네요... (머 정확히 말자면 HeapCreate로 새 힙영역 확보하고 할당 해제 하는걸 구축했습니다만.... 정작 할당부분에서 malloc을썼던거죠) 문제는 이렇게 잘못짠걸 1개월이나 지난후에 알았다는 겁니다. 즉 그...  
130 Talk 고칠거? [10] Hide_D 13651   2009-11-28 2009-12-17 18:13
아랄 처음 켰을때 프로세스 먼져 보이는거 아랄만 아랄로 프로세스에 안뜬다는거. by 피시 제 덧[..] 이지트랜스 경로 지정하면 앞으론 고정해봅시다 ㅇㅇ