Я использую VS2008 для разработки надстройки Excel 2007, в рамках надстройки я хочу использовать API-интерфейс активации для создания экземпляра класса COM.
Странная вещь в том, что я могу успешно создать экземпляр класса COM наОкно 7, сбой buf в Windows XP / 2003.
Вот фрагмент кода
string codeBase = this.GetType().Assembly.CodeBase;
string asmFullPath = new Uri(codeBase).LocalPath;
string comAssemblyPath = Path.GetDirectoryName(asmFullPath);
ACTCTX ac = new ACTCTX();
ac.cbSize = Marshal.SizeOf(typeof(ACTCTX));
ac.lpAssemblyDirectory = comAssemblyPath;
ac.lpSource = Path.Combine(comAssemblyPath, "ComViewer.x.manifest");
ac.dwFlags = ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID;
IntPtr cookie;
IntPtr hActCtx = CreateActCtxW(ref ac);
if (ActivateActCtx(hActCtx, out cookie))
{
try
{
//instantiate COM class
IComViewer = new ComViewerClass();
}
finally
{
DeactivateActCtx(0, cookie);
}
}
else
{
//TODO: Error message.
}
COM написан на C ++, а манифест выглядит так:
В Windows 2003 / XP я обнаружил, что надстройка ищет ComViewer.dll в каталоге c: \ program files \ microsoft Office \ Office 12, а не в каталоге, указанном в lpAssemblyDirectory.
Anyoneможет помочь?заранее спасибо.