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

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

 

 

윈도우 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 12881
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 12154
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 14634
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 19967
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 21446
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17157
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 37175
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 172614
» 3가지 API 이야기: VCL에서 WinAPI, COM&ShellAPI, WinRT 활용하기 관리자 2019.09.18 634
9 CEF4Delphi(크로미움 기반 웹브라우저) 컴포넌트 설치 및 실행하기 험프리 2019.01.14 3436
8 OAuth 2.0 연동 - 카카오 API(카카오톡 프로필) [9] 험프리 2018.12.26 9415
7 [FMX] 안드로이드 패키지 버전 구하기 튜토리얼 file 험프리 2017.09.01 922
6 Tools API를 사용해 IDE를 확장할 수 있습니다. file 험프리 2017.07.20 461
5 [REST API][실습] 데이터셋 기반 REST API 개발하기 험프리 2017.06.13 2099
4 [발표자료] REST API 웹서비스 연동 관리자 2017.05.29 1438
3 [REST API][실습] REST API 클라이언트 개발하기(REST Client 이용) [2] 험프리 2017.05.23 6794
2 [REST API][실습] REST API 서버 개발하기(엔드포인트 구현, RAD 서버 이용) [5] 험프리 2017.05.23 4039
1 [REST API] REST API 이해하기 험프리 2017.05.23 14967