Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Код функции DllRegisterServer в проекте библиотеки DLL на VB

Код функции DllRegisterServer в проекте библиотеки DLL на VB

Ответ
Поиск в этой теме
Непрочитано 27.10.2021, 05:30 #1
Код функции DllRegisterServer в проекте библиотеки DLL на VB
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,079

Помогите создать функцию DllRegisterServer в проекте библиотеки DLL на Visual Basic VS2019.
Переместил некоторые функции из медленного VBA в библиотеку DLL написанную на Visual Basic VS2019.
Скомпилировал библиотеку. При регистрации библиотеки командой Regsrv32 появляется ошибка: "Модуль загружен, но точка входа DLLRegisterServer не найдена".
Посмотрел в инете, оказывается внутри самой библиотеки должна быть такая функция DLLRegisterServer.
Задача: после выполнения команды "regsvr32 Библиотека.dll" эта самая библиотека dll должна появиться в окне Tools -> References в VBA Excel.
Что это за функция DllRegisterServer и что надо прописывать в этой функции?

Последний раз редактировалось МишаИнженер, 27.10.2021 в 05:57.
Просмотров: 3795
 
Непрочитано 27.10.2021, 07:40
#2
trir


 
Регистрация: 18.12.2010
Сообщений: 5,050


https://docs.microsoft.com/ru-ru/pre...acsy(v=vs.100)
trir вне форума  
 
Непрочитано 27.10.2021, 07:41
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,829


https://www.google.com/search?q=visu...client=gws-wiz :?:
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.10.2021, 10:22
#4
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Нашел что библиотеки COM DLL надо регистрировать с помощью программы RegAsm.exe
Цитата:
Чтобы зарегистрировать .NET DLL, вам нужно использовать Regasm.exe вместо regsvr32.exe. Regasm.exe находится в C:\Windows\Microsoft.NET\Framework\v4.0.30319 (или аналогично в зависимости от версии .NET).
Также обязательно укажите параметр /codebase или сделайте assembly строго именованным, иначе COM не сможет найти DLL.
Запустил команду с правами администратора и получил ответ:
Цитата:
RegAsm : warning RA0000 : Регистрация неподписанной сборки с использованием пара
метра /codebase может вызвать конфликт данной сборки с другими приложениями, кот
орые могут быть установлены на том же компьютере. Параметр /codebase предназначе
н только для подписанных сборок. Присвойте сборке строгое имя и повторите регист
рацию.
Типы зарегистрированы успешно
Что значит: "Присвойте сборке строгое имя"? У меня в сборке все элементы имеют имя.
Однако в Tools->References моя библиотека не видна. И если вручную попробовать её задать, то пишет что не может зарегистрировать данную DLL
МишаИнженер вне форума  
 
Непрочитано 27.10.2021, 10:27
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,829


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Что значит: "Присвойте сборке строгое имя"?
Это значит "здравствуй, гугел"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.10.2021, 10:28
1 | 1 #6
trir


 
Регистрация: 18.12.2010
Сообщений: 5,050


там надо просто галочку поставить
Миниатюры
Нажмите на изображение для увеличения
Название: com_net.PNG
Просмотров: 65
Размер:	7.6 Кб
ID:	242120  
trir вне форума  
 
Автор темы   Непрочитано 27.10.2021, 10:52
#7
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Удалось зарегистрировать библиотеку со следующим кодом:
Код:
[Выделить все]
namespace ClassLibrary7
{
    public class Class1
    {
        public static int Сумма(int A, int B)
        {
            return A + B;
        }
    }
}
Эта библиотека ClassLibrary7 видна в Tools->References Excel
Для этого 1) создал проект типа "C# динамическая библиотека DLL" (точно не помню)
2) включил опцию "Зарегистрировать для взаимодействия COM" в ветке "СБОРКА" окна "Свойства"
3) может ещё что-то включил (не помню)
Но ни одного метода этой библиотеки в окне "Object Browser" Excel не видно
Хотя должна быть видна функция "Сумма" (смотрите код выше)
И компилятор выдал предупреждение:
Цитата:
Предупреждение "C:\Users\user\source\repos\ClassLibrary7\ClassLibrary7\bin\Debug\ClassLibrary7.dll" не содержит типы, которые могут быть зарегистрированы для взаимодействия объектов COM.
Как задать такой тип данных clСумма, чтобы он был виден в коде VBA:
Код:
[Выделить все]
Dim objСумма As New clСумма
МишаИнженер вне форума  
 
Непрочитано 27.10.2021, 10:56
1 | #8
trir


 
Регистрация: 18.12.2010
Сообщений: 5,050


наивный, это же COM
https://docs.microsoft.com/ru-ru/dot...mple-com-class
trir вне форума  
 
Автор темы   Непрочитано 27.10.2021, 11:26
#9
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Изменил код в сборке на следующий:
Код:
[Выделить все]
namespace ClassLibrary7
{
    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
    public interface clСуммаInterface
    {
    }

    [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
        InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface clСуммаEvents
    {
    }

    [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
        ClassInterface(ClassInterfaceType.None),
        ComSourceInterfaces(typeof(clСуммаEvents))]
    public class clСумма : clСуммаInterface
    {
        public int Сумма(int A, int B)
        {
            return A + B;
        }
    }
}
Вызвал команду "Пересобрать сборку", так как команда "Собрать сборку" выдавала ошибку о правах доступа.
Теперь в окне "Object Browser" Excel стал виден класс clСумма. Это замечательно, спасибо trir!
Однако метод Сумма в окне не виден.
Что надо сделать чтобы метод Сумма стал виден и доступен в Excel?
МишаИнженер вне форума  
 
Непрочитано 27.10.2021, 11:32
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,829


Возможно, сделать класс статическим со всеми вытекающими.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.10.2021, 11:38
#11
trir


 
Регистрация: 18.12.2010
Сообщений: 5,050


Цитата:
Однако метод Сумма в окне не виден
его же в интерфейсе нет
trir вне форума  
 
Автор темы   Непрочитано 27.10.2021, 11:44
#12
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


В справке: https://docs.microsoft.com/ru-ru/dot...mple-com-class
Написано:
Цитата:
Чтобы предоставить свойства и методы COM, их необходимо объявить в интерфейсе класса, пометить атрибутом DispId и реализовать в классе. Порядок объявления членов в интерфейсе — это порядок, используемый для виртуальной таблицы COM.
Но Visual Studio не понимает что такое DispId и кода примера не могу найти
Согласно тексту справки надо объявить метод Сумма в разделе интерфейса класса
Что-то типа:
Код:
[Выделить все]
    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
    public interface clСуммаInterface
    {
        DispId Сумма
    }
А потом описать этот метод в теле класса. Что у меня уже сделано
Но библиотека не компилируется из-за ошибок:
Цитата:
Ошибка CS0246 Не удалось найти тип или имя пространства имен "DispId" (возможно, отсутствует директива using или ссылка на сборку)
Ошибка CS0525 Интерфейсы не могут содержать поля экземпляра
Еще не понятно про это:
Цитата:
Порядок объявления членов в интерфейсе — это порядок, используемый для виртуальной таблицы COM
Что это за порядок таблицы?
МишаИнженер вне форума  
 
Непрочитано 27.10.2021, 11:54
1 | #13
trir


 
Регистрация: 18.12.2010
Сообщений: 5,050


https://ru.stackoverflow.com/questio...-%D0%B8-dispid
https://docs.microsoft.com/ru-ru/dot...e?view=net-5.0
https://docs.microsoft.com/en-us/pre...spid-constants
trir вне форума  
 
Автор темы   Непрочитано 27.10.2021, 12:14
#14
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Сделал такой код: (ошибок и подчеркиваний нету):
Код:
[Выделить все]
namespace ClassLibrary7
{
    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
    public interface clСуммаInterface
    {
        [DispId(0)]
        int Сумма { get; }
    }

    [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
        InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface clСуммаEvents
    {
    }

    [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
        ClassInterface(ClassInterfaceType.None),
        ComSourceInterfaces(typeof(clСуммаEvents))]
    public class clСумма : clСуммаInterface
    {
        [DispId(0)]
        public int Сумма(int A, int B)
        {
            return A + B;
        }
    }
}
При компиляции выходит ошибка:
Цитата:
Ошибка CS0535 "clСумма" не реализует член интерфейса "clСуммаInterface.Сумма"
Что это значит?
МишаИнженер вне форума  
 
Непрочитано 27.10.2021, 12:19
1 | #15
trir


 
Регистрация: 18.12.2010
Сообщений: 5,050


пиши [DispId(1)]
и
Код:
[Выделить все]
 
    public interface clСуммаInterface
    {
        [DispId(1)]
        int Сумма(int A, int B);
    }
trir вне форума  
 
Автор темы   Непрочитано 27.10.2021, 12:48
#16
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Спасибо trir! Все заработало!
Код:
[Выделить все]
namespace ClassLibrary7
{
    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
    public interface clСуммаInterface
    {
        [DispId(1)]
        int Сумма (int A, int B);

    }

    [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
        InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface clСуммаEvents
    {
    }

    [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
        ClassInterface(ClassInterfaceType.None),
        ComSourceInterfaces(typeof(clСуммаEvents))]
    public class clСумма: clСуммаInterface
    {
        [DispId(1)]
        public int Сумма(int A, int B)
        {
            return A + B;
        }
    }
}
Теперь у класса clСумма в Excel виден метод Сумма
И такая програмка в Excel:
Код:
[Выделить все]
Private Sub ComButton3_Сумма_Click()
Dim objСумма As New clСумма, dСум As Double
   Set objСумма = New clСумма
   dСум = objСумма.Сумма(8, 8)
   MsgBox " Сумма равна " & dСум
End Sub
Выдает ответ 16!
Теперь можно писать библиотеку для VBA на языке C#
Почему только библиотека называется: "C:\Users\user\source\repos\ClassLibrary7\ClassLibrary7\bin\Debug\ClassLibrary7.tlb"?
Почему у файла библиотеки расширение tlb вместо dll?
МишаИнженер вне форума  
 
Непрочитано 27.10.2021, 12:52
1 | #17
trir


 
Регистрация: 18.12.2010
Сообщений: 5,050


не вместо, а дополнительно
tlb это библиотека типов, там описание типов для COM
https://docs.microsoft.com/ru-ru/pre...20c3(v=vs.100)

кстати [DispId(1)] возможно писать не обязательно
trir вне форума  
 
Автор темы   Непрочитано 27.10.2021, 12:55
#18
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Что то ссылка не открывается
МишаИнженер вне форума  
 
Непрочитано 27.10.2021, 12:57
#19
trir


 
Регистрация: 18.12.2010
Сообщений: 5,050


исправил, конечная скобка постоянно отваливается
trir вне форума  
 
Автор темы   Непрочитано 27.10.2021, 13:08
#20
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Да можно и без DispId!
Вот такой код тоже работает:
Код:
[Выделить все]
namespace ClassLibrary7
{
    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
    public interface clСуммаInterface
    {
        int Сумма (int A, int B);
        int Квадрат (int A);
    }

    [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
        InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface clСуммаEvents
    {
    }

    [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
        ClassInterface(ClassInterfaceType.None),
        ComSourceInterfaces(typeof(clСуммаEvents))]
    public class clСумма: clСуммаInterface
    {
        public int Сумма(int A, int B)
        {
            return A + B;
        }
        public int Квадрат(int A)
        {
            return A*A;
        }
    }
}
Функция VBA:
Код:
[Выделить все]
Private Sub ComButton4_Квадрат_Click()
Dim objСумма As New clСумма, dКвадрик As Double
   Set objСумма = New clСумма
   dКвадрик = objСумма.Квадрат(8)
   MsgBox "Квадрат равен " & dКвадрик
End Sub
Выдает ответ 64!
Спасибо большое trir! Ты мне очень помог!
А на Visual Basic получается нельзя создать такую COM NET библиотеку?
МишаИнженер вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Код функции DllRegisterServer в проекте библиотеки DLL на VB

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать масштабирование с предпросмотром (как в дефолтной функции автокада) valerik88 LISP 24 24.07.2016 20:52
Функции формы элемента. Обясните пожалуйста Nursul85 Расчетные программы 4 23.11.2015 09:12
Autolisp многократный запуск функции protorgovec LISP 3 14.09.2015 08:31
Интеллектуальные средства для электронной библиотеки Сергей Ружинский Прочее. Программное обеспечение 8 03.12.2013 17:22
Странности функции rtos FWA Программирование 2 16.02.2005 11:37