动态链接:
extern "C" dumpbin -exports cmpnt1.dll
.def: library "cmpnt1.dll"
exports
CreateIinstance @1 PRIVATE
动态加载
客户,组件划分:客户client.cpp 组件cmpnt.cpp cmpnt.def 共享:iface.h guids.cpp 程序清单
HRESULT GUID 注册表 COM库:
HRESULT:结构 常用返回值 HRESULT查找(十六进制直接查找,FACILITY_WIN32查找,FormatMessage)
hr == E_FAIL hr == S_OK 错误 应该FAILED(hr)
所有期望在远程机器上运行的函数都应返回HRESULT
GUID:为什么使用(保证时间空间上唯一) 定义DEFINE_GUID(extern "C" const GUID IID_IX) GUID比较(四种方法) GUID传递用引用(REFIID等价const IID&, REFCLSID REFGUID)
注册表:HKEY_CLASS_ROOT->CLSID->{XXXXX-XXX-XXX-XXX}->InprocServer32 默认值是dll文件名
progID HKEY_CLASS_ROOT->ProgID 格式 注册表格式 与版本无关的ProgID CLSIDFromProgID
自注册:extern "C" HRESULT _stdcall(STDAPI) DllRegisterServer()
组件类别:{组件,组件,...} Component Category Manager,CLSID_StdComponentCategoriesMgr ICatRegister ICatInformation
COM库:CoInitialize CoUninitialize每个进程初始化一次 一般在exe中初始化 dll不初始化
OLE OleInitialize OleUninitialize OLE在COM基础上增加了类型库,剪切板,拖放,ActiveX文档,自动化,ActiveX控件的支持
内存管理,组件中分配一块内存,通过输出参数传递给客户 内存分配器让客户可以删除内存 IMalloc CoGetmalloc IMalloc::Alloc IMalloc::Free CoTaskMemAlloc CoTaskMemFree
将字符串转成CLSID,StringFromGUID2(UNICODE),wcstombs(ANSI) StringFromCLSID StringFromIID StringFromGUID2,CLSIDFromString,IIDFromString