我这里有个解码库(.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 __thiscallint 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;
}