免费注册com和Dispatch LPPICTUREDISP

时间:2017-12-14 13:37:36

标签: c++ mfc com activex winsxs

这是我的COM界面:

[id(2)] boolean Init(BSTR User, BSTR Password);
[id(3)] boolean SetBitmap(BSTR szObjectType, IPictureDisp* szBitmap);

如果注册了COM接口,则以下Init()函数可用,或者使用并排程序集(sxs)与应用程序的清单一起使用。

Init(LPCTSTR User, LPCTSTR Password)
{
    BOOL result;
    static BYTE parms[] =
        VTS_BSTR VTS_BSTR;
    InvokeHelper(0x2, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms,
         User, Password);
    return result;
}

但是,以下SetBitmap()函数仅在注册了COM接口时才有效!

BOOL SetBitmap(LPCTSTR szObjectType, LPPICTUREDISP szBitmap)
{
    BOOL result;
    static BYTE parms[] =
        VTS_BSTR VTS_DISPATCH;
    InvokeHelper(0x3, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms,
        szObjectType, szBitmap);
    return result;
}
  • 如果我使用配置了应用程序清单的COM接口,则函数调用失败,错误为E_UNEXPECTED

  • 如果我将VTS_DISPATCH替换为VTS_BSTR,则函数调用成功并且有效。在这种情况下,调度程序看起来不能调度该对象。

关于发生了什么的任何想法?

2 个答案:

答案 0 :(得分:4)

对于免注册COM,

IPictureDisp参数不是问题。

这里看来是错误的是您创建清单XML的方式。如果为ActiveX DLL定义了IDL,并且库具有实际的TLB,则客户端二进制清单应该具有引用而不是DLL的清单:

<dependentAssembly>
  <assemblyIdentity name='dlgd' type='win32' version='6.0.0.0'
    processorArchitecture='amd64' />
  <file name="dlgd.ocx" hashalg="SHA1">
    <comClass clsid="{guiD}" tlbid="{guiD}" description="sDlg Control"/>
    <typelib tlbid="{guiD}" version="1.0" helpdir=""/>
  </file>
</dependentAssembly>

此外,boolean IDL方法结果类型通常应为HRESULT。还有其他问题(正如其他人所指出的那样)以及您真正未发布的代码可能会有其他问题。尽管如此,如果您解释清单可以解决问题,但是您可以使用RegFreeComPictureDisp解决方案和代码段(clientserverIDLmanifest excerpt)作为修复项目的参考(TracSubversion)。

答案 1 :(得分:0)

最后这是一个疯狂的错误: 我们有CEF(chromiumembedded)组件。并且在没有CEfApp对象的情况下进行了初始化。这是一个非常疯狂的问题:ActiveX注册工作正常。没有它发货问题。正常的CEF初始化(或禁用CEF初始化)后,它在两种情况下都有效!