본문 바로가기

쓰기

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

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


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



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

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

왜 그럴까요?
조회 수 :
13004
등록일 :
2009.08.11
22:08:24
엮인글 :
https://arallab.hided.net/26373/3c2/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 [필독] 테스트필터 사용시 주의사항 라파에 155441   2008-08-03 2008-12-16 00:03
429 Talk 웹 계정 아이디/비밀번호 secret Hide_D 1   2011-01-02 2011-01-02 16:21
비밀글입니다.  
428 Talk CustomDic의 동작 방식에 대해서 secret Hide_D 4   2012-02-14 2012-02-14 13:36
비밀글입니다.  
427 Talk 코드정리 목록 + 코드 secret sizukana 6   2009-01-17 2009-01-17 11:41
비밀글입니다.  
426 OtherFiles 아랄코드 정리 txt [2] secret 암흑난무 27   2008-11-18 2009-01-06 01:10
비밀글입니다.  
425 Archive [플러그인] atcode 비정상 문자 출력 픽스 file Wales 201   2014-02-16 2014-02-16 21:08
 
424 Talk ATCTNR에다가 Python만 갖다 붙여도...? [1] Hide_D 282   2016-01-11 2016-01-12 01:30
ATCTNR에 몇가지 버그는 좀 있지만 이거 좀 보완하고, 인젝터 세팅가능하게 한다음에 ATCTNR + ProtocolBuffer(+gRPC) + Python 3 정도로 해서 묶으면, 꽤 재미있는 물건이 나오지 않을까 생각해봅니다 ㅇㅇ 이쪽은 Standalone으로 해볼만할 것 같기도 하고...  
423 Talk VB.NET에서 ezTransXP.dll사용하는 방법은 없나요? [1] R2D2 364   2016-06-14 2018-06-20 14:44
vb.net에서 MFC dll을 써서 이지트랜스로 번역해서 결과물을 가져오고 싶습니다. 그런데 아무리찾아봐도 방법을 모르겠습니다. Imports System.Runtime.InteropServices  Private Declare Fu*nction Translate Lib "ezTransXP.dll" (ByRef cszJapanese As Stri...  
422 Archive [플러그인,소스] ATCode, KoFilter2 테스트 버전 140301 [3] file whoami 439   2014-03-01 2014-03-02 11:59
 
421 Archive [플러그인,소스] ATCode 테스트 버전 140227 file whoami 457   2014-02-27 2014-02-27 01:59
 
420 Archive [플러그인] ATCode 150531 file TwoComet 473   2015-05-31 2015-06-07 21:30
 
419 Talk atcode.dll이 출력 못하는 글자를 수집해 봅니다. [2] file Wales 491   2014-02-05 2014-02-07 20:13
 
418 Talk 엔드 아랄호환 문제를 모두 수정했습니다 [2] kiereh 496   2014-04-28 2014-04-30 01:25
http://www.eroha.net/%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8/%ec%97%94%eb%93%9c/ 오늘자 버전 (140428)으로 엔드와 아랄트랜스간의 호환 문제가 수정되었습니다. 멀티쓰레드로 번역문을 막 쏘면 문자열 포인터가 튀면서 잘못된 참조를 하던 문제, %가 들어갈...  
417 Archive [실행파일] AralTrans 130710 (7/28일자 부터 포함) file TwoComet 533   2013-07-10 2013-07-28 20:06
 
416 Archive [본체] AralTrans.exe ATCTNR.DLL 150622 [4] file TwoComet 538   2015-06-22 2015-07-25 00:12
 
415 Talk aralgood.com 도메인 부활... [7] whoami 567   2014-03-02 2014-03-17 22:48
혹시나 하고 매일 한번씩 체크하곤 하는데.. 오늘 보니 도메인이 부활했군요! 아랄님이 체크하시고 부활시키셨나? 어쨌든 그에 따라 자동업데이트도 부활하고 좋군요. 혹시 아랄님이나 Hide_D군님 보시면.. 제로보드 업데이트 하실 생각 없으신가요? 꽤 오래된...  
414 Archive [실행파일] AralTrans 130601 file TwoComet 577   2013-06-02 2013-06-02 12:04
 
413 Talk UTF-8이나 유니코드 원활한 필터처리를 위해 생각해봤는데 [5] Wales 624   2014-06-16 2014-07-29 16:39
Translate함수에 포함된 필터 전후처리를 따로 빼서 원문 전환전과 번역후에 필터 처리를 하도록 하는건데 문제는 필터들 전부 멀티바이트 중점으로 만들어지다 보니 필터 전부를 손봐야 하는 상황이 오는군요. 그래서 일단 보류중...  
412 Talk 스마트 방식과 윈7의 호환에 관한 잘못된 견해 [4] TwoComet 666   2013-07-06 2013-07-07 03:37
코드 게시글에 '스마트 방식이라 윈7에서 튕길지도 모른다'는 잘못된 인식을 불어넣는 것을 발견했기에 미리 사전에 이야기합니다. 해당사항의 정확한 원인은 아직까지 발견된 사례의 하나인 기가사나 타 브랜드에서 사용하는 넥서스 엔진에서만 해당하는 사항...  
411 Talk 정말 오래간만입니다. [5] Hide_D 694   2013-05-08 2013-07-04 04:45
중간에 폴라리스 폭파되었다는 소식 듣고 한번 들렀던 걸 제외하면 거의 1년 넘게 접속을 안하고 있었던 셈이네요 -0-;; 랩에 진행중인 과제도 있고해서 아직도 좀 바쁘긴 한데, 시간 나는데로 플러그인 관련으로 쌓인 일 좀 처리해 볼까 합니다. PS. 아직 관...  
410 Archive [플러그인,소스] KiriKiri 테스트 버전 [1] file 미소미소 712   2014-04-17 2015-02-23 21:38