Как клонировать запись реестра OLE / COM для использования с другими настройками - PullRequest
0 голосов
/ 21 сентября 2011

Я написал программу на C #, которая должна взаимодействовать с Catia v5.18 через OLE / COM.Это будет распространенный случай, когда на машине, на которой запущена программа, будет установлено несколько версий Catia.И старше, и новее, и установлены в любом необычном порядке.Последний установленный устанавливает свои параметры в реестре.

Я пытаюсь настроить реестр, чтобы использовать новый дескриптор для подключения только к серверу CNEXT 5.18.Я нашел запись Catia.Application в HKEY_CLASSES_ROOT и запись CLSID.Я сделал их копии и предоставил новый UUID для CLSID и создал следующий файл импорта реестра:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CATIA.Application.v518]
@="OLE CATIA.Application"

[HKEY_CLASSES_ROOT\CATIA.Application.v518\CLSID]
@="{ba3ca493-05fb-4188-a767-f40c03db2672}"

[HKEY_CLASSES_ROOT\CLSID\{ba3ca493-05fb-4188-a767-f40c03db2672}]
@="OLE CATIA.Application" "AppID"="{ba3ca493-05fb-4188-a767-f40c03db2672}"

[HKEY_CLASSES_ROOT\CLSID\{ba3ca493-05fb-4188-a767-f40c03db2672}\LocalServer32]
@="\"C:\\Program Files\\Dassault Systemes\\B18\\intel_a\\code\\bin\\CNEXT.exe\" -env \"CATIA_PLM_Express.V5R18.B18\" -direnv \"C:\\Documents and Settings\\All Users\\Application Data\\DassaultSystemes\\CATEnv\""

[HKEY_CLASSES_ROOT\CLSID\{ba3ca493-05fb-4188-a767-f40c03db2672}\ProgID]
@="CATIA.Application.v518" 

[HKEY_CLASSES_ROOT\CLSID\{ba3ca493-05fb-4188-a767-f40c03db2672}\VersionIndependentProgID]
@="CATIA.Application" 

Я убедился, что импорт работает, но когда я запускаю свое приложение, я сталкиваюсь со следующей ошибкойкогда я пытаюсь подключиться к нему.

System.Runtime.InteropServices.C OMException (0x80080005): Retrieving the COM class factory for component with CLSID {BA3CA493-05FB-4 188-A767-F40C03DB2672} failed due to the following error: 80080005 Server execution failed (Exceptio n from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)

Я в состоянии нормально запустить эту программу при обычной установке с использованием "CATIA.Application" и "CATIA.Application.1", но вот кодЯ использую для подключения к приложению, если это имеет значение:

public CatiaApplication() {

  Type catia_program_id = Type.GetTypeFromProgID( "CATIA.Application.v518" );

  try {
    this._instance = (Application)Activator.CreateInstance( catia_program_id );
  }
  catch( Exception ex ) {
    throw new ApplicationException( "Failed to access Catia Application: " + ex.ToString());
  }
}

У кого-нибудь есть идеи?Я не пытался перезагрузить окно, но похоже, что изменения вступают в силу немедленно.

1 Ответ

1 голос
/ 27 сентября 2011

Разве это не должно быть вместо этого?

[HKEY_CLASSES_ROOT\CATIA.Application.v518]
"CLSID"="{ba3ca493-05fb-4188-a767-f40c03db2672}"

где вы написали:

[HKEY_CLASSES_ROOT\CATIA.Application.v518\CLSID]
@="{ba3ca493-05fb-4188-a767-f40c03db2672}"
...