免费注册 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;
}
如果我使用配置了应用程序清单的 COM 接口,函数调用失败并出现错误 E_UNEXPECTED
如果我将 VTS_DISPATCH
替换为 VTS_BSTR
,函数调用会成功并起作用。在这种情况下,调度程序似乎无法调度对象。
知道发生了什么事吗?
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 方法结果类型通常应该是 HRESULT
s。还有其他问题(正如其他人所指出的)以及您真正未发布的代码可能还有其他问题。尽管如此,如果您修复清单,您所解释的情况仍然可以很好地解决,您可以将 RegFreeComPictureDisp
解决方案与您的代码片段 (client, server, IDL, manifest excerpt) as a reference to fix your project (Trac, Subversion).
一起使用
最后是个疯狂的错误:
我们有 CEF(chromiumembedded) 组件。并且它是在没有 CEfApp 对象的情况下初始化的。这是一个非常疯狂的问题:注册后的 ActiveX 工作正常。没有它调度问题。在正常 CEF 初始化(或禁用 CEF 初始化)后,它在两种情况下都有效!
这是我的 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;
}
如果我使用配置了应用程序清单的 COM 接口,函数调用失败并出现错误
E_UNEXPECTED
如果我将
VTS_DISPATCH
替换为VTS_BSTR
,函数调用会成功并起作用。在这种情况下,调度程序似乎无法调度对象。
知道发生了什么事吗?
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 方法结果类型通常应该是 HRESULT
s。还有其他问题(正如其他人所指出的)以及您真正未发布的代码可能还有其他问题。尽管如此,如果您修复清单,您所解释的情况仍然可以很好地解决,您可以将 RegFreeComPictureDisp
解决方案与您的代码片段 (client, server, IDL, manifest excerpt) as a reference to fix your project (Trac, Subversion).
最后是个疯狂的错误: 我们有 CEF(chromiumembedded) 组件。并且它是在没有 CEfApp 对象的情况下初始化的。这是一个非常疯狂的问题:注册后的 ActiveX 工作正常。没有它调度问题。在正常 CEF 初始化(或禁用 CEF 初始化)后,它在两种情况下都有效!