У меня есть консольное приложение C ++, к которому я хочу создать форму Windows. Я не хочу использовать MFC, потому что я не знаю как. Вместо этого я использую C # для создания COM DLL (библиотека классов). Когда я распространяю приложение и dll на целевой компьютер, мне нужно зарегистрировать dll так, чтобы приложение могло видеть интерфейс COM и использовать класс, который я создал в dll.
Я знаю, что есть несколько способов сделать это:
Пусть установщик моего приложения использует regasm - я не хочу использовать это по двум причинам: A. Я не знаю, где он находится на целевом ПК (и даже если он где-то существует, мне понравится не пытаться жестко закодировать путь к нему) и B. Я мог бы перераспределить regasm с помощью установщика, но я не уверен, разрешает ли Microsoft это свободно.
Пусть установщик моего приложения использует gacutil - так же, как и выше.
Используйте regasm на компьютере разработчика, чтобы создать файл .reg, а затем заставить установщик приложения выполнить файл .reg. При этом есть две проблемы: A. Я не могу отменить регистрацию dll в случае удаления и B. выполнение .reg вызывает regedit, который спрашивает пользователя, уверен ли он / она в том, хочет ли он / она добавить информацию в реестр - я бы хотел, чтобы это было молчаливым «да» и не позволяло пользователю решать. У regedit нет аргумента / silent, поэтому я перестал использовать это.
Используйте программу установки Inno Setup и зарегистрируйте файл .tlb (флаг regtypelib) библиотеки COM - попытался, и регистрация работает, но приложение все еще не может создать экземпляр класса.
Используйте 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
Спасибо за помощь.