kkuzil.own@gmail.com

Posted
Filed under Development/Delphi
EAbort
메시지 상자를 출력하지 않고 현재의 코드 블록을 취소할때 발생


EOutOfMemory
애플리케이션을 실행하기 위한 메모리 부족시 발생


EAccessViolation
메모리가 할당되지 않은 상황에서 연산을 하거나
메모리 할당 후 해제하지 않고 다시 할당할때 발생


EstackOverflow
현재의 스레드 수행이 더이상 메모리에 할당될 수 없을 경우


ElnOutError
파일 입출력시에 에러가 나는 경우


ElntError
정수 연산시 발생하는 에러


EDeivByZero
정수를 0으로 나누었을 때 발생


ERangeError
정수형의 범위를 벗어나는 값이 할당 됐을 경우


ElnvalidPointer
부적절한 포인터 연산이 수행됐을 경우


ElnvalidCast
as연산자를 이용하여 부적절한 형변환이 발생했을 경우


EConvertError
strtoint 나 inttostr등의 형변환 함수 에러


EControlC
콘솔모드 애플리케이션의 경우에서 발생
ctrl+c가 눌렀을때 발생한다.


EPropReadOnly
OLE 오토매이션이 수행되는 동안 읽기 전용 프로퍼티에 쓰기할 경우 발생


EPropWriteOnly
OLE 오토메이션이 수행되는 동안 쓰기 전용 프로퍼티에 읽기를 할경우 발생


EExternalException
그외 어떠한 코드에도 적용되지 않는 경우 나타나는 에러들


EStreamError
LoadFromStream으로 stream을 읽을때 발생


EFCreateError
파일이 생성될때 예외 상황


EFOpenError 파일이 열리지 않을때 발생


EResNotFound
ReadConponentRes메소드가 리소스파일에서 특정한 리소스를 발견하지 못했을때 발생


EListError
리스트 문자열 문자열 리스트에서 발생 리스트의 범위를 벗어났을 경우


EStringListError
문자열 리스트 지정 범위를 초과했을때 발생


EMathError
실수 연산시 발생하는 예외 상황


ElnvalidOp
실수 연산시 정의되지 않은 다양한 예외 상황이 발생하였을때


EZeroDivide
실수를 0으로 나누었을 때 발생하는 예외 상황


EOverflow
실수연산으로 레지스터에 할당된 값보다 큰값이 할당되었을때


EUnderflow
실수연산으로 실수로 나타내기에 너무 작은값이 할당되었을 때


EPrinter
프린터 인쇄시 발생하는 예외 상황


EMenuError
애플리케이션에서 사용하는 메뉴에서 애러가 발생했을때 나타난다


ElnvalidOperation
비윈도우 컴포넌트가 윈도우 핸들을 필요로 하는 연산을 수행했을때 발생


ElnvalidGraphic
부적절한 그래픽 파일을 로드했을때 발생


ElnvalidGraphicOperation
그래픽상에서 부적절한 연산이 수행될때 발생하는 예외 상황

출처 : 델마당[slypuma님 글]
2010/11/03 10:58 2010/11/03 10:58
Posted
Filed under Development/Delphi

언젠가는 쓸데가 있겠지... 훗

interface
...
...
const
  STATUS_SUCCESS                = $00000000;
  {$EXTERNALSYM STATUS_SUCCESS}

type
  NT_STATUS = LongInt;

  IO_STATUS_BLOCK = record
    case integer of
      0:
       (Status: NT_STATUS);
      1:
       (Pointer: Pointer;
        Information: ULONG); // 'Information' does not belong to the union!
  end;
  PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;

  _FILE_INTERNAL_INFORMATION = record // Information Class 6
    FileId: LARGE_INTEGER;
  end;
  FILE_INTERNAL_INFORMATION = _FILE_INTERNAL_INFORMATION;
  PFILE_INTERNAL_INFORMATION = ^FILE_INTERNAL_INFORMATION;

  _FILE_NAME_INFORMATION = record
    dwLen: DWORD;
    sFileName: array [0..0] of WideChar;
  end;
  FILE_NAME_INFORMATION = _FILE_NAME_INFORMATION;
  PFILE_NAME_INFORMATION = ^FILE_NAME_INFORMATION;

_FILE_INFORMATION_CLASS = (
    FileFiller0,
    FileDirectoryInformation,     // 1
    FileFullDirectoryInformation, // 2
    FileBothDirectoryInformation, // 3
    FileBasicInformation,         // 4  wdm
    FileStandardInformation,      // 5  wdm
    FileInternalInformation,      // 6
    FileEaInformation,            // 7
    FileAccessInformation,        // 8
    FileNameInformation,          // 9
    FileRenameInformation,        // 10
    FileLinkInformation,          // 11
    FileNamesInformation,         // 12
    FileDispositionInformation,   // 13
    FilePositionInformation,      // 14 wdm
    FileFullEaInformation,        // 15
    FileModeInformation,          // 16
    FileAlignmentInformation,     // 17
    FileAllInformation,           // 18
    FileAllocationInformation,    // 19
    FileEndOfFileInformation,     // 20 wdm
    FileAlternateNameInformation, // 21
    FileStreamInformation,        // 22
    FilePipeInformation,          // 23
    FilePipeLocalInformation,     // 24
    FilePipeRemoteInformation,    // 25
    FileMailslotQueryInformation, // 26
    FileMailslotSetInformation,   // 27
    FileCompressionInformation,   // 28
    FileObjectIdInformation,      // 29
    FileCompletionInformation,    // 30
    FileMoveClusterInformation,   // 31
    FileQuotaInformation,         // 32
    FileReparsePointInformation,  // 33
    FileNetworkOpenInformation,   // 34
    FileAttributeTagInformation,  // 35
    FileTrackingInformation,      // 36
    FileMaximumInformation);
  FILE_INFORMATION_CLASS = _FILE_INFORMATION_CLASS;
  PFILE_INFORMATION_CLASS = ^FILE_INFORMATION_CLASS;

..
..
..

implementation

..
..

procedure TDlgScanMain.sButton2Click(Sender: TObject);
var
  NtQueryInformationFile: function(FileHandle:DWORD;
                                   IoStatusBlock: PIO_STATUS_BLOCK;
                                   FileInformation: Pointer;//PFILE_INTERNAL_INFORMATION;
                                   Length:DWORD;
                                   FileInformationClass:FILE_INFORMATION_CLASS):DWORD; stdcall;
  FileName: string;
  hFile: THandle;
  io: IO_STATUS_BLOCK;
  FileInfo: FILE_INTERNAL_INFORMATION;
  Res: NT_STATUS;
  FileRecInput: TNtfsFileRecordInputBuffer;
  FileRecOutput: PNtfsFileRecordOutputBuffer;
  Read: DWORD;
  hDevice: THandle;
  VolumeDataBuff: NTFS_VOLUME_DATA_BUFFER;
  Size: DWORD;
  rec: PFileRecordHeader;
  pName: PFILE_NAME_INFORMATION;
begin
  FileName:='E:\테스트\DOC';

  NtQueryInformationFile := GetProcAddress(GetModuleHandle('ntdll.dll'), 'NtQueryInformationFile');
  if Assigned(NtQueryInformationFile)=false then
    exit;

  if FileExists(FileName) then
    hFile := CreateFile(PChar(FileName),
                        GENERIC_READ or
                        GENERIC_WRITE,
                        FILE_SHARE_READ or
                        FILE_SHARE_WRITE or
                        FILE_SHARE_DELETE,
                        nil, OPEN_EXISTING, 0, 0)
  else if DirectoryExists(FileName) then
    hFile := CreateFile(PChar(FileName),
                        GENERIC_READ or
                        GENERIC_WRITE,
                        FILE_SHARE_READ or
                        FILE_SHARE_WRITE or
                        FILE_SHARE_DELETE,
                        nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
  else ASSERT(false);

  if hFile <> INVALID_HANDLE_VALUE then
  begin
    ZeroMemory(@FileInfo, sizeof(FileInfo));
    Res := NtQueryInformationFile(hFile, @io, @FileInfo, sizeof(FileInfo), FileInternalInformation);

    if Res <> STATUS_SUCCESS then Exit;
    hDevice := CreateFile(PChar('\\.\'+FileName[1]+':'), GENERIC_READ or GENERIC_WRITE,
                        FILE_SHARE_READ or
                        FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);

    if not(DeviceIoControl(hDevice, FSCTL_GET_NTFS_VOLUME_DATA, nil, 0,
       @VolumeDataBuff, sizeof(VolumeDataBuff), Read, nil))
          then RaiseLastWin32Error();

    Size := sizeof(TNtfsFileRecordOutputBuffer) + VolumeDataBuff.BytesPerFileRecordSegment-1;
    GetMem(FileRecOutput, Size);
    ZeroMemory(FileRecOutput, Size);

    ZeroMemory(@FileRecInput, sizeof(FileRecInput));
    FileRecInput.FileReferenceNumber:=FileInfo.FileId;

    if not(DeviceIoControl(hFile,
                    FSCTL_GET_NTFS_FILE_RECORD,
                    @FileRecInput,
                    sizeof(FileRecInput),
                    FileRecOutput,
                    Size,
                    Read,
                    nil)) then
    begin
      RaiseLastWin32Error();
    end;

    rec := @FileRecOutput.FileRecordBuffer;
    sMemo1.Lines.Add(IntToStr(rec.SequenceNumber));

    FreeMem(FileRecOutput);
    CloseHandle(hDevice);
  end else
    RaiseLastWin32Error();
end;

2010/07/29 15:56 2010/07/29 15:56
Posted
Filed under Development/Delphi

출처 : http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&st=&keyword=&indx=422150&keyword1=&keyword2=&page=1

{$IFDEF VER150}
   // 델파이 7 버전에서 컴파일 되는 부분..
{$ELIF VER210}
   // 델파이2010 버전에서 컴파일 되는 부분..
{$ENDIF}


위의 코드처럼 델파이 버전에 따라서 다르게 컴파일 하고 싶을 때가 있죠..

예를들어 델파이 2009부터는 string 이 UnicodeString 이고 델파이 2007까지는 string 이 ansiString 이기 때문에
다르게 처리하게 되는 경우가 있죠..   

그때 델파이 컴파일러 버전을 알아야 하는데 그걸 정리해 봤습니다.

{$IFDEF VER80}  - Delphi 1
{$IFDEF VER90}  - Delphi 2
{$IFDEF VER100} - Delphi 3
{$IFDEF VER120} - Delphi 4
{$IFDEF VER130} - Delphi 5
{$IFDEF VER140} - Delphi 6
{$IFDEF VER150} - Delphi 7
{$IFDEF VER160} - Delphi 8
{$IFDEF VER170} - Delphi 2005
{$IFDEF VER180} - Delphi 2006
{$IFDEF VER180} - Delphi 2007
{$IFDEF VER185} - Delphi 2007
{$IFDEF VER200} - Delphi 2009
{$IFDEF VER210} - Delphi 2010


그리고 델파이 6 이상에서는 CompilerVersion 을 사용해 버전체크를 할 수 있습니다.

{$IF CompilerVersion >= 18.5}
   //델파이 2007 이상에서 컴파일 되는 소스..
{$IFEND}
아래는 델파이 컴파일러 버전입니다.
 
Delphi 2010 - 21
Delphi 2009 - 20
Delphi 2007 - 18.5
Delphi 2006 - 18
Delphi 2005 - 17
Delphi 8    - 16
Delphi 7    - 15
Delphi 6    - 14


그리고 델파이 8 이상에서는 {$IFDEF_LESS_THAN } 을 사용할 수 있으므로 아래처럼도 됩니다.

{$IFDEF_LESS_THAN VER170}
  // 델파이 8 이상에서만 사용가능한 부분.. 델파이 7이하에서는 IFDEF_LESS_THAN 인식이 안됨..
  // 델파이 8 이하에서 컴파일되는 Code..

{$END}

델파이7 이하버전은 Delphi7Minus 가 define 되어있으므로

{$IFDEF Delphi7Minus}
  // 델파이7 이하에서 컴파일 되는 부분..
{$ENDIF}

2010/07/22 14:33 2010/07/22 14:33
Posted
Filed under Development/Delphi
예전부터 brcc32.exe를 알고 있긴한데 이놈을 어따 써먹길래 만들어놨다 했더니..
결국 쓰는날이 왔다;;

기본적으로 IDE환경에서 컴파일 할때는 프로젝트에 포함된 *.rc 파일은 자동으로 *.res로 컴파일되어
바이너리에 붙게되는데.. command에서 컴파일 할때는 이게 안된다;;

*.rc만 추가된 상태에서 컴파일하면 *.res파일이 없다며 컴파일 에러를 뱉게되는데...
msbuild든 dcc32든... 특별한 옵션도 없다.
아무리 옵션을 찾고 별짓을 다 해봤는데.. 없어서 담배가 생각나는 찰나에..(안폈음)
불현듯 스치는 생각.. 리소스 컴파일.. 혹시나 이거면 될까 했는데.. 역시나 잘된다~
왜 이게 지금 생각났을까... 무식하면 여러가지 고생이다..
그래도 이것저것 막 줍고다니니깐 필요할때 지푸라기... 아니 많은 도움이 되는고만~

어쨌든..

ex) brcc32.exe sample.rc

이렇게 하면
sample.res로 컴파일된다~

그럼 해당 파일을 포함한 프로젝트를 command 컴파일 시 잘 삽입되겠지~!

보통 델파이나 빌더 \bin 디렉토리 안에 있을거다.
자세한 건 brcc32.exe /? 하면 되겠징
2010/07/12 16:43 2010/07/12 16:43
Posted
Filed under Development/Delphi

일반적으로 EurekaLog를 사용하는 프로젝트를 command build(MSBuild)할려고 할때
EurekaLog가 포함되지 않는다.

* 방법

1. EurekaLog 정보를 프로젝트에 포함시키고 싶다면 아래와 같이 빌드하여야 한다.

ex) ECC32 "Project1.dpr"

2. 이미 만들어진 바이너리에 EurekaLog 정보를 포함 시키고 싶다면

ex) ECC32 --el_alter_exe"Project1.dpr"

3. 바이너리 지정해서 EurekaLog 정보 포함

ex) ECC32 --el_alter_exe"Project1.dpr;Project1.exe"

IDE에서 빌드할때는 EurekaLog에서 알아서 PostBuild Event를 걸어줘서 2, 3번의 과정을
거치는지, 아니면 DCC32.exe 호출 시 ECC32.exe를 호출해서 빌드하는지 모르겠지만
어쨌든 IDE에서 알아서 해주는데 command에서는 작업자가 직접 처리해줘야 한다.

애초에 이렇게 동작되는지도 모르고 왜 안될까만 한참 고민하다가 개삽질 끝에 알아냈다..ㅠㅠ
(영어만 잘했어도.. 좀더 수월했을텐데...)

ex) MSBuild에서 사용예
      msbuild "Project1.dproj"
      ECC32 --el_alter_exe"Project1.dproj;Project1.exe(생략가능, 생략하면 현재 저장된 OutDir참조)"

이렇게 하면 command 빌드 후 EurekaLog가 포함된 바이너리를 사용할 수 있게된다.



ECC32

ECC32.exe is the command line compiler that EurekaLog uses. and replaces DCC32.exe which is the normal CodeGear compiler. For C++ Builder the EurekaLog compiler is called EMAKE.exe and this article applies to both. When ECC32 is called it will compile your project and then add the EurekaLog debug information to the application. Any parameters you pass to ECC32 are passed onto DCC32 as in a normal compilation. So ECC32 can be used just like DCC32 and you can find plenty of information on these standard parameters in the Delphi help file.

ECC32 정보 : http://blog.eurekalog.com/compiling-from-the-command-line/

2010/07/07 14:06 2010/07/07 14:06