레드수샤 님이 쓰신 글 :
: 안녕하세요.
:
: 아래아래아래아래... 글에서 DLL에 포함된 FORM 호출시에 MouseEnter가 안 먹힌다고 질문했던 초보자입니다..
:
: 인터넷을 뒤져보니,
https://forums.embarcadero.com/thread.jspa?threadID=47678
:
: controls.pas 파일에서 Atom 처리 부분을 수정하면 된다고 하더라구요.
:
: 그래서, 코드를 수정하고 돌려보았는데,
:
: controls.pas가 빌드가 되지는 않더라구요.
:
: 물론 수정 코드도 적용되지 않았구요.
:
: 이거 어떻게 적용할 수 있나요? ㅠ_ㅜ
RAD XE2(Update3) 기준으로 말씀 드립니다.
만약 DLL 파일을 빌드 할 때... 링크 옵션에서 RunTime Package를 사용하지 않도록 지정해준다면
RAD XE2 가 설치되어있는 디렉토리에서 Vcl.Controls.pas 소스파일을 프로젝트에 포함시켜주고
빌드를 하면 해당 파일이 빌드시에 링크되기 때문에 소스 파일을 원하는대로 수정해서 사용하면 됩니다.
그러나 DLL 파일을 빌드할 때 ... 링크 옵션에서 RunTime Package를 사용하도록 지정한다면
이미 바이너리로 미리 빌드되어 설치되어있는 패키지 파일을 참조하기 때문에 위와 같은 방법은
사용할 수 없고, 다른 방법이 필요한데... 두 가지 방법이 가능하겠네요.
첫번째 방법...
vcl160.bpl 파일을 사용자가 개입해서 직접 재구성해야 하는데, 이건 vcl 라이브러리 파일들을
tlib.exe 로 덤프해서 필요한 오브젝트 파일들에 대한 목록을 알아핸 후, 역으로 패키지 파일을
컴파일 할 수 있도록 필요한 소스파일들을 재구성 해서 빌드해야 하는데 이건 손이 좀 많이 가는
부분이고요.
두번째 방법...
Run-Time Type Info 를 이용하면 실행중에 원하는 클래스의 어떤 해당하는 임의의 함수에 대한
어드레스 값을 알아 낼수 있습니다. 해당 함수의 주소를 알아낸 후 코드를 런타임 중에 후킹해서
기존의 함수를 프로그래밍 적으로 대체 해버리는 거죠.
class 메소드의 경우(C++에서는 __classmethod로 지정되어있는 함수) 컴파일러에 의해서...
EAX 레지스터에 Class Type Info를 가리키는 주소가 히든 파라미터로 생성되게 되어있기
때문에(C++ 에서는 TMetaClass) 후킹하려는 해당함수가 __classmethod 함수라면 히든파라미터를
주의해 줘야겠죠.