描述:
我这里有个解码库(.dll),是个COM组件,需要做个控件,实现视频解码播放功能。控件需要嵌入到IE浏览器中,视频文件存放在WEB服务器上。因才开始学COM,现在有几个问题,等大神指教。
1、在打开网页的时候,COM怎样实现本地注册。
2、只有些.DLL文件,怎样通过代码实现注册,而不是regsvr32命令手动注册。
3、通过pTypeLib->GetTypeInfo(i, &pTypeInfo);函数得到:
IID_IDecoderManagerEvents 类型:TKIND_DISPATCH
CLSID_DecoderManager Class 类型:TKIND_COCLASS
IID_IDecoderManager 类型:TKIND_DISPATCH
还有一些只有GUID,没名字,不知道是什么东西。
文档中列出了一系列操作函数,我用这些函数应该先找到接口的地址,这里就有个问题,有两个IID,我怎么知道属于哪个IID,应该怎样去调用这些函数。
#include <Windows.h>
#include <stdio.h>
#include "../include/SMFPlay/include/SMFPlayAPI.h"
#pragma comment(lib, "Kernel32.lib")
#pragma comment(lib, "../include/SMFPlay/lib/SMFPlay.lib")
#define MYCON __thiscall
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
::CoInitialize(NULL);
CLSID clsid;
ITypeLib *pTypeLib = NULL;
ITypeInfo *pTypeInfo = NULL;
TYPEATTR *pTypeAttr = NULL;
WCHAR *pwszProgID = NULL;
IClassFactory *pClf = NULL;
IUnknown *pUnknown = NULL;
IID pid ;
HRESULT hRlt;
UINT iCount;
hRlt = ::LoadTypeLib(L"../include/DecoderFactory.dll", &pTypeLib);
iCount = pTypeLib->GetTypeInfoCount();
for (int i=0; i!=iCount; ++i)
{
hRlt = pTypeLib->GetTypeInfo(i, &pTypeInfo);
hRlt = pTypeInfo->GetTypeAttr(&pTypeAttr);
if (TKIND_COCLASS == pTypeAttr->typekind)
{
hRlt = ::ProgIDFromCLSID(pTypeAttr->guid, &pwszProgID);
}
if (TKIND_DISPATCH == pTypeAttr->typekind)
{
pid = pTypeAttr->guid;
}
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
pTypeInfo->Release();
}
::CLSIDFromProgID(pwszProgID, &clsid);
::CoGetClassObject(clsid, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void**)&pClf);
pClf->CreateInstance(NULL, IID_IUnknown, (void**)&pUnknown);
void *pvoid = NULL;
hRlt = pUnknown->QueryInterface(pid, &pvoid);
// hRlt = pUnknown->QueryInterface(IID_IDecoderManager, &pvoid);
// ...
::CoUninitialize();
return 0;
}