免费注册 com 和 Dispatch LPPICTUREDISP

registration free com and Dispatch LPPICTUREDISP

这是我的 COM 接口:

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

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

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;
}

知道发生了什么事吗?

IPictureDisp参数不是注册免费COM的问题。

这里似乎有问题的是您创建清单的方式 XML。如果您的 IDL 是为 ActiveX DLL 定义的,并且该库具有实际的 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 方法结果类型通常应该是 HRESULTs。还有其他问题(正如其他人所指出的)以及您真正未发布的代码可能还有其他问题。尽管如此,如果您修复清单,您所解释的情况仍然可以很好地解决,您可以将 RegFreeComPictureDisp 解决方案与您的代码片段 (client, server, IDL, manifest excerpt) as a reference to fix your project (Trac, Subversion).

一起使用

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