创建COM组件的原理
来源:互联网 发布:婚恋app源码 编辑:程序博客网 时间:2024/05/29 07:18
IUnknown *pUnk = NULL;
IObject *pObject = NULL;
CoInitialize(NULL);
CoCreateInstance(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IDD_Unknown, (void**)&pUnk);
pUnk->QueryInterface(IID_IObject, (void**)&pObject);
pUnk->Release();
pObject->Func();
pObject->Release();
CoUninitialize();
CoCreateInstance的内部:
CoCreateInstance(....)
{
.......
IClassFactory *pClassFactory=NULL;
CoGetClassObject(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void **)&pClassFactory);
pClassFactory->CreateInstance(NULL, IID_IUnknown, (void**)&pUnk);
pClassFactory->Release();
........
}
//①-------------------
CoGetClassObject的内部:
CoGetClassObject(.....)
{
//通过查注册表CLSID_Object,得知组件DLL的位置、文件名
//使用LoadLibrary装入DLL库
//使用函数GetProcAddress( "DllGetClassObject" )得到DLL库中函数DllGetClassObject的函数指针。
//调用DllGetClassObject
}
DllGetClassObject是用来获得类工厂对象的,只有先得到类工厂才能去创建组件。
DllGetClassObject代码:
HRESULT_export
{
}
//②----------------
CFactory::CreateInstance(.....)
{
...........
CObject *pObject = new CObject; //组件对象
pObject->QueryInterface(IID_IUnknown, (void**)&pUnk);
pObject->Release();
...........
}
实例:
CComPtr<IAVIer> m_piAVIer;
m_piAVIer.CoCreateInstance(L"AVI.AVIer");
2、通过LoadLibrary和DllGetClassObject创建组件对象(组件未注册)
CComPtr<IAVIer> m_piAVIer;
typedef int (WINAPI *DllGetClassObjectPtr)(REFCLSID, REFIID, LPVOID*);
HMODULE hModule = LoadLibrary(dll文件路径);
//得到DllGetClassObject函数地址
DllGetClassObjectPtr ProcPtr = (DllGetClassObjectPtr)GetProcAddress(hModule, "DllGetClassObject");
CLSID rclsid;
IID riid;
::CLSIDFromString(A2W("{D5A365A3-44F8-47A0-8FCF-062372B1EB83}"), &rclsid);//类ID
::IIDFromString(A2W("{BE136856-CBEA-4079-A02B-BBC7A382BDB3}"), &riid);//接口ID
IClassFactory *pICF = NULL;//类工厂接口指针
ProcPtr(rclsid, IID_IClassFactory, (void**)(&pICF));//获取类工厂接口指针
//以上相当于①
pICF->CreateInstance(NULL, riid, (void**)&m_piAVIer);//创建COM对象
//以上相当于②
pICF->Release();
备注:
AVIer.rgs文件
HKCR
{
}
avi.idl文件
library AVILib
{
};
- 创建COM组件的原理
- 创建COM组件的实现(或者叫作注册Com组件)
- COM对象的创建原理
- COM组件实例创建失败的原因
- 进程内COM组件的创建过程
- 创建基于IE的安全COM组件
- COM组件原理
- COM学习笔记4_创建COM组件的实现
- COM学习笔记4_创建COM组件的实现
- COM之组件创建
- C#创建COM组件
- C#创建COM组件
- C#创建Com组件
- vs2010创建com组件
- 创建一个COM组件
- 创建一个COM组件
- C#创建COM组件
- C#创建com组件
- 约瑟夫问题
- tbody的宽高与table不同
- 如何用PHP开发一个完整的网站 多人开发
- 11月29日ForTest
- 详解iPhone开发中文件读写
- 创建COM组件的原理
- 不可错过的javascript迷你库
- Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment
- LBP
- 11月29日OtherDemo
- 解决Plugin is too old,please update to a more recent version,or set ANDROID_DAILY_OVERRIDE..
- 【笔记】关于android中shape使用的注意事项
- [PHP]Yii rules常用规则
- 集合操作符