📄 objectserverservicedll.cpp
字号:
// =====================================================
// OpenNet Integrated Services
//
// Design and Implementation by Floris van den Berg
//
// Copyright (c) 2002 Pylon
// =====================================================
#pragma warning (disable : 4275)
#pragma warning (disable : 4786)
#include <io.h>
#include <list>
#include <string>
#include <windows.h>
#include "OpenObjects.h"
// -----------------------------------------------------
class CDllService : public IService {
public:
CDllService();
~CDllService();
virtual unsigned long DLL_CALLCONV AddRef();
virtual unsigned long DLL_CALLCONV Release();
virtual HRESULT DLL_CALLCONV QueryInterface(REFIID guid, void **iif);
virtual HRESULT DLL_CALLCONV CreateInstance(GUID family, GUID guid, void **object);
virtual bool DLL_CALLCONV ObjectExists(GUID family, GUID guid);
private :
LONG m_ref_count;
_STL::list<ObjectInfo *> m_info_list;
_STL::list<HMODULE> m_covered_dlls;
};
// -----------------------------------------------------
CDllService::CDllService() :
m_ref_count(0),
m_info_list(),
m_covered_dlls() {
_finddata_t fileinfo;
long handle;
if ((handle = _findfirst("*.ooc", &fileinfo)) != -1) {
do {
HMODULE module = LoadLibrary(fileinfo.name);
if (module) {
FARPROC proc = GetProcAddress(module, "_OocInitialize@0");
if (proc) {
((ObjectInitializeProc)proc)();
m_covered_dlls.push_back(module);
} else {
FreeLibrary(module);
}
}
} while (_findnext(handle, &fileinfo) == 0);
_findclose(handle);
}
}
CDllService::~CDllService() {
for (_STL::list<HMODULE>::iterator it = m_covered_dlls.begin(); it != m_covered_dlls.end(); ++it)
FreeLibrary(*it);
}
unsigned long DLL_CALLCONV
CDllService::AddRef() {
return InterlockedIncrement(&m_ref_count);
}
unsigned long DLL_CALLCONV
CDllService::Release() {
if (InterlockedDecrement(&m_ref_count) == 0) {
delete this;
return 0;
}
return m_ref_count;
}
HRESULT DLL_CALLCONV
CDllService::QueryInterface(REFIID guid, void **iif) {
if (IsEqualGUID(guid, GUID_SERVICE_DLL)) {
AddRef();
*iif = this;
return S_OK;
} else if (IsEqualGUID(guid, GUID_OBJECT)) {
AddRef();
*iif = this;
return S_OK;
}
return E_NOINTERFACE;
}
HRESULT DLL_CALLCONV
CDllService::CreateInstance(GUID family, GUID guid, void **object) {
for (_STL::list<ObjectInfo *>::iterator it = m_info_list.begin(); it != m_info_list.end(); ++it) {
ObjectInfo *info = (*it);
if (IsEqualGUID(guid, info->guid)) {
if (IsEqualGUID(family, info->family)) {
return info->create(object);
}
}
}
return E_FAIL;
}
bool DLL_CALLCONV
CDllService::ObjectExists(GUID family, GUID guid) {
for (_STL::list<ObjectInfo *>::iterator it = m_info_list.begin(); it != m_info_list.end(); ++it)
if (IsEqualGUID(guid, (*it)->guid))
if (IsEqualGUID(family, (*it)->family))
return true;
return false;
};
// -----------------------------------------------------
HRESULT DLL_CALLCONV
CDllServiceCreate(void **iif) {
CDllService *obj = new CDllService;
if (obj) {
obj->AddRef();
*iif = obj;
return S_OK;
}
return E_FAIL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -