这是我的 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
解决方案与您的代码片段( client 、 server 、 IDL 、 manifest excerpt )一起用作修复您的引用项目(Trac,Subversion)。
关于c++ - 免费注册 com 和 Dispatch LPPICTUREDISP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47814695/