描述:
dll可以调用LoadLibrary函数加载动态库,然后调用GetProcAddress来获得函数的指针,这样只要提供一个动态库和函数的名称,函数的参数,就可以使用动态库的方法了。
com组件是否也能达到这样的功能?
解决方案1:
up
解决方案2:我在VB中应用COM, 直接CreateObject 用的不亦乐乎...
解决方案3: com连动态库的名称和存放地点都不需要知道
不是比dll更好?
如果搂主提出的问题都明白了,那么COM组件真的能发挥优势了
解决方案5: 我知道用IDISPATCH可以根据注册表中的内容调用.DLL的方法和属性,但不知道如果我做了一个可视化组件,如何可以随意在VIEW上加?
控件容器如何做啊?
http://community.csdn.net/Expert/topic/2977/2977524.xml?temp=.8665583
解决方案7: 四、不用CoCreateInstance or CoGetClassObject,直接从dll中得到DllGetClassObject,接着生成类对象及类实例(本方法适合于你想用某个组件,却不想在注册表中注册该组件)
演示代码:
/*前期准备工作如二方法所述,事实上只要得到CLSID和IID的定义及接口的定义就行*/
typedef HRESULT (__stdcall * pfnGCO) (REFCLSID, REFIID, void**);
pfnGCO fnGCO = NULL;
HINSTANCE hdllInst = LoadLibrary("D:\\Temp\\vc\\simpCOM\\Debug\\simpCOM.dll");
fnGCO = (pfnGCO)GetProcAddress(hdllInst, "DllGetClassObject");
if (fnGCO != 0)
{
IClassFactory* pcf = NULL;
HRESULT hr=(fnGCO)(CLSID_Foo, IID_IClassFactory, (void**)&pcf);
if (SUCCEEDED(hr) && (pcf != NULL))
{
IFoo* pFoo = NULL;
hr = pcf->CreateInstance(NULL, IID_IFoo, (void**)&pFoo);
if (SUCCEEDED(hr) && (pFoo != NULL))
{
pFoo->SayHello();
pFoo->Release();
}
pcf->Release();
}
}
FreeLibrary(hdllInst);
呵呵,com组件不需要知道名字,用id就行了,当然不dll好多了