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

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

 

 

윈도우 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 14387
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13023
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15532
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21064
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22297
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17933
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38228
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173741
1043 데브기어 컴포넌트 컨버터 원리와 구조 설명 험프리 2019.10.11 976
1042 엔터프라이즈 커넥터로 VCL 애플리케이션에서 '구글 시트' 데이터 조회 및 편집하기 험프리 2019.10.04 573
1041 엔터프라이즈 커넥터 설치하기 file 험프리 2019.10.01 648
1040 엔터프라이즈 커넥터로 'VCL 애플리케이션에서 엑셀 데이터 가져오기&편집하기' file 김원경 2019.09.27 946
1039 이 달의 기술자료 - 2019년 10월 험프리 2019.09.27 365
1038 [RAD서버] JSON 처리 단순화 컴포넌트 활용 - TEMSDataSetResource 험프리 2019.09.27 748
1037 [오프라인 세미나] 델파이 마이그래이션 - 실전 사례로 살펴보는 소프트웨어 현대화 전략 [1] 관리자 2019.09.27 659
1036 VCL 앱, 윈도우 10용으로 현대화하기 관리자 2019.09.25 486
1035 서베이몽키(SurveyMonkey)를 프로젝트에 연동하기 관리자 2019.09.20 699
1034 "모든" 데이터를 프로젝트에 연동하기 - 파이어닥(FireDAC) 엔터프라이즈 커넥터 활용 관리자 2019.09.19 456
» 3가지 API 이야기: VCL에서 WinAPI, COM&ShellAPI, WinRT 활용하기 관리자 2019.09.18 709
1032 리눅스용 앱에 다양한 스타일 적용하기 (FMX 스타일들을 리눅스 앱에도!) 관리자 2019.09.17 443
1031 밝은 톤의 사용자 친화적인 디자인을 찾고있다면 - 푸에르토 리코(Puerto Rico) FMX 스타일 관리자 2019.09.17 506
1030 과감하면서도 볼드한 효과를 주고 싶다면 - Ruby Graphite FMX 스타일 관리자 2019.09.17 463
1029 그라데이션이 적용된 멋진 스타일을 적용하고 싶다면 - 스텔라(Stellar) FMX 스타일 관리자 2019.09.17 558
1028 현대화 작업, 바로 지금이 골든타임입니다! 관리자 2019.09.11 385
1027 20년된 델파이 앱을 현대식 마이크로서비스 아키텍처로 전환하기 관리자 2019.09.11 1445
1026 [따라하기] Advanced 델파이 UI 작성하기 file 험프리 2019.09.11 2124
1025 [10.3 리오][업데이트 2] 델파이 리눅스 클라이언트 애플리케이션 지원 관리자 2019.09.10 399
1024 [10.3 리오][업데이트 2] 멋지게 업그레이드된 VCL 품질 관리자 2019.09.10 377