이거뭐 모르는거 하나 있었다가 역적될기세네
cubase 님이 쓰신 글 :
: 컴파일 잘되고 동작도 제대로 되네요. 빌더님 정말 감사합니다. 그런데 델파이 컨설턴트 한다는 분은
: 잘 알지도 못하면서 답변을 왜 저렇게 하시는지. 델파이 컨설턴트??? 컨설턴트는 말만 잘하면 된다고
: 알고있기는 하지만 흐~ 다시 한번 감사드립니다 빌더님.
:
:
:
:
: 빌더(TWx) 님이 쓰신 글 :
: : 델파이.컨설턴트 님이 쓰신 글 :
: : : 델파이 컨설턴트로 일하고 있는 사람입니다.
: : : System.pas는 델파이와 C++빌더에서 심장 역할을 하는 중요한 코드입니다.
: : : 개발자들이 참고하라고 소스만 공개해주고 있을 뿐입니다.
: : : System.pas는 엠베카데로 내부 엔지니어들 아니면 컴파일 하는게 불가능 합니다.
: : :
: : :
: : :
: : :
: : : cubase 님이 쓰신 글 :
: : : : 안녕하세요
: : : : RAD XE2 사용하고 있습니다. System.pas 소스 수정해서 컴파일해야 하는데 별짓 다해봐도 컴파일이 안되네요
: : : :
: : : : 처음에 System.pas 파일명으로 컴파일이 안되길래 파일명을 _System.pas로 하니까 컴파일이 되는듯 하더니
: : : : 이번에는 이런 에러가 뜹니다
: : : :
: : : : [DCC Error] _System.pas(312): E2572 RTTI visibility set constant expression of type System.TRttiVisibility
: : : : expected.
: : : :
: : : : 큐베이스라는 음악제작 프로그램에서 플럭인 만들려고 하는데 DSP 연산 처리에 문제가 있어서 찾아 보니까
: : : : C++빌더에서 사용할 땐 코프로세서를 패치해줘야 한다고 하더군요.
: : : :
: : : : System.pas 라인넘버 31830 부분의 코드를
: : : :
: : : : [수정전]
: : : :
: : : : _InitializeControlWord;
: : : : _FpuInit();
: : : :
: : : : TTextRec(Input).Mode := fmClosed;
: : : : TTextRec(Output).Mode := fmClosed;
: : : : TTextRec(ErrOutput).Mode := fmClosed;
: : : :
: : : :
: : : : [수정후]
: : : :
: : : : _InitializeControlWord;
: : : : _FpuInit();
: : : :
: : : : int patch = 0x33f;
: : : :
: : : : OutputDebugString('co-processor patched...');
: : : : asm
: : : : {
: : : : FNINIT
: : : : FWAIT
: : : : FLDCW [patch]
: : : : }
: : : : TTextRec(Input).Mode := fmClosed;
: : : : TTextRec(Output).Mode := fmClosed;
: : : : TTextRec(ErrOutput).Mode := fmClosed;
: : : :
: : : : 저렇게 수정해서 컴파일 해야하는데 방법이 없을까요. 컴파일해서 VCL 라이브러리 파일을 바꿔서 사용해야
: : : : 하는데 도움 좀 부탁드리겠습니다. OutputDebugString은 System.pas가 패치가 됐나 확인차 필요합니다.
: : : : 고수님님들 도와주세요.
: :
: :
: :
: :
: :
: :
: : 답변:
: :
: :
: : 프로그래밍 처음 시작하는 학생 같았으면 굳이 이런 말 할 필요도 없었을 텐데, 한마디 안할 수가 없네요.
: : 데놓고 자칭 "델파이.컨설턴트"라고 하는 사람이 그렇게 근거도 없는 글을 함부로 올려도 되는 겁니까.
: : 누가 컴파일이 불가능하다고 합디까. --;
: :
: :
: : : :
: : : : _InitializeControlWord;
: : : : _FpuInit();
: : : :
: : : : int patch = 0x33f;
: : : :
: : : : OutputDebugString('co-processor patched...');
: : : : asm
: : : : {
: : : : FNINIT
: : : : FWAIT
: : : : FLDCW [patch]
: : : : }
: : : : TTextRec(Input).Mode := fmClosed;
: : : : TTextRec(Output).Mode := fmClosed;
: : : : TTextRec(ErrOutput).Mode := fmClosed;
: :
: : 위와 같이 수정하면 Co-Processor를 초기화 해버려서 RTL 프레임웍을 사용하는 데 문제가 발생할 수 있습니다.
: : (Default8087CW 라는 내부 변수가 사용되고 있음) 그래서 소스를 아래와 같은 식으로 수정해서 컴파일 했으니까
: : 참고하세요.
: :
: :
: : <System.pas> 수정된 소스
: :
: : _InitializeControlWord;
: : _FpuInit();
: :
: : OutputDebugString('=====================================');
: : OutputDebugString(' [PATCH] : coprocessor patched....');
: : OutputDebugString('=====================================');
: :
: : // Patch CoProcessor
: : asm
: : mov ax, Default8087CW
: : or ax, $33F
: : mov Default8087CW, ax
: : fldcw Default8087CW
: : fwait
: : end;
: :
: :
: : TTextRec(Input).Mode := fmClosed;
: : TTextRec(Output).Mode := fmClosed;
: : TTextRec(ErrOutput).Mode := fmClosed;
: :
: :
: : ...
: :
: : Embarcadero 에서 제공하는 라이브러리를 교체해 버릴 수도 있지만, 오히려 필요할 때만 링크해서 사용할 수 있게
: : obj 파일로 관리하는게 더 편리할 겁니다. 소스를 수정해서 컴파일한 System.obj 파일을 첨부하니까 필요한 프로젝트
: : 에 다음과 같이 링크만 걸어주면 됩니다.
: :
: :
: :
: : ...
: :
: : 컴파일해서 실행하면 RAD XE2 IDE 개발환경의 Event Log에 아래와 같은 식으로 OutputDebugString 메세지가
: : 출력되는 것을 확인할 수 있을 겁니다.
: :
: :
: :
: : ...
: :
: : 질문에 언급되어있는 내용으로 봐선 Runtime Package대신 static 라이브러리를 사용하는 것 같은데. 맞죠.
: : Dynamic RTL, Delphi RTL, Runtime Package 옵션 사용하지 말고 컴파일 하세요.
: :
: : ...