📄 mssoap.cpp
字号:
}
}
Cleanup:
#ifdef _CRTDBG_MAP_ALLOC
WCHAR buffer[1024];
hfile = CreateFile(_T("soapmemdump.log"), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_ALWAYS , FILE_ATTRIBUTE_NORMAL, 0);
if (GetEnvironmentVariable(_T("SOAP_CHECKMEM"), buffer,1024)!=0)
{
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_DELAY_FREE_MEM_DF);
}
else
{
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF );
}
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, hfile);
#endif
#endif
return fRetVal;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: SafeFreeLibrary(HINSTANCE h)
//
// parameters:
//
// description:
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
inline void SafeFreeLibrary(HINSTANCE h)
{
__try
{
FreeLibrary(h);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
TRACE(("DllMain: Exception fired during DllProcessDetach()\n"));
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: DllProcessDetach()
//
// parameters:
//
// description:
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL DllProcessDetach()
{
// Don't free the Localized Resource Strings on Win95
globalDeleteErrorList();
#ifndef UNDER_CE
if (!g_fIsWin9x)
SafeFreeLibrary(g_hInstance_language);
else
CloseHandle(g_hInstance_language);
#else
DeleteCriticalSection(&g_csGIT);
#endif
#ifdef _CRTDBG_MAP_ALLOC
ASSERT(_CrtCheckMemory());
ASSERT(!_CrtDumpMemoryLeaks());
CloseHandle(hfile);
#endif
TRACEL((1, "Nr of objects still around=%d\n", g_cObjects));
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: DllUnregisterServer(void)
//
// parameters:
//
// description: Removes entries from the system registry
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
STDAPI DllUnregisterServer(void)
{
#ifndef CE_NO_EXCEPTIONS
try
#else
__try
#endif
{
#ifndef UNDER_CE
UnRegisterTypeLib(LIBID_MSSOAPLib, SOAP_SDK_VERSION_MAJOR, SOAP_SDK_VERSION_MINOR, LANG_NEUTRAL, SYS_WIN32);
#endif
SoapMsg_UnregisterServer();
SoapConn_UnregisterServer();
SoapSer_UnregisterServer();
SoapReader_UnregisterServer();
Wsdl_UnregisterServer();
return S_OK;
}
#ifndef CE_NO_EXCEPTIONS
catch (...)
#else
__except(1)
#endif
{
return E_FAIL;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: DllRegisterServer(void)
//
// parameters:
//
// description: Adds entries to the system registry
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
STDAPI DllRegisterServer(void)
{
CComPointer<ITypeLib> pTypeLib;
#ifndef CE_NO_EXCEPTIONS
try
{
#endif
HRESULT hr = S_OK;
CHAR pModName[MAX_PATH + 1] = { 0 };
WCHAR wModName[MAX_PATH + 1] = { 0 };
if (! GetModuleFileNameA(g_hInstance, pModName, MAX_PATH))
{
return E_FAIL;
}
//make a clean start
DllUnregisterServer();
hr = SoapMsg_RegisterServer(pModName);
if (SUCCEEDED(hr))
hr = SoapConn_RegisterServer(pModName);
if (SUCCEEDED(hr))
hr = SoapSer_RegisterServer(pModName);
if (SUCCEEDED(hr))
hr = SoapReader_RegisterServer(pModName);
if (SUCCEEDED(hr))
hr = Wsdl_RegisterServer(pModName);
if (SUCCEEDED(hr))
{
#ifndef UNDER_CE
if (MultiByteToWideChar(CP_ACP, 0, pModName, -1, wModName, sizeof(wModName)) == 0)
#else
if (MultiByteToWideChar(CP_ACP, 0, pModName, -1, wModName, MAX_PATH) == 0)
#endif
{
return E_FAIL;
}
#ifndef UNDER_CE
hr = LoadTypeLibEx(wModName, REGKIND_REGISTER, &pTypeLib);
#else
hr = LoadTypeLib(wModName, &pTypeLib);
if(SUCCEEDED(hr))
hr = RegisterTypeLib(pTypeLib,wModName, NULL);
#endif
}
if (!SUCCEEDED(hr))
{
// no cleanup -- all xxx_RegisterServer-calls cleaned up behind themself
// in the case of an error
return E_FAIL;
}
return S_OK;
#ifndef CE_NO_EXCEPTIONS
}
catch (...)
{
DllUnregisterServer();
return E_FAIL;
}
#endif
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
//
// parameters:
//
// description:
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
{
if(! ppv)
return E_INVALIDARG;
*ppv = 0;
CSoapObject<CClassFactory> *pClassFactory = new CSoapObject<CClassFactory>;
if (pClassFactory == 0)
{
return E_OUTOFMEMORY;
}
HRESULT hr = S_OK;
if(FAILED(hr = pClassFactory->Init(rclsid)) ||
FAILED(hr = pClassFactory->QueryInterface(riid, ppv)))
{
delete pClassFactory;
return hr;
}
return S_OK;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: DllCanUnloadNow()
//
// parameters:
//
// description:
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef UNDER_CE
STDAPI DllCanUnloadNow()
{
static HRESULT s_result[] = { S_OK, S_FALSE };
HRESULT hr = s_result[g_cLock || g_cObjects];
if (hr == S_OK)
{
hr = SoapConn_DllCanUnloadNow();
}
return hr;
}
#else
STDAPI DllCanUnloadNow()
{
HRESULT hr = S_FALSE;
if (!g_cLock && !g_cObjects)
hr = SoapConn_DllCanUnloadNow();
return hr;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -