아래 내용은 마르코칸투가 직접 진행했던 온라인 세미나의 내용을 간략하게 정리한 글 입니다.

보다 자세한 내용은 다음 링크를 참고하시기 바랍니다.

 

 

윈도우 API의 흐름

 

운영체제에서 제공해왔던 다양한 API들을 시간 흐름에 따라 정리하자면 다음과 같습니다:

 

중요한 점은 위와 같은 세가지 유형 - API, COM, WinRT - 은 모두 C/C++로 작성되었으며 라이브러리에서 네이티브로 컴파일된다는 것입니다. 이는 곧 델파이와 같은 네이티브 컴파일 언어가 API들과 직접적으로 연결될 수 있음을 의미합니다. 마샬링(marshaling) 과정이 필요가 없죠. 

 

 

 

전통적인 윈도우 API 활용하기

윈도우 API 호출은 이미 델파이에서 제공하는 변환된 해더의 함수들이 있어 굉장히 간단합니다. 그리고 여러 방법으로 호출할 수 있습니다.

 

 

예를 들어, MessageBox를 호출한다고 하면, Winapi.Windows 유닛에는 아래와 같이 선언되어 있습니다:

function MessageBox(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall;

 

그리고, 그것은 시스템 DLL의 외부 함수로 선언됩니다.

function MessageBox; external user32 name 'MessageBoxW';

 

user32는 다음과 같이 선언:

const user32 = 'user32.dll';

 

일반적인 함수를 호출할 때 처럼 바로 호출할 수도 있습니다:

procedure TFormCallAPI.btnStandardClick(Sender: TObject);
begin
  MessageBox (0, 'Some text here', 'Caption', MB_OK);
end;

 

 

이렇게 하면, 프로그램이 시작되고 라이브러리가 로드되는 순간에 DLL의 익스포트 테이블 항목과 일치하는 임포트 테이블에 항목이 생성됩니다. 즉, 실행과 동시에 연결(linking)되는 것입니다. 실행하고자 하는 시점에 라이브러리를 로드하고 기능에 바인딩할 수도 있습니다.

 

이 때는 다음과 같은 선행 절차가 필요합니다:

type TMessageBoxCall = function (hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall;

 

 

그리고 다음의 코드를 작성하면 됩니다:

 

 

 

로딩을 지연시킬 수도 있습니다. 이 경우 선언 후 딜레이 키워드를 사용해야 합니다.

예를 들어, 최신 API들을 추가하면,

function WindowFromPhysicalPoint; external user32 name 'WindowFromPhysicalPoint' delayed;

 

 

코드를 작성할 때, 변경할 필요없이 표준 호출 방법대로 작성하면 됩니다. 

 

if CheckWin32Version (6, 0) then
  hwnd1 := WindowFromPhysicalPoint (aPoint);

 

 

전체 데모는 다음 링크를 참고하세요:

 

 

 

COM & Shell 인터페이스 활용하기

 

COM을 활용하는 것은 수준급의 영역이지만, 델파이에서는 매우 간단합니다. COM이 예전만큼 많이 사용되지 않더라도, 여전히 윈도우 Shell과 데스크탑을 활용하는 분야에서는 가장 기본적인 방식입니다.

 

Winapi.ShellObj 유닛을 열면 윈도우 Shell 용 수많은 COM 인터페이스 선언들을 확인할 수 있습니다. 그 중 일부는 아래를 통해서도 확인할 수 있습니다 - 유닛 인터페이스 부분은 무료 14,000줄이네요!

 

 

데모 소스코드를 통해 Shell API를 심층적으로 다룰 수 있는 컴포넌트인 TJumpList 활용 방법을 알아볼 수 있습니다.

 

 

 

WinRT 활용하기

 

WinRT는 네이티브 라이브러리로,  COM과 비교자면 시스템과 메모리 관리 모델 유형은 다릅니다. 하지만 바이너리 인터페이스 (그리고 VTable) 모델을 공유하고 있습니다. 그래서 WinRT 인터페이스는 델파이 인터페이스와 자연스럽게 맵핑할 수 있습니다.

 

WinRT 인터페이스는 델파이 선언에 맵핑하면 다음과 같은 형태로 보여집니다:

 

 

 

이 시스템은 인스턴스를 생성하는데 사용되는 IToastNotificationFactory를 정의하고 있으며, 고유한 문자열을 표시해줍니다 - 레지스트리와 GUID들 사용을 대체 - 일명 'Windows.UI.Notification.ToastNotification'입니다. 델파이는 간편하게 사용할 수 있는 클래스 TToastNotification을 다음과 같이 활용할 수 있습니다:

 

 

 

윈도우 10에서 알림을 표시하는데 필요한 핵심 코드입니다. 데모는 다음 링크를 참고하세요 (낮은 레벨의 WinRT API 버전과 사용하기 쉬운 컴포넌트 기반 예제 모두 제공):

 

 

결론

 

보다 많은 정보는 아래 정리한 링크를 통해 확인할 수 있습니다. 위의 내용 뿐 아니라 VCL에서 핵심 API을 지속 확장 지원하는 방법을 설명한 데모도 확인할 수 있습니다. 

 

 

 

 

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 14415
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13054
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15564
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21089
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22320
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17972
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38258
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173770
42 BLOB 컬럼에 (이미지 등의)데이터 읽고 쓰기 험프리 2016.08.01 6074
41 델파이에서 사용하는 각 Stream(스트림) 정리 김원경 2017.01.04 6004
40 안드로이드 개발환경 추가 조치방법 - RAD Studio에서 SDK 설정 Humphery 2015.10.01 5534
39 OutputDebugString 함수로 디버그로그를 출력할 수 있습니다. file 험프리 2016.02.16 4223
38 데이터스냅에서 제공하는 JSON 포맷 데이터 사용(분석)하기 [1] file Humphery 2015.07.20 3752
37 [추가자료] 안드로이드 개발환경 추가 조치방법 - 수동 SDK Tools 업데이트 file Humphery 2015.10.01 3039
36 델파이 개체를 메모리에서 해제할 때 Free와 FreeAndNil의 차이점 김원경 2017.02.01 2392
35 패키지 개발방식과 DLL개발방식의 차이와 장단점 김원경 2018.05.02 2017
34 퀵레포트(Quick Report)에 사진 출력하기 험프리 2016.08.01 1849
33 TCategoryButtons 동적 생성하고, TButtonItem 클릭 이벤트 연결하기 file 험프리 2016.03.23 1348
32 제너릭(Generic)과 제너릭을 사용한 예제(제너릭 콜렉션 등) file 김원경 2020.01.15 1198
31 델파이 문서화 도구 참고링크 Humphery 2015.09.11 1150
30 BPL(패키지)를 이용해 프로그램 모듈화 하기 험프리 2015.11.24 1122
29 RAD Studio IDE에서 SVN 사용하기 + TortoiseSVN 사용하기 험프리 2016.02.29 1110
28 [추가된 문법] DLL 정적 호출 시 지연 호출(Delayed)-델파이 2010 추가 김원경 2016.12.27 1090
27 [개발자 Tip] 모바일 앱 개발 시 시간 낭비를 줄이는 Tip #1: 테스트하기 위해 기다리는 시간을 줄인다. 관리자 2016.12.26 862
26 [코드레이지11] SVN, DUnitX과 Jenkins 서버로 자동 빌드/테스트 환경 구성 - Craig Chapman 험프리 2016.11.22 819
25 [동영상] 앱테더링 데이터 암호화/복호화 방법 file 험프리 2016.11.01 797
» 3가지 API 이야기: VCL에서 WinAPI, COM&ShellAPI, WinRT 활용하기 관리자 2019.09.18 709
23 MidaConverter로 VCL 프로젝트를 FMX 프로젝트로 변환할 수 있습니다. Humphery 2015.06.04 706