흐르는 시간의 블로그...

델파이에서 TJsonObject를 사용할때 Access Violation 발생하는 경우에 대한 내용이다.


http://stackoverflow.com/questions/24815625/parsing-valid-json-with-tjsonobject-using-embarcadero-code-example-fails-with-ex



현재 Access Violation이 계속해서 발생하고 있다.

문제는 JSON 이슈인지 HTTP 문제인지 확인되지 않는다.


이후 더 진행해서 정리한다.


보통 잘못된 주소를 참고하거나 해당 주소에 데이터를 쓰려고 하면 Access Violation이 발생한다.

이런 경우 아래와 같은 에러가 뜬다.

 Access violation at address 0044EBA9 in module 'Project1.exe' read of address 05FF5E0FF


이에 대한 해결책으로 찾은 링크는 아래와 같다.

http://egloos.zum.com/indes/v/1908481


내용을 보면 Delphi 컴파일시 Map 파일을 Detailed로 설정하여 맵 파일을 생성하고

에러에서 나타난 에러의 주소를 실제 소스와 일치 시키는 것이다.


이 주소 값에서 HInstance인 $00400000를 뺍니다.
그리고 PE포맷의 헤더등 불필요한 앞부분 사이즈인 $1000 도 뺍니다.

...

여전히 오늘도 코딩중에 요구사항이 발생 했다.


"0시"에 DB에서 고객정보를 읽어 초기화 해야한다.

문제는 해당 시각에 메모리에서 고객정보를 읽어가는 쓰레드가 존재할 가능성이 있다.(매우 미미하지만)

어쨋든 그 언젠가라도 매우 적은 확률이라도 발생할 수 있기 때문에 문제를 방어해야 한다.


가장 좋은 방안은 RWL (Reader Writer Lock)이다.

읽을때는 서로 lock을 걸지 않고 쓸때는 서로 Lock을 걸게 하는 방식이다.


TMultiReadExclusiveWriteSynchronizer 를 사용한다.

자료는 "TMultiReadExclusiveWriteSynchronizer 를 아시나요?" 에서 얻었다.


델파이상 소스를 보니 Event를 활용하는 것으로 보인다.

이벤트 객체는 활용에 따라 다양하게 운용할 수 있어 이런 경우에 좋긴 할듯 하다.


우쨋건 델파이로 AP를 개발하는 이번건은 마무리로 향해 가고 있다.

...


  • 기존 버전의 Unidac이 Oracle10G에서 ParamBy가 정상적으로 작동하지 않았다
  • adhoc 쿼리는 정상 작동하지만 ParamBy로 입력한 문자열들은 모두 제한 범위를 넘쳤다
  • AsString인 경우 6Byte 짜리가 14Byte로 인식했다
  • AsAnsiString인 경우 6Byte 짜리가 7Byte로 인식했다
  • 오라클에서 범위를 넘어 갔다는 오류를 발생 시켰다
  • UniDac 6.0.2 Trial 버전을 적용하여 테스트한 결과 정상 작동하였다
  • Trial 버전인 경우 네개의 bpl을 실행 디렉토리에 넣어줘야 했다(unidac 에서 요구하는 bpl이 더 있으면 더 넣어야 한다)
  • rtl150.bpl, dbrtl150.bpl, dac150.bpl, unidac150.bpl