프로그래밍/델파이 80

엑세스 바이얼레이션(Access Violation) 주소로 오류가 발생한 소스상의 위치 찾기

서론 델파이로 만든 프로그램을 일반 사용자들에게 배포할 때는 기본적으로 불필요한 디버깅 정보를 모두 제거하고 배포를 하게 됩니다. 따라서 유레카로그(EurekaLog) 등의 오류 추적 모듈이 없기 때문에, 다음과 같은 오류창을 만났을 경우 어디서 오류가 발생하였는지 알 수가 없어서 문제 해결이 어렵습니다. 사용자와 동일한 동작을 통한 재현으로 동일한 오류가 발생한다면 다행히도 쉽게 오류를 추적해서 문제를 해결할 수 있지만, 재현이 불가능하고 해당 사용자에게서만 위와 같은 오류창이 발생하게 되면 정말 난감하게 됩니다. 위와 같은 엑세스 바이얼레이션(Access Violation)창이 나타난 경우, 배포한 프로그램에 map 파일이 있다면 그 주소를 가지고 오류가 발생한 부분을 찾을 수 있습니다. 그 방법에 ..

CreateMutex를 이용한 다중 실행 방지 방법.

서론 기존에 다중 실행을 방지하기 위해서 FindWindow를 이용하고 있었습니다. 하지만 문제는 타이틀이 변경되거나 하게 되면, 제대로 처리가 안되어서 CreateMutex를 이용하였었습니다. 그런데, 윈도우 세션에 상관없이 어떤 세션에서든 PC에서 서비스처럼 단 1번만 실행되어야만 하는 경우에 제대로 적용하지 못하였었습니다. 예를 들면, 현재 세션에서 프로그램을 실행시켜 놓고, 사용자 전환을 통하여 다른 세션으로 로그인 하여 동일한 프로그램을 실행하는 것이 가능하다는데 문제가 있었습니다. FindWindow로는 당연히 해결이 되지 않았고, 우연하게 알게된 ToolAPI를 사용해 보았지만, 될때도 있고 안될때도 있었습니다. 본 문서에서는 CreateMutex를 이용하여 세션에 상관없이 PC에서 단 1개..

잘동작하던 ActiveX가 기능 추가후, 먹통이 되어 버린 경험.

서론 기존에 잘 사용하던 ActiveX에 몇 가지 속성 및 기능을 추가할 일이 있어서 관련 작업을 하던 중에 좀 황당한 사건을 겪었습니다. 속성 및 기능 추가를 위하여 기존 프로젝트에 몇몇 새로운 유닛을 추가하고, 새로운 기능을 구현한 직후 테스트에서 잘 동작을 하였었습니다. 그러나 버그 수정을 위하여 몇번 빌드를 하고 테스트를 하던 과정중에 이상한 현상을 경험하게 되었습니다. 정말 특이하게도 그런대로 동작하던 ActiveX가 점차 꼬여 가더니, 결국에는 Type Library에서 속성을 수정하거나, 심지어 수정된 소스를 저장하려고만 하여도 델파이 IDE가 아무런 응답을 하지 않게 되버리는 문제가 발생하기 시작하였습니다. 더군다나 델파이를 재시작하고, 재부팅을 하여 겨우 ocx 빌드를 성공하여 테스트를 ..

TShockwaveFlash 크기 조정(Resize)

서론 TShockwaveFlash 컴포넌트를 이용하여 델파이 폼 내부에서 동적으로 플래쉬를 표시하고자 할 때, 동적으로 생성된 플래쉬 컴포넌트내에서 전체 플래쉬 영역에 그려지지 않고, 일부 영역에서만 그려지는 문제가 발견되었습니다. 마우스로 플래쉬 컨트롤 영역을 선택해 주면 플래쉬 영역 전체에 맞게 확대되어 올바로 표시가 되었습니다. 또한, 창의 크기를 조정하면 플래쉬 창의 크기도 변경되도록 하였으나, 플래쉬 컨트롤에서 표시되는 swf 에는 영향을 미치지 않는 문제가 있었습니다. 본 글에서는 이러한 플래쉬가 제대로 전체 플래쉬 창 영역에 그려지지 않는 문제점을 해결하는 방법에 대해서 알아보도록 하겠습니다. 해결 방법 아래 Resize TShockwaveFlash control in Delphi 자료를 참..

2010에서 Zeos 7.0 설치 및 MySQL 5.1.4와 테스트기

SourceForge에서 Zeos 7.0 Beta 버전을 받아서 설치하는데, Bpl 파일을 못찾는 오류가 계속 나서 왜그런가 봤더니, 프로젝트 옵션의 output directory가 각 패키지마다 달라서 발생한 문제였습니다. 모두 Build 디렉토리로 맞추거나, 아니면 모두 기본 디렉토리로 생성되도록 하면 됩니다. 오랫만에 Zeos로 MySQL DB 연동을 하는터라 좀 헤맸네요. 간단하게 ZConnection을 두고 테스트용 MySQL 정보를 입력하고, ZQuery로 간단한 SELECT 쿼리를 수행하는데 자꾸 한글이 깨지는 것이었습니다. 삽입 및 갱신도 한글이 깨지는 현상이 발생하였습니다. MySQL쪽 문자셋(charset)을 확인해 봤더니, 운영 시스템만 "UTF-8"이고 모든 DB 및 클라이언트 연결..

Wininet Component Suite에서 User Agent를 바꾸어 통신하기.

서론 Wininet Component Suite의 TInetHttp 컴포넌트를 그대로 사용하여 웹서버와 통신을 하게되면 웹 서버의 User Agent 부분에 "WinInetComponentSuite"로 남게 됩니다. 물론 TIdHTTP를 사용하면 "Indy"라고 User Agent가 남게 됩니다. Indy에서는 User Agent가 변경이 가능하지만, TInetHttp는 직접적으로 변경할 수 있는 속성을 제공하지 않습니다. User Agent 변경하기 TInetHttp에서는 직접적으로 User Agent를 변경할 수 있는 속성을 제공하지 않기 때문에, 다음과 같이 AddRequestHeader 메소드를 이용하여 User Agent를 변경할 수 있습니다. with INetHttp do try INetUrl..

Wininet Component Suite에서 https로 통신하기

서론 앞서 "" 글에서 Wininet Component Suite를 사용하는 방법을 간단하게 살펴보았습니다. 일반적인 HTTP를 통한 통신(GET / POST)이 잘 동작합니다. 본 글에서는 HTTPS를 이용하여 암호화된 안전한 통신 방법에 대해서 살펴 보겠습니다. 암호화를 위한 HTTPS 사용하기 HTTPS 암호화 통신을 위해서 일반적인 HTTP 방식으로 호출하는 것과 거의 동일합니다. 단지 여기에 포트와 암호화 플래그만 더 설정하면 HTTPS 암호화를 통하여 좀더 안전한 통신이 가능합니다. with INetHttp do try INetUrl.Url := EditUrl.Text; ServerName := INetUrl.HostName; Port := INetUrl.Port; // 포트 할당 if ('h..

Graphics32 델파이 2010에 설치하기

델파이에서 이미지를 자주 다룬다면 Graphics32 패키지를 대부분 사용하고 있을 겁니다. 하지만, 2007년 3월 이후 더 이상의 버전 업그레이드가 없어 BDS 2010을 제대로 지원하지 않고 있습니다. 2010에 완벽하게 포팅된 버전을 기다리며 일단은 현재까지 나온 1.8.3 패키지를 약간 수정하여 2010에서 사용하는 방법에 대하여 설명하고자 합니다. 1.8.3 버전에서 BDS 2006 설치까지는 패키지 파일이 지원되어 바로 GR32 컴포넌트들의 등록이 가능합니다. 2010에서 사용하기 위해서는 약간의 정이 필요한데 수정이 필요한 부분은 아래와 같습니다. 먼저 GR32_BDS2006.dpk 파일을 복사하여 GR32_BDS2010.dpk 파일을 하나 만듭니다. 그리고 아래 부분을 수정합니다. GR3..

성능비교(Round, Trunc, Floor, MulDiv, 정수연산)

화면에 표시하거나, 프린터에 인쇄를 할 경우 해상도에 따른 좌표 계산을 자주하게 됩니다. 좌표 계산을 위하여 위 정수연산을 하거나, Round, Trunc, Floor, MulDiv 등의 함수를 사용하게 됩니다. 그럼 이 방법들 중에서 가장 성능이 뛰어난 것은 무엇인지 갑자기 궁금하여 다음과 같이 간단한 소스로 성능을 실험해 보았습니다. var i, nX, nOldX: integer; dwStart, dwEnd: DWORD; begin nOldX := 50; dwStart := GetTickCount; for i := 0 to 10000000 do nX := Trunc(nOldX * 72. / 25.4); dwEnd := GetTickCount; Memo2.Lines.Add('Trunc(nOldX * 7..

AQTime을 이용한 프로파일링을 위한 델파이 7 프로젝트 옵션 설정 및 빌드

델파이 프로그램의 성능을 최적화하기 위한 프로파일링 도구로 자주 애용되는 AQTime으로 델파이 7 프로그램을 프로파일링하기 위한 컴파일 설정 방법에 대하여 알아 보겠습니다. AQTime에서 메소드별 혹은 라인별 프로파일링을 하려면, 디버깅 정보가 있어야 합니다. 이를 위하여 아래와 같이 Project Options에서 설정값을 변경해 주어야 디버깅 정보가 로딩되어 올바른 프로파일링을 할 수 있습니다. 아래 Project Options 설정 옵션들 중에서 붉은색으로 표시한 사항들은 반드시 설정해 주셔야 합니다. 꼭 런타임 패키지(runtime package)들을 사용하실 경우에는 AQTime에서 해당 런타임 패키지를 수동으로 추가해 주어야 합니다. 프로젝트 옵션을 모두 위와 같이 설정한 이후에는 프로젝트..

728x90