Это мой интерфейс COM:
[id(2)] boolean Init(BSTR User, BSTR Password);
[id(3)] boolean SetBitmap(BSTR szObjectType, IPictureDisp* szBitmap);
Следующие Init()
Функция работает, если интерфейс COM зарегистрирован, или же с манифестами приложения, использующими параллельные сборки (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
вызов функции успешен и работает. В этом случае похоже, что диспетчер не может отправить объект.
Есть идеи о том, что происходит?
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
вместо. Есть и другие проблемы (как указано другими), а также ваш реальный неопубликованный код может иметь даже дополнительные проблемы. Тем не менее, случай, как вы объяснили, может работать нормально, если вы исправите манифест, вы можете использовать RegFreeComPictureDisp
решение с вашими фрагментами кода (клиент, сервер, IDL, отрывок из манифеста) в качестве справки для исправления вашего проекта (Trac, диверсия).
наконец то сумасшедшая ошибка
у нас есть CEF (хромированный) компонент. и он был инициализирован без объекта CEfApp. и вот тут действительно безумная проблема: ActiveX с регистрацией работает нормально. без него проблема отправки. после обычной инициализации CEF (или с отключенной инициализацией CEF) это работает в обоих случаях!