본문 바로가기

Application Programming Interface/Windows API

Win32에서 IDispatch 인터페이스를 활용한 객체 사용 방법 Win32에서 IDispatch 인터페이스를 활용한 객체 사용 방법 본 포스팅에서는 Win32 C++에서 IDispatch Interface를 사용하여 Component Object Model 객체를 생성하고 그 객체의 메서드와 프로퍼티에 접근하는 방법에 대해 알아보겠습니다. 1. IDispatch 인터페이스 IDispatch 인터페이스interface는 COM(Component Object Model) 기반 프로그래밍을 할 때 COM 서버에 등록된 각종 개체들을 연동하는 과정에서 개체들이 제공하는 각종 인스턴스instance, 프로퍼티property, 메서드method 등을 현재 작성중인 코드와 연계시켜주는 역할을 하는 인터페이스입니다. 1-1. COM/OLE의 사용 시작과 종료 IDispatch 인터.. 더보기
Win32 C++에서 Microsoft Excel 파일 다루는 방법 Win32 C++에서 Microsoft Excel 파일 다루는 방법 본 포스팅에서는 C#에서 Microsoft Excel 파일 다루는 방법(http://tapito.tistory.com/582)을 참고하여 Win32 C++ 개발 환경에서 MFC를 사용하지 않고 OLE/Automation으로 Microsoft Excel 파일을 읽고 쓰는 방법에 대해 설명합니다. 프로젝트 생성 및 초기 코드에 대해서는 설명하지 않습니다. 1단계. Microsoft Excel Application 로드하기 및 종료하기 1-1. Microsoft Excel Application 실행하기 Excel.Application형 인스턴스를 생성하는 것으로써 Microsoft Excel Application이 내부적으로 실행됩니다. Ex.. 더보기
Windows API로 콘솔(터미널) 입/출력하기 Windows API로 콘솔(터미널) 입/출력하기 본 포스팅에서는 Windows API로 콘솔(터미널)을 띄운 후 이 콘솔로부터 입력 및 출력을 수행하는 과정에 대해 다룹니다. Windows API 콘솔 입출력은 디버그를 위한 문자열 출력 및 GUI에 영향을 주지 않는 각종 테스트 등에 활용될 수 있습니다. 1 단계. 창 띄우기 콘솔 창을 띄우기에 앞서 우선, Windows API로 다음과 같이 빈 창을 띄우겠습니다. /* winmain.c */ #include TCHAR g_szClassName[] = TEXT("ConsoleWindow"); TCHAR g_szWindowName[] = TEXT("Console Window Example"); HINSTANCE g_hInstance = NULL; LRE.. 더보기
RAW형 데이터의 프린터 출력을 위한 Windows API 호출 과정 프린터로 문서를 출력하기 위한 Windows API 호출 과정은 다음과 같다. 컴퓨터에 장착된 프린터를 찾아 그 중 하나를 선택한다. (EnumPrinters) 선택한 프린터를 열어 그 핸들을 얻는다. (OpenPrinter) 1. EnumPrinters 함수를 사용하여 프린터 정보 얻기 EnumPrinters 함수는 다음과 같이 선언되어 있다. BOOL EnumPrinters( _In_ DWORD Flags, _In_ LPTSTR Name, _In_ DWORD Level, _Out_ LPBYTE pPrinterEnum, _In_ DWORD cbBuf, _Out_ LPDWORD pcbNeeded, _Out_ LPDWORD pcReturned); (참조: https://msdn.microsoft.com/k.. 더보기
Windows NT 4.0 DDK 문서 - IMEAPPS.DOC [Part 2] Windows 95 / Windows NT 어플리케이션을 위한 다국어 IME 규격 Version 1.18 마지막 수정일: 1996년 5월 21일, 번역: Luciano Jeong ImmSetCompositionString 함수에 대하여 5.1 구성요소 5.1.1 절(Clause) 절은 하나 또는 그 이상의 문자로 구성되어 있습니다. 그리고 절은 변환의 기본 단위입니다. 기본적으로 IME는 한번에 하나의 절을 변환합니다. 한 절에 있는 모든 문자는 같은 속성을 가져야 합니다. 5.1.2 대상 절(Target Clause) 대상 절은 하나의 절입니다. 그리고 이 절은 사용자가 변환합니다.(And it is the clause that the end user is converting.) 속성은 0x01 또는 .. 더보기
Windows NT 4.0 DDK 문서 - IMEAPPS.DOC [Part 1] Windows 95 / Windows NT 어플리케이션을 위한 다국어 IME 규격 Version 1.18 마지막 수정일: 1996년 5월 21일, 번역: Luciano Jeong 1 개요 극동지역 버전의 윈도우를 위해 어플리케이션이 더블바이트 문자를 생성할 수 있도록 입력 방식 편집기(Input Method Editor, 이하 IME)가 특별 프로세스로서 도입되었습니다. IME를 인식하는 어플리케이션은 IME에 특성화괸 메시지를 처리하고 IME API를 호출해야 합니다. 그러나 인터페이스를 사용해 IME와 상호작용하는 프로그램을 개발하는 프로그래머에게는 몇 가지 어려움이 있습니다. API와 메시지의 설계가 다른 윈도우 API와 너무 다릅니다. 이는 인터페이스를 이해하고 사용하는데 어려움을 야기합니다. I.. 더보기
Windows DDK 문서 IMEIMES.DOC - 11. IME File Format and Data Structures (IME 파일 포맷 및 데이터 구조) #5 (완결) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong CANDIDATEFORM CANDIDATEFORM 구조체는 IMC_GETCANDIDATEPOS and IMC_SETCANDIDATEPOS 메시지에서 사용됩니다. /* CANDIDATEFORM */ typedef tagCANDIDATEFORM { DWORD dwIndex; DWORD dwStyle; POINT ptCurrentPos; REC rcArea; } CANDIDATEFORM; CANDIDATEFORM 구조체의 멤버 dwIndex 후보 목록의 ID를 지정합니다. 0부터 시작하는 후보목록의 인덱스입니다. dwStyle CFS_CANDIDATEPOS 또는 CFS_EXCL.. 더보기
Windows DDK 문서 IMEIMES.DOC - 11. IME File Format and Data Structures (IME 파일 포맷 및 데이터 구조) #4 IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 통신을 위해 사용되는 구조체 다음은 IME 통신을 위해 사용되는 구조체에 대한 설명입니다. CANDIDATELIST CANDIDATELIST 구조체는 변환할 수 있는 후보 문자열에 대한 정보를 포함하고 있습니다. /* CANDIDATELIST */ typedef struct tagCANDIDATELIST { DWORD dwSize; // 이 구조체의 크기 DWORD dwStyle; // 후보 문자열들의 스타일 DWORD dwCount; // 변환 후보 문자열의 수 DWORD dwSelection; // 현재 선택된 후보 문자열의 순번 DWORD dwPageStart.. 더보기
Windows DDK 문서 IMEIMES.DOC - 11. IME File Format and Data Structures (IME 파일 포맷 및 데이터 구조) #3 IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 관리 구조체 아래는 IME를 관리하기 위해 사용되는 구조체들에 대해 설명하고 있습니다. IMEINFO IMEINFO 구조체는 내부적으로 IMM과 IME 인터페이스에 사용됩니다. /* IMEINFO */ typedef struct tagIMEInfo { /* The byte count of private data in an IME context. */ /* IME 컨텍스트에서 사적으로 쓰일 메모리의 바이트 수 */ DWORD dwPrivateDataSize; /* The IME property bits. See description below. */ /* IME 속성.. 더보기
Windows DDK 문서 IMEIMES.DOC - 11. IME File Format and Data Structures (IME 파일 포맷 및 데이터 구조) #2 IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 파일 포맷과 데이터 구조체 (Part 2) IMM 및 IME의 데이터 구조체 아래 구조체들은 IMM 및 IME와의 통신에 사용됩니다. IME는 이들 구조체에 직접 접근할 수 있지만 어플리케이션을 그럴 수 없습니다. INPUTCONTEXT INPUTCONTEXT 구조체는 입력 컨텍스트와 관련된 데이터를 보관하는 내부 데이터 구조체입니다. /* INPUTCONTEXT */ typedef struct tagINPUTCONTEXT { HWND hWnd; BOOL fOpen; POINT ptStatusWndPos; POINT ptSoftKbdPos; DWORD fdwConv.. 더보기
Windows DDK 문서 IMEIMES.DOC - 11. IME File Format and Data Structures (IME 파일 포맷 및 데이터 구조) #1 IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 파일 포맷과 데이터 구조체 (Part 1) 아래는 IME가 사용하는 IME 파일 포맷과 데이터 구조체에 대해 설명합니다. IME 파일 포맷 IME는 아래 필드들을 리소스의 버전 정보에서 정확히 지정할 필요가 있습니다. 이는 고정된 파일 정보 부분과 가변 길이 정보 부분으로 구성되어 있습니다. 리소스의 버전 정보에 관한 상세한 내용은 Microsoft Platform SDK를 참조하십시오. 아래는 IME 파일이 포함해야 하는 상세 정보 설정입니다. dwFileOS &nsbp;dwFileOS는 버전 정보의 최상위 블록에 명시되어야 하며 Windows 95 및 Windo.. 더보기
Windows DDK 문서 IMEIMES.DOC - 10. Windows NT/Windows 2000 Issues(윈도우 NT/윈도우 2000 배포) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong Windows NT/Windows 2000 배포 아래는 주로 Windows NT/Windows 2000과 관련된 특별한 주제를 다룹니다. 그러나 몇 가지는 Windows 98에도 적용가능합니다. IME와 현지어 호환성 Windows 2000은 어떤 현지 언어 버전에서도 완전한 기능의 IME를 지원합니다. 즉 여러분이 개발한 IME는 어떤 언어로 된 Windows 2000에서도 설치되고 사용될 수 있습니다. IME 개발자는 이를 고려하고 각 환경에서 테스트해보아야 할 것입니다. 이 새로운 기능은 IME 개발자가 작성한 IME 도움말이 다양한 언어의 운영체제에서도 잘 보이도록.. 더보기
Windows DDK 문서 IMEIMES.DOC - 9. IME Help File(IME 도움말 파일) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 도움말 파일 IME 도움말 파일은 Windows 98, Windows NT 및 Windows 2000에서 새로 추가된 기능입니다. 시스템 펜 아이콘을 마우스 오른쪽 버튼으로 클릭 시 나타나는 메뉴에는 2개의 항목이 있습니다. 하나는 IME 시스템 설정이며 포커스가 놓인 스레드와 연결된 IME의 설정을 변경합니다. 다른 하나는 온라인 도움말 파일이나 활성화되지는 않습니다. 그러므로 이 메뉴 항목은 항상 회색으로 표시됩니다. 이 항목의 용도는 해당 IME의 온라인 도움말을 표시하기 위한 것이었으나 시스템이 IME에게 IME 도움말 파일의 이름을 설정할 방법을 제공하지 .. 더보기
Windows DDK 문서 IMEIMES.DOC - 8. IME Menu Functions (IME 메뉴 함수) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 메뉴 함수 이 함수 집합의 목적은 시스템 작업 표시줄에서 IME 관련 아이콘의 개수를 줄이기 위함입니다. 이는 Windows 98 및 2000의 새로운 기능입니다. 현재의 hKL이 IME일 때, Windows 시스템 프로그램은 작업표사줄에 2개의 아이콘을 추가합니다. 하나는 System ML 아이콘으로, 시스템 작업 표시줄에서 현재의 키보드 레이아웃을 지시하고, 다른 하나는 시스템 펜 아이콘으로 활성화된 윈도우의 IME 상태를 보여줍니다. 보통 IME는 작업표시줄에 추가적으로 아이콘을 더 만들기도 합니다. 이 아이콘을 클릭 시 나타날 컨텍스트 메뉴는 전적으로 IME.. 더보기
Windows DDK 문서 IMEIMES.DOC - 7. Reconversion(재변환) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong 리컨버전(Reconversion) 리컨버전은 Windows 98 및 Windows 2000을 위한 새로운 IME 기능입니다. 이는 이미 어플리케이션의 문서에 입력된 문자열을 재변환하는 능력을 지원합니다. 특히 어떤 문자열이든 IME는 해당 문자열을 인식할 수 있고 이 문자열에 대한 발음 또는 글쇠 정보로 역변환할 수 있고, 이 발음 또는 글쇠에 대응되는 다른 단어들에 대한 후보 목록을 보여줄 수 있습니다. 새롭고 진보된 지능형 IME는 완전한 문장에 대해서도 인식하고 해석할 수 있습니다. IME가 완전한 문장 또는 문장의 일부분 같이 문자열과 관련하여 더 나은 정보를 제공.. 더보기
Windows DDK 문서 IMEIMES.DOC - 5. ImeSetCompositionString 함수, 6. Soft Keyboard(소프트 키보드) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong ImeSetCompositionString 함수 ImeSetCompositionString 함수는 IME 조합 문자열(Composition String)을 다루는 데 어플리케이션이 사용하는 함수입니다. 서로 다른 플래그를 지정함으로써 어플리케이션은 조합 문자열, 속성, 절(clause) 등을 수정할 수 있습니다. 이 함수의 두 번째 매개변수인 dwIndex는 어떻게 조합 문자열이 IME에서 조정되어야 하는지를 지정합니다. 이 값은 SCS_SETSTR ,SCS_CHANGEATTR, SCS_CHANGECLAUSE, SCS_QUERYRECONVERTSTRING와 같은 값을 포함.. 더보기
Windows DDK 문서 IMEIMES.DOC - 4. Generating Messages(메시지 생성하기) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong 메시지 생성하기 IME는 IME 메시지를 생성해야 합니다. IME가 변환 과정을 시작할 때 IME는 WM_IME_STARTCOMPOSITION 메시지를 생성합니다. 만일 IME가 조합 문자열을 변경할 때는 WM_IME_COMPOSITION 메시지를 생성합니다. IME가 메시지를 생성하는 방법에는 두 가지가 있습니다. 하나는 ImeToAsciiEx가 제공하는 lpdwTransKey 버퍼를 사용하는 방법이 있고 다른 하나는 ImmGenerateMessage 함수를 호출하는 방법입니다. 메시지를 생성하기 위해 lpdwTransBuf를 사용하기 IME가 초기화하는 이벤트는 입력 .. 더보기
Windows DDK 문서 IMEIMES.DOC - 3. IME Input Context(IME 입력 컨텍스트) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 입력 컨텍스트 각 윈도우는 IME 입력 컨텍스트와 연결되어 있습니다. IMM은 IME 상태, 데이터 등을 관리하고 IME 및 어플리케이션과 통신하기 위해 입력 컨텍스트를 사용합니다. 기본 입력 컨텍스트 기본적으로 시스템은 기본 입력 컨텍스트를 각 쓰레드마다 생성합니다. IME를 인식하지 않는 모든 창에 대한 쓰레드는 이 컨텍스트를 공유합니다. 어플리케이션이 생성한 입력 컨텍스트 어플리케이션 윈도우는 중간 조합 문자열(Intermediate Composition String)을 포함하여 IME의 모든 상태를 관리하기 위해 윈도우 핸들을 입력 컨텍스트에 연결할 수 있습.. 더보기
Windows DDK 문서 IMEIMES.DOC - 2. IME User Interface(IME 사용자 인터페이스) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 사용자 인터페이스 IME 사용자 인터페이스는 IME 윈도우, UI 윈도우 및 UI 윈도우에 포함되는 구성요소로 이루어집니다. 특징 IME 클래스는 미리 정의된 전역 클래스로서 파생 가능합니다. IME 클래스의 일반적인 특징은 다른 공용 컨트롤과 같습니다. 윈도우 인스턴스는 CreateWindowEx로 생성 가능합니다. STATIC 컨트롤처럼 IME 클래스로 만들어진 윈도우도 사용자 입력 자체에는 반응하지 않지만 컨트롤이 받을 수 있는 다양한 메시지를 수신하여 IME 사용자 인터페이스가 반응할 수 있게 합니다. 어플리케이션은 이 IME 클래스를 이용해 직접 생성하거나.. 더보기
Windows DDK 문서 IMEIMES.DOC - 1. Overview (개요) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong 이 문서는 어떻게 Windows 95, Windows 98, Windows NT 및 2000을 위한 IME를 개발할 지에 대한 기초를 소개합니다. 또한 이 문서는 IME 개발을 위해 Win32 다국어 IME를 위해 쓰일 API 레퍼런스 내용을 보충합니다. Overview(개요) IME User Interface(IME 사용자 인터페이스) IME Input Context(IME 입력 컨텍스트) Generating Messages(메시지 발생) ImeSetCompositionString 함수 Soft Keyboard(소프트 키보드) Reconversion(재전환) IME Me.. 더보기
윈도우 프로그램에서 콘솔창 띄우기 AllocConsole: 콘솔창을 하나 엽니다. 프로세스당 1개의 콘솔창만 생성할 수 있습니다. AttachConsole: 지정된 프로세스 번호가 소유한 콘솔창에 연결하고 텍스트를 입출력합니다. FreeConsole: 이 프로세스가 갖는 콘솔창을 닫습니다. 사용예 /* 사용 예 */ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPreviousInstance, LPSTR lpCmdLine, int nCmdShow) { AllocConsole(); freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); printf("Hello, World!\.. 더보기
Visual C++로 MSXML 사용하기 #7 이전 포스팅에서 저장한 test.xml을 불러오는 기능은 XMLDOMDocument의 load 메서드입니다. _variant_t variant = TEXT("test.xml"); xmlDocument->load(variant); test.xml을 불러와 콘솔에 출력해보겠습니다. /* ex12.cpp */ #include #include #include #import int main(int argc, char * argv[]) { ::setlocale(LC_ALL, ""); if (SUCCEEDED(::CoInitialize(NULL))) { { _bstr_t bstr1, bstr2; _variant_t variant; IXMLDOMDocumentPtr xmlDocument; IXMLDOMProcessin.. 더보기
Visual C++로 MSXML 사용하기 #6 루트 엘리먼트, 자식 엘리먼트, 어트리뷰트, 텍스트 등 XML을 구성하는 기본적인 노드들을 VARIANT와 BSTR을 사용해 삽입해 보았습니다. 만든 XML 파일을 파일에 저장하는 방법은 XMLDOMDocument 클래스에 있는 save 메서드를 사용하면 됩니다. save 메서드는 매개변수로 VARIANT 형 구조체를 받습니다. _bstr_t path = TEXT("test.xml"); _variant_t variant = path; xmlDocument->save(variant); 이렇게 하면 프로그램이 실행되고 있는 위치에 test.xml을 생성하고 현재까지의 내용을 이 파일에 저장시킵니다. 제시된 XML대로 노드를 구성하고 파일로 저장해보겠습니다. Hello, World! 이를 코드로 작성하면 /*.. 더보기
Visual C++로 MSXML 사용하기 #5 루트 엘리먼트 내부에 텍스트와 자식 엘리먼트를 넣어보겠습니다. 먼저 루트 엘리먼트인 "document"에 "Hello, Word!"라는 문장을 넣어보겠습니다. Hello, World! 이를 소스코드로 표현하면 /* ex09.cpp */ #include #include #include #import int main(int argc, char * argv[]) { ::setlocale(LC_ALL, ""); if (SUCCEEDED(::CoInitialize(NULL))) { { _bstr_t bstr1, bstr2, bstr3; _variant_t variant; IXMLDOMDocumentPtr xmlDocument; IXMLDOMProcessingInstructionPtr xmlProcessingIns.. 더보기
Visual C++로 MSXML 사용하기 #4 BSTR과 마찬가지로 VARIANT형도 자신이 싣게될 데이터형에 따라 알아서 처리하는 _variant_t 클래스를 제공합니다. V_VT와 V_자료형 매크로를 사용해 일일이 데이터형을 지정하지 않아도 된다는 뜻입니다. 3편에서 보였던 소스를 _variant_t 형으로 다시 작성해보겠습니다. /* ex08.cpp */ #include "stdafx.h" int main(int argc, char * argv[]) { ::setlocale(LC_ALL, ""); if (SUCCEEDED(::CoInitialize(NULL))) { { _bstr_t bstr1, bstr2, bstr3; _variant_t variant; IXMLDOMDocumentPtr xmlDocument; IXMLDOMProcessingI.. 더보기
Visual C++로 MSXML 사용하기 #3 BSTR 자료형의 근본은 wchar_t * 형입니다. 인텔리센스로 확인해 보면 typedef OLECHAR * BSTR; 이고 OLECHAR은 다시 typedef wchar_t OLECHAR; 이므로 겉모양으로는 Wide Char 문자열과 똑같다는 뜻입니다. 다만 저장되는 문자열의 구조가 통상적인 C-Style이 아닌 맨 처음에 문자열의 길이가 명시되는 BSTR이라는 차이가 있는 것이지요 BSTR을 사용하기 위해서 이전 포스팅에서는 SysAllocString, SysFreeString의 함수를 사용하여 C-Style의 문자열을 변환하였지만 문자열을 사용하는 매 순간마다 이런 함수들을 호출해 일일이 변환하는 것은 번거롭기 그지없습니다. 그래서 BSTR의 사용과 변환에 관련된 기능들을 묶어놓은 클래스가 _b.. 더보기
Visual C++로 MSXML 사용하기 #2 아래의 간단한 XML 코드를 MSXML을 통해 생성하고 파일로 저장해보겠습니다. 먼저 XML 문서를 다루기 위한 XMLDOMDocument 인스턴스를 생성합니다. COM 클래스는 이름 끝에 Ptr이라 붙는 자료형을 제공하는데 이는 일종의 스마트포인터(smart pointer)로서 자신이 선언된 스코프가 끝날 때 메모리를 자동으로 해제하도록 만들어진 것입니다. 아래와 같이 IXMLDOMDocumentPtr형의 변수를 선언하고 CreateInstance 메서드를 호출합니다. 매개변수로는 XMLDocument의 CLSID를 전달합니다. HRESULT를 반환하며 SUCCEEDED 매크로를 통해 성공 또는 실패를 판별할 수 있습니다. /* ex03.cpp */ #include #import int main(int.. 더보기
Visual C++로 MSXML 사용하기 #1 Visual C++에서 XML 파일을 읽거나 쓸 때 MSXML을 사용합니다. MSXML을 사용하기 위해서는 COM을 알아야 하는데요. COM(Component Object Model)은 서로 다른 언어로 작성된 프로그램을 가져다 사용하는 기술로 Windows 운영체제에서 쓰입니다. 요즘은 닷넷이라는 좋은 플랫폼이 있어서 COM이 지향하고자 하는 기능들을 간편하게 활용할 수 있지만, Visual C++로 COM을 사용하기 위해서는 약간 복잡한 과정을 거칩니다. 1 단계. COM을 사용하기 위해 windows.h를 include합니다. #include 2 단계. CoInitialize 함수를 호출해 지금부터 COM을 사용할 것임을 운영체제에 알립니다. 매개변수로 NULL이 전달되는데 차기 버전을 위해 마련해.. 더보기
waveOut 함수 사용 예제 #2 이번에는 웨이브 출력에 따라 콜백함수를 선언해 호출되도록 하겠습니다. (첨부파일:) #pragma comment(lib, "winmm.lib") #include #include #include #include #include #include #include #pragma pack(push, 1) typedef struct { CHAR szChunkID[4]; // 항상 'R', 'I', 'F', 'F'라는 4개의 ASCII 문자가 옵니다. DWORD dwChunkSize; // 이 필드 바로 다음부터 파일의 맨 끝까지의 크기를 저장합니다. CHAR dwFormat[4]; // 이 필드 다음에 오는 형식의 종류를 지정합니다. 여기에서는 'W', 'A', 'V', 'E'의 4개의 ASCII 문자가 옵니다. .. 더보기
waveOut 함수 사용 예제 #1 waveOut 함수는 Windows API에서 사운드 파일을 직접 읽어서 사운드 드라이버에 전달하는 저수준 출력 함수입니다. 저수준 함수인만큼 mp3, flac 등의 압축된 형식을 직접 읽을수는 없고 PCM 방식으로 저장된 파일(일명 wav 파일)을 읽습니다. 이를 이해하기 위해서는 먼저 웨이브 파일의 구조를 이해해야 합니다. (자세한 내용은 http://crystalcube.co.kr/123참조.) 웨이브 파일의 구조를 C 스타일의 구조체로 표현하면 다음과 같이 3개의 구조체로 표현가능합니다. /* WAVE 파일을 구성하는 3개의 구조체 */ // 파일에서 PCM WAVE가 기록된 가장 첫 부분에 해당하는 내용입니다. // 보통은 파일의 가장 첫 부분에 이 구조체에 들어맞는 내용이 옵니다. #pragm.. 더보기