Я использую Delphi и надстройку Express VCL для разработки надстройки Excel COM. Чтобы включить их в свои формы, я использую манифест и контексты активации, как написано в ответе Дэвида Хеффернана:
Применить Windows Тема к надстройке Office Com
Основываясь на связанном сообщении, вот мой код:
var
ActivationContext: TActivationContext;
begin
try
ActivationContext := TActivationContext.Create;
try
ShowMessage('Exception comes after this');
finally
ActivationContext.Free;
end;
except
on E:Exception do
ShowMessage(Format(SErrorString, [E.ClassName, E.Message]));
end;
end;
Диалоговое окно сообщения отображается правильно (тематически!), Но когда вызывается ActivationContext.Free (который вызывает DeactivateActCtx(0, FCookie);
), я получаю следующее исключение:
EExternalException: внешнее исключение C000000D
Обратите внимание, что я вставил ShowMessage в приведенный выше код в демонстрационных целях, обычно я создание и отображение формы с одинаковыми результатами (ошибка).
Как обойти это?
Обновление: Вот манифест, о котором идет речь:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="*"
name="AddinName"
type="win32"
/>
<description>Addin description</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
Файл My Res:
2 24 "XP.manifest"
Код для включения файла res:
{$R XPManifest\xp_manifest.RES}
Важно ли, чтобы AddinName совпадал с именем Delphi проект?
Еще одно замечание: надстройка скомпилирована для 64-битный Excel.