mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 17:33:18 +00:00
Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers into modules, and delete rossubsys.
This commit is contained in:
parent
b94e2d8ca0
commit
c2c66aff7d
24198 changed files with 0 additions and 37285 deletions
4
sdk/lib/comsupp/CMakeLists.txt
Normal file
4
sdk/lib/comsupp/CMakeLists.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
|
||||
set_cpp(WITH_EXCEPTIONS WITH_STL)
|
||||
add_library(comsupp comsupp.cpp)
|
||||
add_dependencies(comsupp psdk)
|
135
sdk/lib/comsupp/comsupp.cpp
Normal file
135
sdk/lib/comsupp/comsupp.cpp
Normal file
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* PROJECT: ReactOS crt library
|
||||
* LICENSE: GPLv2+ - See COPYING in the top level directory
|
||||
* PURPOSE: Compiler support for COM
|
||||
* PROGRAMMER: Thomas Faber (thomas.faber@reactos.org)
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#define WIN32_NO_STATUS
|
||||
#define _INC_WINDOWS
|
||||
|
||||
#include <windef.h>
|
||||
#include <winbase.h>
|
||||
#include <comdef.h>
|
||||
|
||||
/* comdef.h */
|
||||
typedef void WINAPI COM_ERROR_HANDLER(HRESULT, IErrorInfo *);
|
||||
static COM_ERROR_HANDLER *com_error_handler;
|
||||
|
||||
void WINAPI _com_raise_error(HRESULT hr, IErrorInfo *perrinfo)
|
||||
{
|
||||
throw _com_error(hr, perrinfo);
|
||||
}
|
||||
|
||||
void WINAPI _set_com_error_handler(COM_ERROR_HANDLER *phandler)
|
||||
{
|
||||
com_error_handler = phandler;
|
||||
}
|
||||
|
||||
void WINAPI _com_issue_error(HRESULT hr)
|
||||
{
|
||||
com_error_handler(hr, NULL);
|
||||
}
|
||||
|
||||
void WINAPI _com_issue_errorex(HRESULT hr, IUnknown *punk, REFIID riid)
|
||||
{
|
||||
void *pv;
|
||||
IErrorInfo *perrinfo = NULL;
|
||||
|
||||
if (SUCCEEDED(punk->QueryInterface(riid, &pv)))
|
||||
{
|
||||
ISupportErrorInfo *pserrinfo = static_cast<ISupportErrorInfo *>(pv);
|
||||
if (pserrinfo->InterfaceSupportsErrorInfo(riid) == S_OK)
|
||||
(void)GetErrorInfo(0, &perrinfo);
|
||||
pserrinfo->Release();
|
||||
}
|
||||
|
||||
com_error_handler(hr, perrinfo);
|
||||
}
|
||||
|
||||
/* comutil.h */
|
||||
_variant_t vtMissing(DISP_E_PARAMNOTFOUND, VT_ERROR);
|
||||
|
||||
namespace _com_util
|
||||
{
|
||||
|
||||
BSTR WINAPI ConvertStringToBSTR(const char *pSrc)
|
||||
{
|
||||
DWORD cwch;
|
||||
BSTR wsOut(NULL);
|
||||
|
||||
if (!pSrc) return NULL;
|
||||
|
||||
/* Compute the needed size with the NULL terminator */
|
||||
cwch = ::MultiByteToWideChar(CP_ACP, 0, pSrc, -1, NULL, 0);
|
||||
if (cwch == 0) return NULL;
|
||||
|
||||
/* Allocate the BSTR (without the NULL terminator) */
|
||||
wsOut = ::SysAllocStringLen(NULL, cwch - 1);
|
||||
if (!wsOut)
|
||||
{
|
||||
::_com_issue_error(HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Convert the string */
|
||||
if (::MultiByteToWideChar(CP_ACP, 0, pSrc, -1, wsOut, cwch) == 0)
|
||||
{
|
||||
/* We failed, clean everything up */
|
||||
cwch = ::GetLastError();
|
||||
|
||||
::SysFreeString(wsOut);
|
||||
wsOut = NULL;
|
||||
|
||||
::_com_issue_error(!IS_ERROR(cwch) ? HRESULT_FROM_WIN32(cwch) : cwch);
|
||||
}
|
||||
|
||||
return wsOut;
|
||||
}
|
||||
|
||||
char* WINAPI ConvertBSTRToString(BSTR pSrc)
|
||||
{
|
||||
DWORD cb, cwch;
|
||||
char *szOut = NULL;
|
||||
|
||||
if (!pSrc) return NULL;
|
||||
|
||||
/* Retrieve the size of the BSTR with the NULL terminator */
|
||||
cwch = ::SysStringLen(pSrc) + 1;
|
||||
|
||||
/* Compute the needed size with the NULL terminator */
|
||||
cb = ::WideCharToMultiByte(CP_ACP, 0, pSrc, cwch, NULL, 0, NULL, NULL);
|
||||
if (cb == 0)
|
||||
{
|
||||
cwch = ::GetLastError();
|
||||
::_com_issue_error(!IS_ERROR(cwch) ? HRESULT_FROM_WIN32(cwch) : cwch);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Allocate the string */
|
||||
szOut = (char*)::operator new(cb * sizeof(char));
|
||||
if (!szOut)
|
||||
{
|
||||
::_com_issue_error(HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Convert the string and NULL-terminate */
|
||||
szOut[cb - 1] = '\0';
|
||||
if (::WideCharToMultiByte(CP_ACP, 0, pSrc, cwch, szOut, cb, NULL, NULL) == 0)
|
||||
{
|
||||
/* We failed, clean everything up */
|
||||
cwch = ::GetLastError();
|
||||
|
||||
::operator delete(szOut);
|
||||
szOut = NULL;
|
||||
|
||||
::_com_issue_error(!IS_ERROR(cwch) ? HRESULT_FROM_WIN32(cwch) : cwch);
|
||||
}
|
||||
|
||||
return szOut;
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue