OSDN Git Service

最初のコミット。
[winaudioj/win7x64Audio.git] / win64 / exception.cpp
1 #include "stdafx.h"
2 #include "exception.h"
3 #include <objbase.h>
4 #include <wtypes.h>
5 #include <winerror.h>
6 #include <avrt.h>
7 #include <strsafe.h>
8 #include <audioclient.h>
9 #include <audiopolicy.h>
10
11
12
13 #define BOOST_ASSIGN_MAX_PARAMS 7
14 #include <boost/assign.hpp>
15 #include <boost/assign/ptr_list_of.hpp>
16 #include <boost/assign/ptr_list_inserter.hpp>
17 #include <boost/foreach.hpp>
18 #include "sf_memory.h"
19
20 using namespace boost;
21
22 namespace sf
23 {
24 //typedef CComPtr<IAudioClient> IAudioClientPtr;
25 std::map<HRESULT,std::wstring> com_error_  = boost::assign::list_of<std::pair<HRESULT,std::wstring> >
26     (E_POINTER,L"E_POINTER")
27     (E_INVALIDARG,L"E_INVALIDARG")
28     (DWRITE_E_FILEFORMAT,L"DWRITE_E_FILEFORMAT")
29     (DWRITE_E_UNEXPECTED,L"DWRITE_E_UNEXPECTED")
30     (DWRITE_E_NOFONT,L"DWRITE_E_NOFONT")
31     (DWRITE_E_FILENOTFOUND,L"DWRITE_E_FILENOTFOUND")
32     (DWRITE_E_FILEACCESS,L"DWRITE_E_FILEACCESS")
33     (DWRITE_E_FONTCOLLECTIONOBSOLETE,L"DWRITE_E_FONTCOLLECTIONOBSOLETE")
34     (DWRITE_E_ALREADYREGISTERED,L"DWRITE_E_ALREADYREGISTERED")
35         (AUDCLNT_E_NOT_INITIALIZED,L"AUDCLNT_E_NOT_INITIALIZED")
36         (AUDCLNT_E_ALREADY_INITIALIZED,L"AUDCLNT_E_ALREADY_INITIALIZED")
37     (AUDCLNT_E_WRONG_ENDPOINT_TYPE,L"AUDCLNT_E_WRONG_ENDPOINT_TYPE")
38         (AUDCLNT_E_DEVICE_INVALIDATED,L"AUDCLNT_E_DEVICE_INVALIDATED")
39         (AUDCLNT_E_NOT_STOPPED,L"AUDCLNT_E_NOT_STOPPED")
40         (AUDCLNT_E_BUFFER_TOO_LARGE,L"AUDCLNT_E_BUFFER_TOO_LARGE")
41         (AUDCLNT_E_OUT_OF_ORDER,L"AUDCLNT_E_OUT_OF_ORDER")
42         (AUDCLNT_E_UNSUPPORTED_FORMAT,L"AUDCLNT_E_UNSUPPORTED_FORMAT")
43         (AUDCLNT_E_INVALID_SIZE,L"AUDCLNT_E_INVALID_SIZE")
44         (AUDCLNT_E_DEVICE_IN_USE,L"AUDCLNT_E_DEVICE_IN_USE")
45         (AUDCLNT_E_BUFFER_OPERATION_PENDING,L"AUDCLNT_E_BUFFER_OPERATION_PENDING")
46         (AUDCLNT_E_THREAD_NOT_REGISTERED,L"AUDCLNT_E_THREAD_NOT_REGISTERED")
47         (AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED,L"AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED")
48         (AUDCLNT_E_ENDPOINT_CREATE_FAILED,L"AUDCLNT_E_ENDPOINT_CREATE_FAILED")
49         (AUDCLNT_E_SERVICE_NOT_RUNNING,L"AUDCLNT_E_SERVICE_NOT_RUNNING")
50         (AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED,L"AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED")
51         (AUDCLNT_E_EXCLUSIVE_MODE_ONLY,L"AUDCLNT_E_EXCLUSIVE_MODE_ONLY")
52         (AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL,L"AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL")
53         (AUDCLNT_E_EVENTHANDLE_NOT_SET,L"AUDCLNT_E_EVENTHANDLE_NOT_SET")
54         (AUDCLNT_E_INCORRECT_BUFFER_SIZE,L"AUDCLNT_E_INCORRECT_BUFFER_SIZE")
55         (AUDCLNT_E_BUFFER_SIZE_ERROR,L"AUDCLNT_E_BUFFER_SIZE_ERROR")
56         (AUDCLNT_S_BUFFER_EMPTY,L"AUDCLNT_S_BUFFER_EMPTY")
57         (AUDCLNT_S_THREAD_ALREADY_REGISTERED,L"AUDCLNT_S_THREAD_ALREADY_REGISTERED");
58         
59
60 win32_error_exception::win32_error_exception(boost::uint32_t hr)
61 : std::exception("HRESULT ERROR"),hresult_(hr)
62 {
63         local_memory<wchar_t> mem;
64         DWORD result = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,hr,0,(LPWSTR)&mem,0,0);
65         if(result != 0){
66                 error_ = mem.get();
67         } else {
68                 std::map<HRESULT,std::wstring>::iterator it = com_error_.find(hr);
69                 if(it != com_error_.end())
70                 {
71                         error_ = it->second;
72                 } else {
73                         error_ = (boost::wformat(L"0x%x \95s\96¾\82ÈCOM\83G\83\89\81[") % hr).str();
74                 }
75
76         }
77 };
78
79 win32_error_exception::win32_error_exception()
80 {
81         hresult_ = ::GetLastError();
82         local_memory<wchar_t> mem;
83         DWORD rv =  FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,hresult_,0,(LPWSTR)&mem,0,0);
84         error_ = mem.get();
85         //Logger::outputDebugPrintf(L"Win32 Error %x %s",hresult_,mem.Get() );
86 };
87
88 }