📄 myserv.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 + -