0x005374A0 에서 access-violation이 난것이라면
실제 AccessViolation- Address = 0x005374A0 - 0x00400000 - 0x00001000 = 0x001364A0 이 되겠네요
BCB는 map파일에 모든 line번호가 나오지 않으므로
하안인님께서 유추하신것처럼 Controls의 ScreenToClient 코드가 가장 유력할것 같습니다.
0001:00136490 __fastcall Controls::TControl::ScreenToClient(const Types::TPoint&)
AccessViolation 주소인 0x001364A0 과 함수주소인 0x00136490 를 비교해보면 딱 0x10 (16Byte)차이가 나네요
Controls 유닛의 TControl.ScreenToClient 코드는 다음과 같습니다.
function TControl.ScreenToClient(const Point: TPoint): TPoint;
var
Origin: TPoint;
begin
Origin := ClientOrigin;
Result.X := Point.X - Origin.X;
Result.Y := Point.Y - Origin.Y;
end;
함수 시작에서 0x10 byte떨어졌다면
Origin := ClientOrigin; 이부분에서 access-Violation이 발생한것 같습니다.
그런데 왜 저기서 access-violation이 발생할까요?
vcl소스에 문제가 있어서 그런것일까요?
다음과 같이 코딩하면 위와 똑같은 부분에서 accessviolation이 발생합니다.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TPoint pt;
TControl *ctrl=NULL;
pt=ctrl->ScreenToClient(pt);
}
//---------------------------------------------------------------------------
예외가 발생하는 시점이
ctrl->ScreenToClient(pt); 부분이 아니라
TControl.ScreenToClient 부분이라는 것입니다.
즉 NULL 객체의 함수를 호출해도 , 호출부분에서 예외가 발생하지 않고
함수내부에서 객체의 멤버변수에 접근하려고 할때 발생합니다.
객체가 존재하지 않아도 함수의 코드는 존재하니까요..
반대로 함수 내부에서 객체의 멤버변수(또는 property등)에 대한 접근이 없이
단순 계산만해서 return해준다면
객체를 생성하지 않아도 예외가 발생하지 않죠. 다음 코드와 같이 ..
class TMyClass: TObject
{
public:
int GetSum(int a,int b)
{
return a+b;
}
};
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TMyClass *cls=NULL;
int sum=cls->GetSum(10,4); //여기서 전혀 예외가 발생하지 않습니다.
ShowMessage(IntToStr(sum));
}
//---------------------------------------------------------------------------
어딘가에서 객체를 free 또는 delete한 Control의 함수를 호출한것 같네요
ScreenToClient를 호출하는 부분을 전부 한번 살펴봐 보세요..
그럼...
하안인 님이 쓰신 글 :
: Access violation at address 005374A0 in module 'aa.exe'
: read of address 0126a028.
:
: 이란 메시지를 받아서 map파일을 만들어서 map에 있는 내용을 보니
:
:
: 0001:001363AC __fastcall Controls::TControl::SetClientHeight(int)
: 0001:001363D4 __fastcall Controls::TControl::GetClientOrigin()
: 0001:00136464 __fastcall Controls::TControl::ClientToScreen(const Types::TPoint&)
: 0001:00136490 __fastcall Controls::TControl::ScreenToClient(const Types::TPoint&) --- 이부분에서 걸리는것 같은데 요.
: 0001:001364BC __fastcall Controls::TControl::SendCancelMode(Controls::TControl *)
: 0001:001364EC __fastcall Controls::TControl::SendDockNotification(unsigned int, int, int)
: 0001:00136558 __fastcall Controls::TControl::Changed()
:
:
: 위의 부분에서 걸리는 것같은데 이부분이 어디 부분인지 모르겠습니다.
:
: 어떻게 찾아야 하는지요.