Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
HOME_X Member Откуда: Сообщений: 2639 |
Доброго дня господа ! Цель - Создание DLL для использования НЕ только DELPHI-ой Имею Unit Interface ---------------------------------------------- unit InterfaceList; interface type IMyInterface = Interface ['{0806339A-4EDD-48A5-A60A-54E6E9AF94E1}'] function Substr(Const aStr: WideString; Index, Count: Integer): WideString; end; implementation end. ---------------------------------------------- Unit своего объекта ---------------------------------------------- unit ObjectList; interface uses Dialogs, InterfaceList; type TMyClass = class(TInterfacedObject, IMyInterface) private protected public destructor Destroy; override; function Substr(Const aStr: WideString; Index, Count: Integer): WideString; end; {$R *.res} implementation function TMyClass.Substr(Const aStr: WideString; Index, Count: Integer): WideString; begin Result:=Copy(aStr,Index,Count); end; destructor TMyClass.Destroy; begin ShowMessage('Destroy'); inherited; end; end. ---------------------------------------------- Unit Dll-Library ---------------------------------------------- library DllLibrary; uses ComServ, InterfaceList in 'InterfaceList.pas', ObjectList in 'ObjectList.pas'; {$R *.res} function CreateMyClass: IMyInterface; stdcall; begin Result:=TMyClass.Create; end; function ReturnValue: Integer; stdcall; begin Result:=100; end; exports CreateMyClass, ReturnValue, DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer; begin end. ---------------------------------------------- Unit инициирующий вызов ---------------------------------------------- unit DllMain; interface uses Forms, StdCtrls, Controls, Classes, InterfaceList, SysUtils, Dialogs; type TfrMain = class(TForm) edMain: TEdit; lbMain: TLabel; btMain: TButton; Button1: TButton; procedure btMainClick(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var frMain: TfrMain; function CreateMyClass: IMyInterface; stdcall; external 'DllLibrary.dll'; function ReturnValue: Integer; stdcall; external 'DllLibrary.dll' implementation {$R *.dfm} procedure TfrMain.btMainClick(Sender: TObject); var dllObject: IMyInterface; begin dllObject:=CreateMyClass; lbMain.Caption:=dllObject.Substr(edMain.Text,1,10); end; procedure TfrMain.Button1Click(Sender: TObject); begin ShowMessage(IntToStr(ReturnValue)); end; end. ---------------------------------------------- Возникли вопросы - зачем создан дополнительный класс IMyInterface,разве невозможно сослаться непосредственно на TMyClass. Поясните пожалуйста ... - как вызвать функцию ReturnValue (даже не класс) из VBS VBS - скрипт прилагаю ---------------------------------------------- Dim lb On Error Resume Next Err.Clear MsgBox "Create Dll" Set lb = CreateObject("DllLibrary.ReturnValue") MsgBox Err.Source & "_" & Err.Description & "_" & Err.Number On Error Goto 0 MsgBox "Exit" ---------------------------------------------- Заранее благодарен ! |
5 сен 19, 23:29 [21964994] Ответить | Цитировать Сообщить модератору |
kealon(Ruslan) Member Откуда: Нижневартовск Сообщений: 6255 |
HOME_X, VBScript умеет работать только с объектами автоматизации, т.е. интерфейсом IDispatch для этого в дельфи нужно создать ActiveX library, добавить объект автоматизации - с этого и нужно начинать, а не с формочки эта dll-ка эскпортирует сервисные функции, которые и используются системой для созданния объекта (DllGetClassObject) в этом случае всю черновую работу по созданию библиотеки типов и интерфейсов дельфи возьмёт на себя, на начальнм этапе в эти кишки лезть не стоит |
6 сен 19, 00:06 [21965009] Ответить | Цитировать Сообщить модератору |
HOME_X Member Откуда: Сообщений: 2639 |
kealon(Ruslan), Не могли бы скинуть ссылку на простой пример Или на основании приведенного кода сделать правильные изменения Не приходилось такое делать Спасибо |
6 сен 19, 01:25 [21965031] Ответить | Цитировать Сообщить модератору |
kealon(Ruslan) Member Откуда: Нижневартовск Сообщений: 6255 |
HOME_X, там праткически ничего не менялось с начальных версий дельфи - тынц в вашем случае обязательно надо добавлять галочку "Mark interface Oleautomation" |
6 сен 19, 08:03 [21965055] Ответить | Цитировать Сообщить модератору |
tunknown Member Откуда: Сообщений: 766 |
На эту тему существует dynawrapNt. Ещё здесь упоминание. Возможно, полезным будет статья Adding Active Scripting to your Delphi Win32 application. Если не секрет, то почему нужно вызывать именно из vbscript? |
6 сен 19, 09:24 [21965082] Ответить | Цитировать Сообщить модератору |
kealon(Ruslan) Member Откуда: Нижневартовск Сообщений: 6255 |
tunknown, на русском есть более ранняя и понятная статья |
6 сен 19, 09:41 [21965101] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3791 |
это еще можно глянуть: http://www.delphisources.ru/pages/faq/base/com_automation.html в своё время оказалась самой информативной |
6 сен 19, 10:15 [21965130] Ответить | Цитировать Сообщить модератору |
Кроик Семён Member Откуда: СПб --> Dortmund Сообщений: 6697 |
HOME_X, А еще можно было бы экспортировать обычные функции, первым параметром бы в которых шел бы handle обьекта класса, а далее обычные параметры. Зачем интерфейсы вообще? |
6 сен 19, 11:01 [21965170] Ответить | Цитировать Сообщить модератору |
Кроик Семён Member Откуда: СПб --> Dortmund Сообщений: 6697 |
а сорри, вот что нагуглилось: "You could only do this (possibly) if it was a COM object. VBScript does not support calling normal API functions" |
6 сен 19, 11:18 [21965183] Ответить | Цитировать Сообщить модератору |
Василий 2 Member Откуда: Сообщений: 1016 |
Басик же ущербный, а басик скрипт ущербный вдвойне, чего вы от него хотите |
6 сен 19, 14:23 [21965379] Ответить | Цитировать Сообщить модератору |
HOME_X Member Откуда: Сообщений: 2639 |
Спасибо - работаю еще вопросы - будет ли COM объект работать с простейшим вызовом типа Private Declare Function test1 Lib "D:\\testdll.dll" Alias "Square1" (ByVal n As Double, ByRef out As Double) As Double - возможен ли его запуск из JAR библиотек (JDK 7-8) - возможна ли работа без регистрации regsvr32.exe Не имею допуск к реестра ПК - просто ложу DLL в любой каталог определенный в PATH сессии пользователя Спасибо |
||
7 сен 19, 14:52 [21965944] Ответить | Цитировать Сообщить модератору |
HOME_X Member Откуда: Сообщений: 2639 |
Тоже думал над этим У Вас есть реальный и простой пример ? Сбросьте как видете ситцуацию попробую Может чтобы было красивенько ....и профессиональненко, для этого сделали |
||
7 сен 19, 14:55 [21965945] Ответить | Цитировать Сообщить модератору |
HOME_X Member Откуда: Сообщений: 2639 |
Ну что Вам ответить - МАЕМО ЩО МАЕМО !!!!!!! P.S. Я бы оставил вообще один язык программирования - РУССССССКИЙ |
||
7 сен 19, 15:19 [21965959] Ответить | Цитировать Сообщить модератору |
Gator Member Откуда: Москва Сообщений: 14980 |
|
||
7 сен 19, 17:43 [21966015] Ответить | Цитировать Сообщить модератору |
Гаджимурадов Рустам Member Откуда: Сообщений: 62419 |
1C же есть, мегапопулярный и распространенный в своей нише. Posted via ActualForum NNTP Server 1.5 |
7 сен 19, 18:13 [21966033] Ответить | Цитировать Сообщить модератору |
HOME_X Member Откуда: Сообщений: 2639 |
Вроде все получилось с указанной Вами статьей - спасибо !!!!!!! Добавлю что регистрацию DLL в Win7 необходимо проводить с правами админа (ну если типа кто забыл) Исследовал Win - реестр - GUID и путь к dll - найден, но имя классов не обнаружил ? Таким образом вопрос, как применительно к статье "тынц" (имена классов я БЛЕЛ четко) следует писать вызов из VBS (обилие классов меня смутило и то что не нашел эти имена в сис. реестре) Dim lb On Error Resume Next Err.Clear MsgBox "Create Dll" Set lb = CreateObject("как писать здесь ????????????") MsgBox Err.Source & "_" & Err.Description & "_" & Err.Number On Error Goto 0 MsgBox "Exit" Спасибо |
||
7 сен 19, 21:33 [21966129] Ответить | Цитировать Сообщить модератору |
HOME_X Member Откуда: Сообщений: 2639 |
Это кажется из середины 60-х, АЛГОЛ,FORTRAN,Б3-32,МК-61,Козерог-1 и Аполлон-11 Не знаю такого языка, но точно помню что меня тогда еще не было |
||||
7 сен 19, 21:44 [21966137] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52472 |
Нет, РАЯ это лет на 20 позже: https://ru.wikipedia.org/wiki/Учебный_алгоритмический_язык Posted via ActualForum NNTP Server 1.5 |
||
7 сен 19, 22:05 [21966144] Ответить | Цитировать Сообщить модератору |
HOME_X Member Откуда: Сообщений: 2639 |
Добавлю - по последнему пункту статьи Использовал OLE VIEW - Object classes/All Objects - похожего объекта нет Type Library - есть в наличии тип, интерфейсы, GUID-ы Отсюда и Set lb = CreateObject("как писать здесь ????????????") Подскажите где ошибка - спасибо |
||||
8 сен 19, 11:00 [21966251] Ответить | Цитировать Сообщить модератору |
Gator Member Откуда: Москва Сообщений: 14980 |
Код бился на перфоленты и гонялся на Наири 1-2 |
||||
8 сен 19, 11:19 [21966256] Ответить | Цитировать Сообщить модератору |
Gator Member Откуда: Москва Сообщений: 14980 |
Юзай CreateOLEObject/GetOLEObject посмотри Почему Эксель завершается только после CoUninitialize? |
8 сен 19, 11:46 [21966263] Ответить | Цитировать Сообщить модератору |
HOME_X Member Откуда: Сообщений: 2639 |
Вопрос звучал так - как называется сервер CreateOLEObject('???????????'); Ответ по статье звучал так - "строка Help String выступает в качестве внешнего имени сокласса (СОМ сервера)." Использование OLE View для получения информации о сервере. После регистрации СОМ сервера информацию о нем можно просмотреть с помощью OLE View. В разделе Object classes/All Objects [SIZE=2][b]информация о сервере будет записана под именем, заданным в окне редактора библиотеки типов Help String для сокласса[/b][/SIZE]. Таким образом, строка Help String выступает в качестве внешнего имени сокласса (СОМ сервера). В разделе Type Libraries можно найти информацию о библиотеке типов под именем, которое было указано в окне Help String редактора библиотеки типов для библиотеки типов. В разделе Type Libraries можно найти информацию о библиотеке типов под именем, которое было указано в окне Help String редактора библиотеки типов для библиотеки типов. Этот тип существует, но сервера нет, наверное что-то сделал не так (НЕДОЧИТАЛ/НЕДОПИСАЛ/НЕДОПОНЯЛ) Или в статье момент пропущен По Вашей ссылке имели в виду = CoInitialize(nil); Но я смотрю ПОКА через приложение OLEVIEW Оно визуализирует все типы и сервера OLE которые есть в системе begin CoInitialize(nil); try TestExcel; finally Write('Before CoUnitialize: Do you see Excel? I think you don''t :)'); Readln; CoUnInitialize; end; Readln; end. |
||
8 сен 19, 12:44 [21966272] Ответить | Цитировать Сообщить модератору |
HOME_X Member Откуда: Сообщений: 2639 |
HOME_X, подобная ситуация https://www.sql.ru/forum/558875-a/kak-pravilno-sozdat-com-obekt?hl=createobject 1) Интерфейс должен наследоваться от IDispatch 2) Методs должнs иметь dispid 3) Класс, реализующий интерфейс, должен наследоваться от TAutoObject 4) Фабрика класса должна быть TAutoObjectFactory Или делаешь New->Automation Object |
8 сен 19, 13:03 [21966273] Ответить | Цитировать Сообщить модератору |
Gator Member Откуда: Москва Сообщений: 14980 |
HOME_X, В системе уже должен быть установленный зарегистрированный ехешник - OLE/COM - сервер , обеспечивающий свои интерфейсы, фабрики классов etc. Напр, Word/OOWriter для doc, Acrord для pdf Что у вас прописано в реестре для '{0806339A-4EDD-48A5-A60A-54E6E9AF94E1}'? У меня - ничего. |
8 сен 19, 16:39 [21966316] Ответить | Цитировать Сообщить модератору |
HOME_X Member Откуда: Сообщений: 2639 |
Аналогично но не хотелось бы затягивать переписку и говорить ни о чем Вы можете 1. поработать по статье = http://www.introligator.org/articles/3/78 (затрат времени не более 3-5 мин даже у меня .....) 2. попытаться осуществить вызов созданного в статье COM объекта Dim lb On Error Resume Next Err.Clear MsgBox "Create Dll" Set lb = CreateObject("?????????????????????????") call lb."ЛЮБОЙ МЕТОД С ПАРАМЕТРОМ" MsgBox Err.Source & "_" & Err.Description & "_" & Err.Number On Error Goto 0 MsgBox "Exit" Мне кажется статья немножко не то регистрирует в "фабрике классов" TTypedComObjectFactory.Create(ComServer, TSmpCOM, Class_SmpCOM, ciInternal, tmApartment); Но четко сказать не могу - нет практики и понимания работы с COM Спасибо |
||
9 сен 19, 00:16 [21966441] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Delphi | ![]() |