c++ - 免费注册 com 和 Dispatch LPPICTUREDISP

标签 c++ mfc com activex winsxs

这是我的 COM 接口(interface):

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

如果注册了 COM 接口(interface),或者使用并排程序集 (sxs) 的应用程序 list ,则以下 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 接口(interface)时才有效!

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;
}
  • 如果我使用通过应用程序 list 配置的 COM 接口(interface),函数调用将失败并出现错误 E_UNEXPECTED

  • 如果我将 VTS_DISPATCH 替换为 VTS_BSTR,函数调用就会成功并起作用。在这种情况下,调度程序似乎无法调度对象。

知道发生了什么事吗?

最佳答案

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

这里似乎有问题的是您创建 list XML 的方式。如果您的 IDL 是为 ActiveX DLL 定义的,并且该库具有实际的 TLB,那么您的客户端二进制 list 应该具有引用而不是 DLL 的 list :

<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。还有其他问题(正如其他人所指出的)以及您真正未发布的代码可能还有其他问题。尽管如此,如果您修复 list ,您解释的情况仍然可以正常工作,您可以将 RegFreeComPictureDisp 解决方案与您的代码片段( clientserverIDLmanifest excerpt )一起用作修复您的引用项目(TracSubversion)。

关于c++ - 免费注册 com 和 Dispatch LPPICTUREDISP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47814695/

相关文章:

c++ - 重载一个函数,使其可以将基类转换为派生类作为参数

c++ - 将项目添加到 CTreetrl C++

c++ - 如何在 C++ 中将 Windows DATE 转换为 Unix 时间

c++ - 混合符号整数数学取决于变量大小

c++ - 复制指针

c++ - 当 CDialog.DoModal() 函数无法创建对话框时?

c++ - 从 mfc、sdi 中的对话框类访问文档文件

.net - COM 字符串 (BSTR) 和 .NET 字符串有什么区别?

c# - 将 native dll 和其他文件添加到 .net exe

c++ - Win32 API : App Freezes after opening dialog window