Как молча зарегистрировать сборку COM на компьютере WinXP - PullRequest
1 голос
/ 22 апреля 2009

У меня есть консольное приложение C ++, к которому я хочу создать форму Windows. Я не хочу использовать MFC, потому что я не знаю как. Вместо этого я использую C # для создания COM DLL (библиотека классов). Когда я распространяю приложение и dll на целевой компьютер, мне нужно зарегистрировать dll так, чтобы приложение могло видеть интерфейс COM и использовать класс, который я создал в dll.

Я знаю, что есть несколько способов сделать это:

  1. Пусть установщик моего приложения использует regasm - я не хочу использовать это по двум причинам: A. Я не знаю, где он находится на целевом ПК (и даже если он где-то существует, мне понравится не пытаться жестко закодировать путь к нему) и B. Я мог бы перераспределить regasm с помощью установщика, но я не уверен, разрешает ли Microsoft это свободно.

  2. Пусть установщик моего приложения использует gacutil - так же, как и выше.

  3. Используйте regasm на компьютере разработчика, чтобы создать файл .reg, а затем заставить установщик приложения выполнить файл .reg. При этом есть две проблемы: A. Я не могу отменить регистрацию dll в случае удаления и B. выполнение .reg вызывает regedit, который спрашивает пользователя, уверен ли он / она в том, хочет ли он / она добавить информацию в реестр - я бы хотел, чтобы это было молчаливым «да» и не позволяло пользователю решать. У regedit нет аргумента / silent, поэтому я перестал использовать это.

  4. Используйте программу установки Inno Setup и зарегистрируйте файл .tlb (флаг regtypelib) библиотеки COM - попытался, и регистрация работает, но приложение все еще не может создать экземпляр класса.

  5. Используйте ClickOnce для развертывания приложения - это не вариант, потому что я хотел бы, чтобы мое приложение находилось в определенной папке на диске, а не в пользовательской папке Documents and Settings.

Следует отметить, что я использую Express-версии для C ++ и C # Visual Studio 9.0. Существуют ли другие способы регистрации библиотеки COM на компьютере под управлением Windows XP?

Редактировать - Обновить :

Я попробовал COM без регистрации, руководствуясь приведенным здесь примером http://msdn.microsoft.com/en-us/library/ms973915.aspx. Оставляя в стороне проблемы, которые у меня были с манифестом, я наконец-то получил приложение, чтобы «увидеть» COM dll (без регистрации). Манифесты сейчас работают. К сожалению, вызов CoCreateInstance () теперь возвращает E_OUTOFMEMORY (0x8007000E). Следует отметить, что COM-библиотека DLL имеет два класса, но только для одного я создаю видимый COM-интерфейс (другой является классом для формы, и я хочу, чтобы он был закрытым). Может ли это быть проблемой? Вот некоторый код:

#import "MyGUI_DLL.tlb" raw_interfaces_only named_guids
[…]
static MyGUI_DLL::MyGUI * g = NULL;
r = CoInitializeEx(NULL, COINIT_MULTITHREADED);
// r is S_OK here
r = CoCreateInstance(MyGUI_DLL::CLSID_MyGUIClass, NULL, CLSCTX_INPROC_SERVER, MyGUI_DLL::IID_MyGUI, reinterpret_cast<void**>(&g));
// r returns E_OUTOFMEMORY

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2009

В ваших сценариях, где вы обрабатываете сборку взаимодействия, вы игнорируете тот факт, что вам все равно нужно правильно установить компонент COM.

Если вы хотите сделать это с помощью кода, то вам нужно вызвать функцию API LoadTypeLib через слой P / Invoke.

Тем не менее, я думаю, что лучшим решением будет COM без регистрации. Здесь есть хорошая статья:

http://msdn.microsoft.com/en-us/magazine/cc188708.aspx

0 голосов
/ 22 апреля 2009

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

...