⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objectserverservicedll.cpp

📁 .net 方面的开发说明资料。
💻 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 + -