如何为旧的ActiveX控件提供新的GUID?

时间:2018-02-02 19:25:47

标签: c++ mfc activex

我正在尝试修改在Visual Studio 2008中开发的ActiveX控件,以将其用于最初未设计的目的。我将重用至少90%的代码。因此,我想首先创建一个使用不同GUID的相同控件。我试着按照我发现的here(2004年编写的一个非常古老的链接)的说明,但是当我尝试构建我的项目时,我在ctlreg.cpp第113行得到了一个断言失败。然后,我恢复了所有的将文件更改回其原始状态,并且对于每个GUID是.odl文件,我在.cpp和.h文件中搜索GUID并在我找到它的任何地方更改它。我还确保更改我的主要版本号。我仍然得到断言失败。我还应该做什么?

这里是ctlreg.cpp的代码,从包含断言的方法开始到断言本身:

BOOL AFXAPI AfxOleRegisterTypeLib(HINSTANCE hInstance, REFGUID tlid,
    LPCTSTR pszFileName, LPCTSTR pszHelpDir)
{   
    BOOL bSuccess = FALSE;
    CStringW strPathNameW;
    wchar_t *szPathNameW = strPathNameW.GetBuffer(_MAX_PATH);
    ::GetModuleFileNameW(hInstance, szPathNameW, _MAX_PATH);
    strPathNameW.ReleaseBuffer();
    LPTYPELIB ptlib = NULL;
    // If a filename was specified, replace final component of path with it.
    if (pszFileName != NULL)
    {
        int iBackslash = strPathNameW.ReverseFind('\\');
        if (iBackslash != -1)
            strPathNameW = strPathNameW.Left(iBackslash+1);
        strPathNameW += pszFileName;
    }
    if (SUCCEEDED(LoadTypeLib(strPathNameW.GetString(), &ptlib)))
    {
        ASSERT_POINTER(ptlib, ITypeLib);

        LPTLIBATTR pAttr;
        GUID tlidActual = GUID_NULL;

        if (SUCCEEDED(ptlib->GetLibAttr(&pAttr)))
        {
            ASSERT_POINTER(pAttr, TLIBATTR);
            tlidActual = pAttr->guid;
            ptlib->ReleaseTLibAttr(pAttr);
        }

        // Check that the guid of the loaded type library matches
        // the tlid parameter.
        ASSERT(IsEqualGUID(tlid, tlidActual));

0 个答案:

没有答案