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

📄 myserv.cpp

📁 Visual_C++.NET精彩案例237.rar
💻 CPP
字号:

// myServ.cpp 
// 这是一个非常简单的COM服务器,它不需要MFC和ATL的支持。
// 这个DLL COM服务器提供了一个接口:ImyInterface,其中有两个方法:Square 和 Cube。
// 它是使用纯粹C++编写的一个最简单的服务器,没有串转换、宏处理之类的东西。
// 它只包含让这个服务器运行的最简代码。所以看代码时只要记住两个字:那就是"简单"。
// 
// 警告:这个程序没有经过全面测试,所以不敢保证它没有BUG,如果谁发现了,请通知
// vckbase@public.hk.hi.cn,尤其我没有测试单实例的情况,可能会有内存溢出......
//

#include "stdafx.h"
#include "myServ.h"

long g_cRefThisDll;
HANDLE g_module;

#include "ClassFactory.h"
#include "MyInterface1.h"
#include "Registrar.h"

// 这是唯一的一个全程变量,我不想在类框架中使用任何全程变量
long * CObjRoot::p_ObjCount = NULL; 

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH: 
			g_module = hModule; 
			CObjRoot::p_ObjCount = &g_cRefThisDll; 
			break;

		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
    }
    return TRUE;
}



STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut)
{
	*ppvOut = NULL;
    if (IsEqualIID(rclsid, CLSID_Mine))
    {
       // 为 CmyInterface 声明类工厂
       CClassFactory<CmyInterface> *pcf = new  CClassFactory<CmyInterface>;
       return pcf->QueryInterface(riid,ppvOut);
    }
    return CLASS_E_CLASSNOTAVAILABLE;
}

STDAPI  DllCanUnloadNow(void)
{
    return (g_cRefThisDll == 0 ? S_OK : S_FALSE);
}

STDAPI DllRegisterServer(void)
{
	// 这个类应该创建标准的注册表入口 
	CDllRegistrar registrar; 
	char path [ MAX_PATH ];
	GetModuleFileName((HMODULE)g_module,path,MAX_PATH);
	return registrar.RegisterObject(CLSID_Mine,"MineLib","MathObj",path) ? S_OK:S_FALSE;
}

STDAPI DllUnregisterServer(void)
{
	CDllRegistrar registrar;
	return registrar.UnRegisterObject(CLSID_Mine,"MineLib","MathObj") ? S_OK:S_FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -