TYPE_E_LIBNOTREGISTERED(库未注册)在调用未注册的 ActiveX 控件的 Invoke() 时



代码如下。如何避免disp->Invoke()TYPE_E_LIBNOTREGISTERED(hr=0x8002801D, Library not registered) error(DO NOT register the ActiveX to Windows)
注册 ActiveX 控件时,一切正常,但我不想注册到 WINDOWS。
谢谢!

#define WIN32_LEAN_AND_MEAN
#include <tchar.h>
#include <Windows.h>
#include <assert.h>
#include <stdio.h>
#include <ole2.h>
int APIENTRY _tWinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    OleInitialize(NULL);
    LPCTSTR lpFile = _T("D:\Temp\Flash32_11_4_402_287.ocx");
    HMODULE hDll = LoadLibrary(lpFile);
    if (hDll)
    {
        typedef HRESULT (WINAPI *DllGetClassObject_t)(REFCLSID, REFIID, LPVOID*);
        DllGetClassObject_t DllGetClassObject = NULL;
        DllGetClassObject = (DllGetClassObject_t)GetProcAddress(hDll, "DllGetClassObject");
        if (DllGetClassObject)
        {
            CLSID clsid = GUID_NULL;
            IClassFactory *pCF = NULL;
            if (SUCCEEDED(CLSIDFromString(L"{D27CDB6E-AE6D-11CF-96B8-444553540000}", &clsid))
                && SUCCEEDED(DllGetClassObject(clsid, IID_IClassFactory, (void**)&pCF)))
            {
                IOleObject *obj = NULL;
                IDispatch *disp = NULL;
                if (SUCCEEDED(pCF->CreateInstance(NULL, IID_IOleObject, (void**)&obj))
                    && SUCCEEDED(obj->QueryInterface(IID_IDispatch, (void**)&disp)))
                {
                    DISPPARAMS params = { NULL, NULL, 0, 0 };
                    HRESULT hr = disp->Invoke(0x70, IID_NULL,
                        LOCALE_USER_DEFAULT, DISPATCH_METHOD,
                        &params, NULL, NULL, NULL);
                    assert(SUCCEEDED(hr));
                    //ERROR: hr=0x8002801D,TYPE_E_LIBNOTREGISTERED, Library not registered
                }
                if (disp) disp->Release();
                if (obj) obj->Release();
                pCF->Release();
            }
        }
    }
    OleUninitialize();
    return 0;
}

致 Hans Passant:非常感谢。英语不是我的母语,但在你详细的回答下,我有这个问题的完美解决方案,这是我关于stackoverflow的第一个问题,再次感谢。正如你所说,我的解决方案是以下:

//ITypeInfo *m_ti = NULL;
//pCF->CreateInstance(...);
ITypeLib *tl = NULL;
if (SUCCEEDED(LoadTypeLib(wsOcxFile, &tl)))
{
    if (SUCCEEDED(tl->GetTypeInfoOfGuid(guid, &m_ti)))
    {
        hr = m_ti->Invoke(disp,
            dispid, wFlags, &m_dispParams,
            pvResult, &ei, &nArgErr);
    }
    tl->Release();
}
//m_ti->Release();

最新更新