Files
2022-10-26 12:25:11 +08:00

98 lines
2.1 KiB
C++

//#define _WIN32_DCOM
#include "stdafx.h"
#include <WBANetwork/Common.h>
#include <WBANetwork/WBANetwork.h>
#include <objbase.h>
HANDLE g_handleMutex = INVALID_HANDLE_VALUE;
WBANetwork::LPFN_ErrorHandler g_lpfnHandler = 0;
void WBANetwork_Finalize()
{
if( g_handleMutex != INVALID_HANDLE_VALUE )
::CloseHandle( g_handleMutex );
::WSACleanup();
::CoUninitialize();
#ifdef _CRT_DEBUG
_CrtCheckMemory();
_CrtDumpMemoryLeaks();
#endif
}
void WBANetwork_DefaultErrorHandler( DWORD /*lastError*/, TCHAR* /*desc*/ )
{
// Nothing to do...
}
bool WBANetwork::Initialize( TCHAR* mutexName, LPFN_ErrorHandler handler )
{
CoInitializeEx( 0, COINIT_MULTITHREADED );
// lpfnHandler는 Null이 되어서는 안된다.
if( handler == 0 ) g_lpfnHandler = WBANetwork_DefaultErrorHandler;
else g_lpfnHandler = handler;
//CallbackErrorHandler(0,_T("WBANetwork Library Version 1.0.0.1"));
if( mutexName != 0 )
{
g_handleMutex = ::OpenMutex( MUTEX_ALL_ACCESS, 0, ( LPCTSTR )mutexName );
if( g_handleMutex != 0 )
{
CallbackErrorHandler(GetLastError(),_T("중복된 Mutex 세션이 존재합니다."));
return false;
}
g_handleMutex = ::CreateMutex( 0, 0, ( LPCTSTR )mutexName );
}
// Winsock 2.2 초기화
{
WSADATA wsa;
if( ::WSAStartup( 0x202, &wsa ) != 0 )
{
CallbackErrorHandler(WSAGetLastError(), _T("소켓 초기화에 실패 했습니다."));
return false;
}
}
#ifdef _CRT_DEBUG
int crtFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
crtFlag |= _CRTDBG_LEAK_CHECK_DF;
crtFlag |= _CRTDBG_DELAY_FREE_MEM_DF;
crtFlag |= _CRTDBG_CHECK_ALWAYS_DF;
_CrtSetDbgFlag( crtFlag );
#endif
atexit( WBANetwork_Finalize );
return true;
}
void WBANetwork::CallbackErrorHandler( DWORD lastError, TCHAR* desc )
{
if(NULL != g_lpfnHandler) g_lpfnHandler( lastError, desc );
}
DWORD WBANetwork::StringToHash( char* target )
{
DWORD ch = 0;
DWORD result = 0, xor = 0;
DWORD len = ( DWORD )strlen( target );
for(DWORD i = 0 ; i < len ; i++ )
{
ch = ( DWORD )target[i];
result = ( ( result << 8 ) | ch ) % 16777213UL;
xor ^= ch;
}
return ( result | ( xor << 24 ) );
}