본문 바로가기

쓰기

4. procTranslate 로 지정된 번역함수가 불렸을 때 자신이 어떤 컨텍스트로 불렸는지 아는 방법
현재 컨텍스트의 이름을 얻는 것 외에는 대부분 원하는게 가능할 것 같습니다. pObjectExtention 에 어떤 객체의 포인터를 넣어 놓고, procTranslate 가 호출되었을 때 그 값을 객체로 캐스팅해서 사용하면 객체의 분기문제도 해결될 수 있을 것 같네요

제 생각에는 현재 컨텍스트의 이름을 알려주는 것이 좋을 것 같은데요.. 예를 들어 보겠습니다.

상황) 이름과 대사부분이 서로 다른 포인트에서 잡히는 게임을 후킹합니다. 각 컨텍스트명은 각각
"NAME" 과 "TEXT" 라고 하겠습니다. 그리고 필터는 커스텀딕과 비슷한 역할을 하는데, 각 컨텍스트마다
다른 사전을 가지도록 합니다. 예를 들면 이름쪽은(마나카, 유이), 대사쪽은 (안녕하세요, 오랫만이에요)
뭐 이런..

문제 1) OnObjectInit 가 NAME, TEXT 컨텍스트 순으로 불렸습니다. 필터 쪽에서는 컨텍스트명을 알 수 없으니
첫번째 객체는 1, 두번째 객체는 2 로 명명합니다 (곧, NAME=1, TEXT=2). 그래서 데이타 파일을 다음과
같이 만들었다고 하겠습니다.

[1]
(일어)   마나카
(일어)   유이
[2]
(일어)   안녕하세요
(일어)   오랫만이에요

물론 (일어) 자리에는 각각의 한글에 해당하는 일어 내용이 들어있다고 합니다.. -_-

이제 게임을 종료시키고 새로 게임을 시작합니다. 이 때 반드시 NAME=1, TEXT=2 에 맞게 데이타가
들어온다고는 할 수 없지 않을까요? 또한, 만약 새로 선택지 포인트가 발견되어 선택지 컨텍스트가
생긴다면 각각의 데이터가 잘못된 컨텍스트에 배당될 가능성이 있습니다.

문제 2) 이 게임을 다른 작업자가 보고 데이타 파일에 부족한 부분을 보충하려고 합니다. 첫번째
데이타 파일 작업자는 대충 [1] = NAME, [2] = TEXT 라는 것을 알고 있습니다만 두번째 작업자는
[1] [2] 라는 숫자만 봐서는 이 숫자가 무엇을 뜻하는지 바로 알 수 없겠죠. 물론 이름과 대사 정도면
바로 구분이 가능하지만 대사와 선택지가 되면 바로 구분하기는 어렵죠. 결국 두번째 작업자는
각각의 컨텍스트에 무엇이 오는지를 게임을 다시 실행해보면서 하나하나 알아봐야 각각의 데이터
파일이 무엇을 의미하는지 알 수 있을 것 같습니다.

-------------------------------------------

뭐.. 사실 제 머리속에서만 상상한 거라 실제로는 별 문제 없을지도 모르겠습니다.. 만 한번 생각해 볼
필요는 있지 않을까 해서 문제제기를 합니다. 다른 분들의 의견은 어떠신지요?

분류 :
Talk
조회 수 :
15151
등록일 :
2009.12.24
01:16:16
엮인글 :
https://arallab.hided.net/30921/53d/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/30921

아랄

2009.12.24
02:14:42
음.. 좋은 지적을 해주셨군요.
맞습니다. 순서대로 컨텍스트를 생성하긴 하지만 앞으로 꼭 그렇다는 보장도 없죠.
컨텍스트의 이름을 플러그인도 알 수 있어야 하겠네요.
금방 떠오르는 방법들은 이렇습니다.

1. TRANSLATION_OBJECT 구조체에 cwszContextName이란 멤버를 추가해서, OnInitObject를 호출할 때 여기에  컨텍스트 이름이 세팅되어서 넘어온다.
- 장점 : 구조상 명확하고 단순.
- 단점 : 공통 헤더 변경으로 인한 모든 플러그인 재컴파일 필요

2. 컨텍스트는 TRANSLATION_OBJECT 구조체의 더블링크드리스트로 구성되어 있는데, 이중 헤더의 wszObjectOption 값이 컨텍스트의 이름이다.
[헤더     ] ->wszObjectOption == '컨텍스트 이름'
[Filter 1 ]
[Filter 2 ]
[Filter 3 ]
[테일     ]
- 장점 : 공통 헤더 변경 없음.
- 단점 : 꼼수같아 보이며 장기적으로 봤을 때 별로 좋아보이지 않음

어떤 방식이 좋을지, 또는 더 좋은 아이디어가 있을지 댓글 부탁드립니다.

Hide_D

2009.12.24
03:06:23
아직 정식버전이 아닌만큼 근본적인 해결이 가능한 쪽을 선택하는 것이 좋다고 봅니다.

whoami

2009.12.24
10:26:30
1번이 간단해서 좋습니다.. ㅎㅎ

새 멤버가 구조체의 가장 마지막으로 들어간다면 예전 컴파일된 필터를 재컴파일 하지 않더라도
제대로 동작하지 않을까요? 뭐.. 제대로 재컴파일 하는게 좋겠습니다만.

아, 그러고보니. 재컴파일 이야기 나와서 생각난건데요. FontMapper 플러그인의 임포트 DLL 을 보면
MSVCR90.dll 과 MSVCP90.dll 이 있는데.. 이거 일반 XP 에서는 VC2008 런타임 패키지를 설치해야
제대로 작동할 겁니다. 아직은 별 오류보고가 없는 것 같습니다만 그래도 알고 계시는 것이 나을 듯. 

whoami

2009.12.25
19:13:17
TRANSLATION_OBJECT 에 대하여 조금 더..

pPreTransBuf 나 pPostTransBuf 를 보면 void * 형 이라는 것을 알 수 있습니다.
이게 char * 나 WCHAR * 형이 아닌 것으로 봤을 때.. 이 데이타가 0.2 때처럼 "/0 으로 끝나는  MBCS
캐릭터 문자열" 만이 오지 않을 것이라는 것을 짐작할 수 있지요.

그렇다면.. 이 데이타가 어떤 형식인가.. 를 알려주는 것도 있어야 하지 않을까요. 가장 간단한 예로는
"이건 유니코드 문자열이다" 라는 것을 옵션 같은 것으로 알려주어야 하지 않을까 싶군요.

... 그렇게 된다면, 알고리즘 플러그인 쪽에서 "이건 유니코드 문자열이다" 라는 것을 알려줄 방법이
있어야 하는데.. TranslateUsingCtx 의 인자는 LPCWSTR cwszContextName, LPVOID pSrcData,
int nSrcDataLen, LPVOID pTarBuf, int nTarBufLen 밖에 없다는 문제가 생깁니다.

이에 대한 다른 분들의 생각은 어떠신지요? (왜인지, 어려운 문제만 들고 오는 것 같아 죄송합니당 ㅜ_ㅜ)

Hide_D

2009.12.25
22:37:20
데이터가 MBCS로 통일된것으로 알고 있는데, 아닌가요?

아랄

2009.12.26
02:39:56
아~ 이부분은 일단 일본미연시를 위한 번역을 할 땐
잠정적으로 char* 형으로 통일하는게 좋을 것 같습니다.
물론 말씀하신 것처럼 미래에는 이것이

유니코드 문자열 일 수도 있고,
어떤 이미지 데이터가 될 수도 있고,
이진 파일 특정 부분의 데이터일 수도 있습니다.

현재까지는 아랄트랜스가 일본어 문자열을 번역하는데만 쓰이므로
그냥 멀티바이트 일본어 문자열로 간주하는게 어떨까요? ^^

아랄

2009.12.26
02:42:53
사실 데이터 타입을 의미하는 상수를 아랄트랜스 나름대로 정의해도 되겠지만
뭔가 이렇게 스탠다드 하지 않은 자신만의 개념을 계속 만들어 가는걸 좀 꺼려해서 ^^;;
다른 분들의 의견은 어떤가요?

whoami

2009.12.26
15:34:10
뭐.. 저는 버퍼가 void * 형으로 정의된 것을 보고 추리(라기보다는 상상?) 해서 질문한 것이니까요;;
나중에 컨텍스트에 대한 옵션을 주는 API 를 추가시키거나 해서 해결할 수 있을 듯도 싶습니다.
List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155437   2008-08-03 2008-12-16 00:03
349 Talk 2등 ~ [3] 앙마vv 15977   2008-07-08 2008-09-17 00:31
2등 입니다 ㅋㅋㅋㅋ ........... 뭐... 뭐 어쩌라는거지 .......... 그나저나 이곳 뭐하는곳 ??????? ㄷㄷㄷ;;  
348 Talk FixLine 23일자 파일은 무시설정에 문제가 있는듯하네요 [7] 류제로 15841   2008-12-26 2008-12-30 08:30
이번에 올라온 종말능의를 코드를 입력시켜면서 알게된 것인데 23일자 FixLine 옵션의 무시설정의 서클체크을 사용안함 이외 부분을 체크하고 확인을 누르면 적용은 되는듯하나 다시 옵션창을 열어보면 체크가 사용 안함으로 표시 되어있습니다 20일자로 실행...  
347 Talk XML 파싱 부분에 문제가 하나 있네요. Hide_D 15772   2009-12-30 2009-12-30 21:42
xml 태그에서 그 태그에 대한 내용이 없을경우 <tag></tag> 로도 표현할 수 있지만 <tag/> 로도 표현 가능합니다. 현재 파서 부분을 보니 <tag/>형식의 태그에는 대응이 되어 있지 않은것 같습니다.  
346 Talk 문자열 길이에 대한 건의 file G2m 15608   2010-01-21 2010-01-21 18:44
 
345 OtherFiles 히데님, 픽스라인 관련 메모장 파일입니다. [1] file astral 15603   2008-12-16 2008-12-16 01:19
 
344 Talk [버그 보고?]브라반 드디어 원인을 찾았습니다. orz [6] Hide_D 15593   2008-07-08 2008-07-09 16:23
엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉 0x3010 0x3011이용해서 대사 처리하는 녀석들을 찾아보았더니 http://aralgood.com/zbxe/26860 루이는 토모를 부른다. 가 있더군요. 요건 그 일부분! ------------------------------------------------------...  
343 Archive [플러그인,소스] KoFilter 테스트 버전 20081118 file whoami 15552   2008-11-18 2008-11-18 23:37
 
342 OtherFiles 0.3 설정 xml 파일 예제 [4] file 아랄 15532   2009-09-20 2009-09-21 00:12
 
341 Talk ats파일에 아이콘을... [2] Hide_D 15493   2009-12-23 2009-12-23 14:27
역시 ats에 아이콘을 넣는 게 좋을 것 같습니다. 그래서 생각해본 방법 1. xml에 <icon></icon>항목을 추가해서 추가할 ico 파일을 변환해서 넣기 0xff -> 'FF' 식으로 하면 실제 ico 파일에 대해서 대략 용량이 2배가 되겠지만 '별 수 없죠' 2. ats에 대한 Ic...  
340 Archive [플러그인,소스] FixLine 테스트버전 081221 [5] file Hide_D 15475   2008-12-21 2008-12-22 02:30
 
339 OtherFiles fixline 테스트 [1] file 처음처럼만 15297   2008-12-16 2008-12-16 15:52
 
338 Archive [플러그인,소스] FixLine 테스트버전 081215 [5] file Hide_D 15213   2008-12-15 2008-12-16 01:18
 
337 Talk 0.3에서 전국란스의 경우 [1] Hide_D 15178   2009-12-13 2009-12-14 02:10
ats파일을 만들어서 동작할경우 문제가 산넘어 산입니다. 1. 주소 문제 2. Rance7으로 바꾸었을때 AppLocale의 미묘한 작동 ㄹㅋ  
» Talk 번역함수가 불렸을 때 자신이 불린 컨텍스트 이름을 아는 문제.. [8] whoami 15151   2009-12-24 2009-12-26 15:34
4. procTranslate 로 지정된 번역함수가 불렸을 때 자신이 어떤 컨텍스트로 불렸는지 아는 방법 현재 컨텍스트의 이름을 얻는 것 외에는 대부분 원하는게 가능할 것 같습니다. pObjectExtention 에 어떤 객체의 포인터를 넣어 놓고, procTranslate 가 호출되었...  
335 Talk 줄 바꿈을 n으로 하는 게임에서 벽뚫기 방지 해결책 [1] Hide_D 15082   2008-07-12 2008-07-12 18:09
http://aralgood.com/zbxe/33245 여기 스샷보고 생각난건데, 자릿수를 지정해 주고, n을 새로 먹여주면 벽뚫기가 줄어들지 않을까요.  
334 Talk 0.3 SVN 경로 수정했습니다! [2] Hide_D 15071   2009-12-23 2009-12-23 14:03
현재 아랄트랜스가 있는 서버에 SVN이 추가되어서 속도 향상을 목표로 SVN경로를 다음과 같이 변경했습니다. svn://aralgood.com/araltrans03/trunk revision은 몇가지 실수 빼곤 22개 리비젼 그대로 옮겨두었습니다. 다만 커밋 날짜가 달라지게 되므로 경로를...  
333 Talk 문자열의 길이를 반영하는 '필터' [4] Hide_D 15027   2010-01-19 2010-01-22 01:28
문자열 길이가 고정되어서 포인터 바꿔치기를 통해서도 길이가 바뀌지 않는 것들이 있는데, 이놈들을 위해 길이를 반영하는 필터가 있으면 좋을것 같습니다. 인자로 반영할 메모리 주소 1. 모듈(메모리 주소) 기반 2. 레지스터 기반 으로 ATCode의 그것과 비슷...  
332 Talk [질문] HKCU/Software/AralGood/M2WAddr ? [3] whoami 14960   2008-07-08 2008-07-08 19:14
// CATCodeMgr::Init(ATCodeMgr.cpp) 중에서... // 어플로케일 관련 함수 m_sTextFunc.pfnOrigMultiByteToWideChar = (PROC_MultiByteToWideChar) CRegistryMgr::RegReadDWORD(_T("HKEY_CURRENT_USER\Software\AralGood"), _T("M2WAddr")); m_sTextFunc.pfnOri...  
331 Archive [플러그인, 소스] CmdFilter 테스트 버전 20080712 [1] file whoami 14942   2008-07-12 2009-01-06 01:00
 
330 Talk 번역 플러그인 난해한 문제???? [3] 호기 14864   2009-03-15 2009-10-20 18:06
지금 ML_Trans라는 번역 플러그인을 만들고 있는데 좀 이해가 안가는 문제가 생기네요.. 아랄에 적용시킨후 다른 번역 플러그인으로 바꿀때는 아무 문제가 안생깁니다 그러니까 번역 플러그인을 EzTransXp<->ML_Trans로 마구 여러번 바꾸어도 문제는 안일어 납...