Как сделать tlb в delphi из dll

Обновлено: 04.07.2024

Цитата или краткий комментарий:

Содержит полезные и(или) интересные сведения
[1] 15 78.9%
Ничего особенно нового и интересного
[2] 1 5.3%
Написано неверно (обязательно укажите почему)
[3] 3 15.8%
Всего проголосовали: 19

Все понятно, материал читается легко
[1] 15 93.8%
Есть неясности в изложении
[2] 1 6.2%
Непонятно написано, трудно читается
[3] 0 0%
Всего проголосовали: 16

Комментарии жителей
Отслеживать это обсуждение

22-06-2008 04:01 при создании дочерней формы из dll, в основной приложении количество дочерних окон все равно не изменяется. вопрос сталкивался ли кто-нибудь с решением данной проблемы.

23-05-2008 14:46 В Dll есть MDIChild форма, на которой я разместил два простых поля tEdit

Вызываю эту форму из основной программе и понимаю, что таб у меня не работает, курсор не перескакивает с одного tEdit на другой, почему так?

15-05-2007 02:05 Очень полезная статья и комментарии.

В исходниках "test_md.zip" к статье содержится ошибка.
В mdidll.dpr два раза объявлены переменные

var
DA : TApplication;
DS : TScreen;

procedure InitPlugin(App, Scr: integer); StdCall;
var DA: TApplication; DS: TScreen;
begin

Локальное объявление убрать.
Иначе программа при выходе виснет.

27-12-2006 13:13 Только жаль что ссылка на исходник автора не работает.

Ссылка исправлена, можете скачивать.

27-12-2006 11:10 Статья написана, нормально. Приведённый код испробовал, работает. Только жаль что ссылка на исходник автора не работает.

25-12-2005 04:52 Если использовать предложенный механизм автора, то действительно, при выходе из приложения выдается Access Violation или другая подобная ошибка.

Чтобы этого избежать, нужно восстановить в DLL ссылку на оригинальный экземпляр Application при выгрузке DLL. Я было разработал метод в DLL для восстановления экземпляра Application, но похоже, не смог найти место, когда его надо вызвать. Если вызывать перед закрытием приложения, то все равно AV остается.

Но вот такой код решил мою проблему.

Это код, который нужно добавить в DLL к коду автора:

procedure DLLEntryPoint(Reason: DWORD);
begin
if Reason = DLL_PROCESS_DETACH then Application:=MyApp;
end;

initialization
MyApp:=Application;
DllProc := @DLLEntryPoint;
end.

С указанными комментариями у меня все замечательно работает!

Дополнения:
- я разрабатывал COM объект. При включении ShareMem - регистрация объекта не производилась (regsvr32 выдавало ошибку);
- "Build with runtime packages" - тоже не дало нужного результата. Кроме того, режим "Build. " и вообще пакеты меня не устраивают по многим причинам;
- так как и в DLL и в приложении используется один Application, то необходимо соблюдать, чтобы названия форм (а возможно, и каких-то других ресурсов) не совпадали. Проще говоря, нельзя создать форму с именем Form1 в DLL, если экземпляр формы с таким именем уже создан в приложении;
- экземпляр TScreen, действительно, передавать в DLL не обязательно;

Вот пожалуй и все.

14-06-2004 14:23 Я использую немного другой подход, при котором у меня глюков пока еще не было ни разу, связанных с открытием дочернего окна. Я передаю Application и форму родитель. При создании нового окна указываю родителем не Application, а главную форму. Конечно до этого я присваиваю Application из DLL Application из главной программы. Пред выходом, естественно, его нужно восстановить.
Если библиотеки были загружены с помощью LoadLibrary, то по завершении программы FreeLibrary вызывать не нужно, иначе, если дочерние окна будут открыты, произойдет ошибка :( DLL все-равно выгрузится системой.

14-05-2004 17:57 И ещё: передавать Screen из библиотеки не нужно, т.к. именно отсюда начинаются проблемы с памятью.

14-05-2004 17:55 И ещё: передавать Screen из библиотеки не нужно, т.к. именно отсюда начинаются проблемы с памятью.

14-05-2004 17:54 И ещё: передавать Screen из библиотеки не нужно, т.к. именно отсюда начинаются проблемы с памятью.

14-05-2004 17:46 Я проверил предложенный автором метод в довольно большом проекте. Все работает без проблем если использовать ShareMem в библиотеке и в вызывающей программе (спасибо Сергею Герасину) и если компилировать библиотеку и вызывающую программу с учётом пакетов RunTime. Конечно, одним щелчком мыши проект на DLL не разделить, приходится кое-что переделывать.

Самое интересное что в тестовом приложении все вробе бы ок, а как подключил модуль к существующему большому проекту - все, борода.

16-05-2003 08:55 Подскажите пожалуйста, как быть если нужно в MDIChild форме (вызываемой из DLL) сделать MainMenu (в дополнение к меню главной формы), и чтобы вызывались функции из DLL (а не функции пункта меню главной формы?

по пунктам.
в ДЛЛ.
0. В Object Inspectore для формы ставите Visible=false;Это
потом поясню
1. Application.Handle проекта присвоить к Application.Handle в DLL
как уже писалось
2.
function GetControl: hWND;
Form1 := TForm1.Create(Application);
Result := Form1.Handle;
GetWindowRect ( Result , wR2);
SetWindowPos ( Result,
HWND_BOTTOM,
wR2.Left,
wR2.Top + Screen.Height,
wR2.Right-wR2.Left,
(wR2.Bottom-wR2.Top)+ Screen.Height,
SWP_HIDEWINDOW);
Form1.Visible:= true;
Form1.Show;

тут пришлось повозиться с Visible и "выкидывать" окно за пределы видимого экрана, чтобы окно не мелькало на экране до того как я его не поставлю на форму приложении.


Теперь в проекте
1.InitDLL(Application.Handle)
2.temphWND := GetControl;
SetParent ( temphWND , Form1.SomePanel.handle );
ShowWindow ( temphWND , SW_SHOW);
SetWindowLong ( temphWND, GWL_STYLE, GetWindowLong
(temphWND,GWL_STYLE)AND (NOT WS_CAPTION) OR
WS_SIZEBOX);
SetWindowLong ( temphWND, GWL_STYLE, MYBORDERSTYLE);
тут каюсь MYBORDERSTYLE подбирал методом тыка, но в любой винде
он правилен, то бишь работает
GetClientRect ( temphWND, wR2);
Form1.SomePanel.Width:=wR2.Right-wR2.Left ;
Form1.SomePanel.Height:=wR2.Bottom-wR2.Top;
SetWindowPos ( temphWND,
HWND_TOP,
0,0,
wR2.Right-wR2.Left,
wR2.Bottom-wR2.Top,
SWP_SHOWWINDOW);

вот вроде и все. получается форма из ДЛЛ на панели формы из приложения. Тут есть много вариаций. Конечно, в ДЛЛ надоть закрывать форму при закрытии ДЛЛ. вот вроде и все. Если будуть вопросы или предложения , то , плиз, пишите.

30-07-2002 12:07 Данная статья очень интересна и полезна. Однако нет необходимоти передавать DLL-ке Application и Screen. Достаточно передать Application.Handle и присвоить к Application.Handle в DLL, как и написал Igor. Это написано в справке Дельфи (справка по Application.Handle). Все эти методы работают очень здорово, если версии Дельфи одинаковы и у DLL и у главного проекта. А вот если скажем DLL нужно сделать в Дельфи 5, а основной проект - в Дельфи 6, то при создании MDIChild-формы в DLL возникает ошибка. Как быть в такой ситуации? И вообще можно ли тут использовать разные версии Дельфи, либо нужно искать другие способы?

05-07-2001 10:35 Дмитрий, это решаемо, только вот зачем? Поскольку в dll передаются объекты(TApplication, TScreen), то рамки применения такой системы ограничиваются одинаковой версией dll и exe. Иначе будут глюки(я проверял) из-за разных вариантов кода у разных VCL. А раз так, то никакого выигрыша от использования dll вместо bpl нету. При этом для последних не требуется никаких лишних телодвижений. Так что для mdi-форм bpl - самое то. Хотя, если таки интересно повозиться с dll, пиши, вышлю пример.

13-03-2001 21:40 Дмитрий, не проверял. Принципиально вопрос решен, а до деталей руки не дошли. ДЛЛ однако. :-) Пошукаю, как время появиться. Опять-же разные версии Дельфи ведут себя по разному с такими трюками. Борланд + Майкрософт - дело тонкое :-)

10-03-2001 16:06 Алексей, а Вы знаете, что в Вашем примере не работает табуляция на форме, которая расположена в Dll. И при появлении хинта на этой же форме возникает ошибка. Я уже не говорю о горячих клавишах.

Может кто-нибудь сможет ответить где лежат корни этих глюков?

20-02-2001 21:52 Привет че-то долбаюсь с inetcpl.cpl ни как не могу запустить диалог содержащийся в ней, я его там Dependency Walker"ом нашел и ни как гад не хочет запускаться в принципе подключая эту библиотеку динамически и запуская из нее этот диалог прога не выдает ошибок и диалог тоже не показывает, помогите плиз

06-12-2000 13:22 На заборе тоже написано. Но мне даже спорить неохота.

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

Не, ребята. Я, наверно, чего-то непонимаю. Ну что за крики о пакетах во всех конфах? Ну фича это для 'экономии' места и унификации. Так пользуйтесь с умом. Никто не пишет крипто чисто на VisualBasic и базу данных целиком на ассемблере. Есть цели и есть средства. Уж ежели пихаешь формы в DLL то надо бы или забыть о лишних килобайтах или писать всю форму без VCL на чистом WinAPI или переписать VCL с расчетом на такое использование или очень глубоко влезть и разбираться в тонкостях механизмов пактов. А уж влезть в тонкости работы системы и компилятора (тут - Делфи) с процессами и DLL - точно придется. (А как вставить иконку в трэй, ну там, где часы?) :о)

Успехов в исследовании.

to Доброжелатель: Мистер. Как вас там. Я ничего не забываю. Я вас ни к чему не принуждаю. Тормозите на своем коннекте, как считаете нужным. Вплоть до установки CP/M-86 с аудиокассет МК-60. Простите за резкость, но ваше замечание - оффтопик.

Сейчас, например, чтобы использовать TControl из другой dll необходимо, либо писать обычный ActiveX, что иногда не красиво, либо компилировать проект с использованием пакетов (помоему пакеты создают единую область объектов, например с использованием пакетов глобальные функции модулей становятся одинаковыми для exe и dll). А нельзя ли создавать TControl из dll?

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Интересует всё что связанно с TLB: методы по извлечению, непосредственное чтение из библиотеки "на лету", и т.д.

2 Ответ от Аскет 2011-01-23 18:38:42

..Или IDL, а не TLB.

В общем суть - Получение списка свойств, методов и событий (а также интерфейсов, констант, и т.д) из ActiveX-контролов.

Это реализовано в: объектных браузерах, средах программирования и некоторых редакторах.
Но "Как?" это осуществляется я лишь догадываюсь.

3 Ответ от chessman 2011-01-26 17:45:37

LoadTypeLib не поможет?

4 Ответ от Аскет 2011-01-26 21:43:57

А можно поподробнее, что за LoadTypeLib?

----------------------------
Собственно "расковырять" контрол и достать из ресурсов эту самую tlb в бинарном формате труда не составляет. Но это совсем не то.

Вот что я понял:
TLB писан на языке IDL и описывает возможности ActiveX.
TLB содержит некую таблицу смещений именованных процедур. Т.е. (с низкоуровневой точки зрения) при обращении к контролу по имени функции, эта таблица перенаправляет на соответствующий физический адрес (смещение).

Насколько я теперь осведомлён, вся "магия" реализуется через интерфейсы IUnknown и, если имеется - IDispatch.
И копать надо именно туда.

Далее идут интерфейсы ITypeLib и ITypeInfo. Информации о них и работе с ними нашёл мало.

Ну и конечный пункт

ITypeInfo.GetFuncDesc(unsigned int index, FUNCDESC FAR* FAR* ppFuncDesc);

5 Ответ от alexii 2011-01-26 23:37:32

В скриптах единственное, что можно сделать — использовать библиотеку «TLBINF32.DLL» (поставлялась в комплекте с Visual Studio и некоторыми другими продуктами). Я, например, взял библиотеку из Microsoft Office 2000 Disk 1 («.\System\tlbinf32.dll»), скопировал в «%SystemRoot%\System32», зарегистрировал:

и пользовался. Документацию к ней можно взять здесь: FILE: Tlbinf32.exe: Справка для Tlbinf32.dll файлов.

Библиотека реализует доступ к Type Library посредством объекта «Tli.TliApplication». Вот Вам простой пример получения списка и регистрации в глобальном пространстве констант из объектов:

Кроме метода «.InterfaceInfoFromObject()» есть и «.TypeLibInfoFromFile()», и «.TypeLibInfoFromRegistry()».

6 Ответ от chessman 2011-01-27 10:55:04 (изменено: chessman, 2011-01-27 10:58:51)

По теме - главное, что тебе нужно получить, это интерфейс ITypeLib. Это как раз возвращает LoadTypeLib, вот ее описание:

Если ITypeLib получен, через него получаешь общее кол-во типов из библиотеке типов и перебираешь их в цикле, получая интерфейс ITypeInfo -

Следующий текст взят из DG.PDF для Delphi6.

Для того чтобы сделать доступной информацию о каком-либо сервере, имеющемся в системе, необходимо импортировать его библиотеку типов.

Есть следующие пути для достижения этой цели:

1. Использование (в IDE Delphi6) диалога Project | Import Type Library для импорта всей доступной информации о типах, объектах и интерфейсах серверов. Это самый предпочтительный способ, так как он позволяет не только импортировать необходимые описания в удобной форме, но также позволяет, при необходимости, генерировать оболочки компонентов для всех соклассов библиотеки, которые не имеют атрибутов Hidden, Restricted или PreDeclID.

2. Использование (в IDE Delphi6) диалога Component | Import ActiveX Control. При этом импортируется такая же информация, как и в предыдущем способе, но оболочки компонентов генерируются для соклассов библиотеки, которые представляют собой элементы ActiveX.

3. Использование утилиты tlibimp.exe, входящей в поставку Delphi, которая предоставляет дополнительные возможности по управлению процессом генерации выходного файла по сравнению с IDE.

Независимо от применяемого способа импорта всегда создается файл с именем TypeLibName_TLB.PAS, где TypeLibName – имя библиотеки типов. Этот файл будет выглядеть так же как и файл, полученный с помощью мастера Delphi – редактора библиотеки типов. Этот файл может повторно создаваться IDE, но вносить в него изменения вручную не рекомендуется.

В дополнение к информации о типах в файле TypeLibName_TLB.PAS могут быть созданы также оболочки (VCL class wrappers) для всех соклассов, имеющихся в библиотеке. Заметим, что при использовании диалога Component | Import ActiveX Control эти оболочки создаются всегда. Если сокласс поддерживает интерфейсы событий, то оболочка создает источник для этого события (event sink), так что можно можно создать свой обработчик этого события так же просто, как это делается для обычных компонент.

Замечание. Для событий объектов COM+ оболочка автоматически не создается. Процесс ее создания в таких случаях описан в “Handling COM+ events” на стр. 35-14 DG.pdf. Более подробную информацию о генерации кода при импортировании библиотеки типов можно найти в разделе “Code generated when you import type library information” на стр. 35-5 DG.pdf.

Утилита TLibImp.exe. Программа TLibImp позволяет генерировать описание библиотеки типов на языке Object Pascal на основе данных, содержащихся в EXE, DLL, OCX или OLB файлах, реализующих СОМ объекты. Формат командной строки:

Usage: TLIBIMP [options] <typelibfile> [options]

- A<suffix> TypeLibrary file suffix (defaults to '_TLB', - A - : no suffix)

- D<path> Output directory

- F<filename> TypeLibrary Output filename (extension ignored)

- N<namespace> C++ namespace name

- X<filename> OCX Wrappers Output filename (extension ignored - C++ only)

Switches: -<letter><state> (defaults are shown below)

- C- Generate C++ import file

- E+ Generate wrapper class for dispinterfaces (C++ only)

- G+ Expose namespace with 'using' statement

- H+ Generate IDE component wrappers for ActiveX Controls

- J- Generate CORBA IDL source file

- K- Generate Pascal CORBA Stubs and Skeletons

- L- Generate IDE component wrappers for OLE Servers

- O+ Generate CoClass Creator wrappers

- P+ Generate Pascal import file

- Q+ Generate 'Register' function for IDE components wrappers

- R+ Generate files for dependent typelibraries

- S+ Map HRESULT stdcall to safecall on dual interfaces (Delphi only)

- T- Map HRESULT stdcall to safecall on all interfaces (Delphi only)

- V- Generate Event wrappers for Server (C++ only)

- W+ Warnings in import file

Пример использования утилиты TLibImp.exe. Для получения паскаль-реализации библиотеки типов, предоставляемой текстовым процессором Microsoft Word, надо выполнить такую команду:

TLibImp MSWord9.olb

В результате будут получены такие файлы:

Теперь осталось только подключить файл Word_TLB.pas к нашему приложению и воспользоваться его описаниями для получения доступа к сервисам редактора Word.

· на языке описания интерфейсов IDL (Interface Definition Language), т.е. в файле с расширением .idl;

· на языке С (.c) с идентификаторами UUID;

· в формате заголовочного файла (.h).

Visual C++ также предоставляет компилятор (MIDL.exe), который и используется утилитой OLE View для генерации файлов двух последних типов (.c, .h).

Синтаксис использования утилиты RegSvr32 с помощью командной строки (Пуск|Выполнить) таков:

regsvr32 [флаг1 [флаг2 . ] имяDll

Флаги обозначают следующее:

/u

Разрегистрация библиотеки. Если флаг /i не указан, то вызывается функция DllUnregisterServer библиотеки.

/i:"string"

В этом случае вызывается функция библиотеки DllInstall. Если флаг /u указан, то функция DllInstall вызывается с первым параметром, равным false, что означает просто разрегистрацию библиотеки. В противном случае первому параметру DllInstall присваивается значение true и функция будет регистрировать библиотеку. Заданная в этом параметре строка string будет в этом случае передана в качестве второго параметра в DllInstall. Если строка не указана, то значение второго параметра – NULL. Если флаг /n не указан, то во всех случаях функции DllRegisterServer или DllUnregisterServer будут также вызваны. Значение, вкладываемое в параметр string, зависит от разработчика библиотеки. С его помощью могут быть реализованы специфические процедуры, связанные с установкой библиотеки.

/n

Указывает на то, что функции DllRegisterServer или DllUnregisterServer вызываться не должны. Этот флаг можно использовать только в комбинации с флагом /i.

/s

/c

regsvr32 dllname.dll

просто зарегистрирует сервер dllname.dll.

Для разрегистрации библиотеки без вызова функции DllUnregister надо использовать такую командную строку

regsvr32 /u /n /i:"uninstall_1" dllname.dll

Это эквивалентно такому вызову DllInstall(false, "uninstall_1") функции DllInstall и в этом случае функция DllUnregisterServer автоматически вызываться не будет.

Borland TLIBIMP Version 5.0 Copyright (c) 1997, 1999 Inprise Corporation

C:\Program Files\Borland\Delphi6\Bin>type idl2pas.bat

rem jre.exe should be in your path and - cp should be set to the location of idl2

rem -mxNumber is the max heap size. This can be increased if the jvm runs out of

Следующий текст взят из DG.PDF для Delphi6.

Для того чтобы сделать доступной информацию о каком-либо сервере, имеющемся в системе, необходимо импортировать его библиотеку типов.

Есть следующие пути для достижения этой цели:

1. Использование (в IDE Delphi6) диалога Project | Import Type Library для импорта всей доступной информации о типах, объектах и интерфейсах серверов. Это самый предпочтительный способ, так как он позволяет не только импортировать необходимые описания в удобной форме, но также позволяет, при необходимости, генерировать оболочки компонентов для всех соклассов библиотеки, которые не имеют атрибутов Hidden, Restricted или PreDeclID.

2. Использование (в IDE Delphi6) диалога Component | Import ActiveX Control. При этом импортируется такая же информация, как и в предыдущем способе, но оболочки компонентов генерируются для соклассов библиотеки, которые представляют собой элементы ActiveX.

3. Использование утилиты tlibimp.exe, входящей в поставку Delphi, которая предоставляет дополнительные возможности по управлению процессом генерации выходного файла по сравнению с IDE.

Независимо от применяемого способа импорта всегда создается файл с именем TypeLibName_TLB.PAS, где TypeLibName – имя библиотеки типов. Этот файл будет выглядеть так же как и файл, полученный с помощью мастера Delphi – редактора библиотеки типов. Этот файл может повторно создаваться IDE, но вносить в него изменения вручную не рекомендуется.

В дополнение к информации о типах в файле TypeLibName_TLB.PAS могут быть созданы также оболочки (VCL class wrappers) для всех соклассов, имеющихся в библиотеке. Заметим, что при использовании диалога Component | Import ActiveX Control эти оболочки создаются всегда. Если сокласс поддерживает интерфейсы событий, то оболочка создает источник для этого события (event sink), так что можно можно создать свой обработчик этого события так же просто, как это делается для обычных компонент.

Замечание. Для событий объектов COM+ оболочка автоматически не создается. Процесс ее создания в таких случаях описан в “Handling COM+ events” на стр. 35-14 DG.pdf. Более подробную информацию о генерации кода при импортировании библиотеки типов можно найти в разделе “Code generated when you import type library information” на стр. 35-5 DG.pdf.

Утилита TLibImp.exe. Программа TLibImp позволяет генерировать описание библиотеки типов на языке Object Pascal на основе данных, содержащихся в EXE, DLL, OCX или OLB файлах, реализующих СОМ объекты. Формат командной строки:

Usage: TLIBIMP [options] <typelibfile> [options]

- A<suffix> TypeLibrary file suffix (defaults to '_TLB', - A - : no suffix)

- D<path> Output directory

- F<filename> TypeLibrary Output filename (extension ignored)

- N<namespace> C++ namespace name

- X<filename> OCX Wrappers Output filename (extension ignored - C++ only)

Switches: -<letter><state> (defaults are shown below)

- C- Generate C++ import file

- E+ Generate wrapper class for dispinterfaces (C++ only)

- G+ Expose namespace with 'using' statement

- H+ Generate IDE component wrappers for ActiveX Controls

- J- Generate CORBA IDL source file

- K- Generate Pascal CORBA Stubs and Skeletons

- L- Generate IDE component wrappers for OLE Servers

- O+ Generate CoClass Creator wrappers

- P+ Generate Pascal import file

- Q+ Generate 'Register' function for IDE components wrappers

- R+ Generate files for dependent typelibraries

- S+ Map HRESULT stdcall to safecall on dual interfaces (Delphi only)

- T- Map HRESULT stdcall to safecall on all interfaces (Delphi only)

- V- Generate Event wrappers for Server (C++ only)

- W+ Warnings in import file

Пример использования утилиты TLibImp.exe. Для получения паскаль-реализации библиотеки типов, предоставляемой текстовым процессором Microsoft Word, надо выполнить такую команду:

TLibImp MSWord9.olb

В результате будут получены такие файлы:

Теперь осталось только подключить файл Word_TLB.pas к нашему приложению и воспользоваться его описаниями для получения доступа к сервисам редактора Word.

· на языке описания интерфейсов IDL (Interface Definition Language), т.е. в файле с расширением .idl;

· на языке С (.c) с идентификаторами UUID;

· в формате заголовочного файла (.h).

Visual C++ также предоставляет компилятор (MIDL.exe), который и используется утилитой OLE View для генерации файлов двух последних типов (.c, .h).

Синтаксис использования утилиты RegSvr32 с помощью командной строки (Пуск|Выполнить) таков:

regsvr32 [флаг1 [флаг2 . ] имяDll

Флаги обозначают следующее:

/u

Разрегистрация библиотеки. Если флаг /i не указан, то вызывается функция DllUnregisterServer библиотеки.

/i:"string"

В этом случае вызывается функция библиотеки DllInstall. Если флаг /u указан, то функция DllInstall вызывается с первым параметром, равным false, что означает просто разрегистрацию библиотеки. В противном случае первому параметру DllInstall присваивается значение true и функция будет регистрировать библиотеку. Заданная в этом параметре строка string будет в этом случае передана в качестве второго параметра в DllInstall. Если строка не указана, то значение второго параметра – NULL. Если флаг /n не указан, то во всех случаях функции DllRegisterServer или DllUnregisterServer будут также вызваны. Значение, вкладываемое в параметр string, зависит от разработчика библиотеки. С его помощью могут быть реализованы специфические процедуры, связанные с установкой библиотеки.

/n

Указывает на то, что функции DllRegisterServer или DllUnregisterServer вызываться не должны. Этот флаг можно использовать только в комбинации с флагом /i.

/s

/c

regsvr32 dllname.dll

просто зарегистрирует сервер dllname.dll.

Для разрегистрации библиотеки без вызова функции DllUnregister надо использовать такую командную строку

regsvr32 /u /n /i:"uninstall_1" dllname.dll

Это эквивалентно такому вызову DllInstall(false, "uninstall_1") функции DllInstall и в этом случае функция DllUnregisterServer автоматически вызываться не будет.

Borland TLIBIMP Version 5.0 Copyright (c) 1997, 1999 Inprise Corporation

C:\Program Files\Borland\Delphi6\Bin>type idl2pas.bat

rem jre.exe should be in your path and - cp should be set to the location of idl2

rem -mxNumber is the max heap size. This can be increased if the jvm runs out of

Читайте также: