![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Всем привет!
Мне нужно сделать одну программку сл структуры: всё вычисления на C++ ATL DLL, а интерфейс в C#. Расскажите или дайте какие-нибудь ссылки про то как создавать ATL DLL на C++? Про то как взаимодействовать из C# с ATL DLL? У меня стоит VS2005. Заранее спасибо! |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Elfet,
Про создание ATL-проекта в VS гугль поможет, я думаю. А взаимодействие осуществляется так же как и с любой другой COM-сборкой...добавляете в References из вкладки COM (dll должна быть зарегистрирована в системе) и используете её классы как хотите. -------------------- СУВ, Partizan. |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Ещё я что-то видел про DllImport - это что?
А ещё как зарегистрировать в системе эту dll? Можно ли просто в каталоге с папкой эту длл положить? |
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 5 Всего: 36 |
Elfet,
DllImport нужен в случае обычных функций, которые экспортируюся из exe/dll, но не принадлежат com-обьекту При создании COM, ATL-визард сам его регистрирует в системе или можно как обычно, regsvr32 mycom.dll |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Это как - как обычно? Добавлено через 38 секунд Можно ли как-нибудь эту ATL DLL бросить в папку с exe-шкой и всё? |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Elfet, а с чем связано такое рвение использовать именно ATL? Обычная библиотека не подойдёт?
-------------------- СУВ, Partizan. |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Что за обычная библиотека? Чем она отличается?
А вообще мне нужно делать на C++ в ATL по заданию. |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 11 Всего: 92 |
ATL предназначенна для создания COM-объектов. Через DllImport, ну можно..
![]() Так вот - COM объект в любом случае надо регистрировать в системе. Благо, ATL генерит нужные функции для авторегистрации, так что, действительно, сработает стандартный запуск regsvr32 mylib.dll. А после - обычный COm Reference. |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Любитель, ну почему же "не влезать, убьёт" =) Совсем даже не убьёт
![]() Elfet, в общем, для начала, советую ознакомиться с тем, что такое ATL, и как создаются ATL объекты в студии...ну а потом по ситуации - спрашивать тут ![]() -------------------- СУВ, Partizan. |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 11 Всего: 92 |
Ну, если человек не знает ничего о COM (раз не знаком с regsvr32 - то и с COM в целом, я думаю тоже). То работать с ним вручную...
На всякий случай: речь шла именно про работу с помощью DllImport с COM. А не про использование ДллИмпорта как такового. Т. е. DllGetClassObject/QueryInterface. |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Любитель, я так и понял) Но ничего особо смертельного там нет) Я предложил человеку первый шаг )
з.ы. кстати говоря, я недавно натыкался у кого-то в блоге на реализацию работы с COM без регистрации сборки...думаю, если понадобится - гугль поможет найти... -------------------- СУВ, Partizan. |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 11 Всего: 92 |
Ну.. Если нам известен интерфейс COM-объектов, то работа очевидна. Получаем объект с помощью DllGetClassObject (здесь только CLSID надо правильный передать), затем QueryInteface (аналогично). И кастим к нашему интерфейсу. Юзаем методы.
Если интерфейс неизвестен, то получить его без регистрации невозможно. |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Любитель, да, всё так
![]() Elfet Инфы в топике уже предостаточно ;) -------------------- СУВ, Partizan. |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Да, всём спасибо!
А есть ещё какие-нибудь варианты кроме ATL DLL для написания вычислительной части программы на C++? |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Elfet, Ну да....как бы создать обычную dll-ку, не связываясь с COM/ATL, и просто дёргая функции через DllImport
-------------------- СУВ, Partizan. |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
А чем они вообще отличаются? с COM/ATL и без?
|
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 11 Всего: 92 |
Одно дело длл-ка, которая экспортирует просто какие-то функции и другое - COM-сборка. Строго говоря, COM тоже экспортирует функции, но жёстко определённые. А вообще - прочитайте хотя бы в двух словах про технологию COM, ну и 9раз таково условие) в специфике использования в ATL.
|
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
А дайте что-нибудь про COM почитать?
![]() |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Elfet,
http://www.codeproject.com/KB/COM/Inside_COM.aspx http://files.zipsites.ru/books/copmuters/p...ks/com_book.zip -------------------- СУВ, Partizan. |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
спасибо!
![]() |
|||
|
||||
Elfet |
|
||||||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Не хочу разводит много тем. Спрошу тут:
Сделал этот ATL DLL я. Добавил в неё класс: CSolver. Зарегистрировал в системе. Добавил в проект на C#. Но вот тут проблема создаю объект: solver = new SFCLib.SolverClass(); А вот свойства его публичные не доступны :/ Что я те так делаю? Код: Solver.h
Solver.cpp
Form.cs
|
||||||
|
|||||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Elfet, видимо idl-декларации не хватает + как правило геттеры называют типа get_Progress(), а сеттеры - set_Progress()
http://www.rsdn.ru/forum/message/158854.all.aspx -------------------- СУВ, Partizan. |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Я вообще не использую никакие интерфейсы. Можно ли как-то просто получить доступ к классу в этой dll? Создать экземпляр класса?
|
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Elfet, ну так у вас же всё создаётся....Просто Interop-сборка генерируется по tlb-шке, которая, в свою очередь появляется из idl-декларации...
у вас в ATL проекте есть файл ИМЯ_ПРОЕКТА.idl - это и есть idl-декларация вашего класса -------------------- СУВ, Partizan. |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
И что туда нужно добавить?
|
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
-------------------- СУВ, Partizan. |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 11 Всего: 92 |
Лучше вручную ничего не пиши. Там в Class view, выбираешь add method, add property и тебе пропишется и idl для интерфейса, и заглушка для реализации. ATL всё-таки в своё время неплохая вещь была ;) |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Любитель, значит сейчас всё-таки какая-то замена ATL пришла?
|
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 11 Всего: 92 |
Ээ.. COM просто мало кто теперь юзает (если именно в плане создания COM-серверов). Да и тем более, при возможности, на .NEt это сделать гораздо проще.
|
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Любитель, это не помогло :(
Добавлено через 6 минут и 52 секунды Добавил метод - всё равно его не видно. с HRESULT вообще не хочет компилироваться. |
|||
|
||||
Partizan |
|
||||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Если пишешь ShellExtensions без COM никуда ;)
Elfet, какая студия у Вас? -------------------- СУВ, Partizan. |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 11 Всего: 92 |
Покажи, что в idl получилось-то? И да - метод явно должен возвращать HRESULT в любом случае. Что не компилируется-то? Что выдаёт? Да. Сейчас многое на COM основано в винде. И аддины для студии/оффиса - это тоже сейчас (пока) COM. Но, как я уже сказал зачастую сейчас уже COM-сервера девелопят на дотНете. Да и новые АПИ уже редко на COM основывают. Хотя, конечно АТЛ умирать не собирается. Но и развиваться ИМХО тоже. В висте, Win7, насколько я понимаю, все новые АПИ уже не комовские. Хотя точно утверждать тут не берусь, ибо не знаю ![]() |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
VS2005.
Вроде разобрался. Всем спасибо!
А можно как нибудь возвращать значения не через параметры? |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 11 Всего: 92 |
Явно (в сишном коде) - нет. С точки зрения обращения к COM-серверу из клиента - можно один из параметров пометить как retval в IDL (в ATL Class Wizard-е можно выбрать галку для одного из параметров). Это и будет возвращаемое значение. |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Любитель, да, я так и сделал
![]() Жутко неудобная это вещь COm оказалась ![]() Добавлено через 9 минут и 8 секунд Всё так я не очень понимаю. Можно ли как-то без использования COM сделать ядро на C++, а интерфейс на C#? C# - слишком медленный для больших вычислений. |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Elfet, ну конечно можно
![]() -------------------- СУВ, Partizan. |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Что-то я не до втыкаю, как эту обычную дллку писать на C++? :(
|
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
-------------------- СУВ, Partizan. |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
спасибо!
|
|||
|
||||
ForveAvar |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 6.8.2009 Репутация: нет Всего: 1 |
Доброго времени суток!!!!
У мну тут проблема такая же как у автора....при создании объекта для получения функций и переменных из класа в com, я не могу к ним доступиться.....подскажите что нужно дописать Calc.h
Calc.cpp
Вызов
Com зарегистрированный и прибавленный к ссилкам проекта. Помогите новичку ![]() |
||||||
|
|||||||
ForveAvar |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 6.8.2009 Репутация: нет Всего: 1 |
Хотя бы кто-то помогите.....очень нужно....третий день не могу разобраться
![]() Это сообщение отредактировал(а) ForveAvar - 12.10.2009, 17:47 |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |