purebasic.info

PureBasic forum
Текущее время: Вс июл 22, 2018 11:37 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 23, 2013 6:34 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 749
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Ок, как тогда работают ActiveX Dll, в языке который вызывает методы из этого ActiveX не нужны ни какие интерфейсы, а в самой dll прописывается метод GetIDsOfNames, когда из объекта вызывается какой либо метод, то GetIDsOfNames срабатывает автоматически и возвращает имя вызываемого метода, а с помощью invoke, нужный метод вызывается как например в этом примере ActiveX Dll (3 пост сверху)

_________________
medium.com/@afonichev.dev


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 23, 2013 6:51 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11208
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Тогда нужно создать ActiveX и найти способ работать с ней без регистрации в системе.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 23, 2013 7:02 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 749
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Всё, нашёл способ, подправлю и выложу сюда.

_________________
medium.com/@afonichev.dev


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 23, 2013 7:45 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 749
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
В общем как - то так, в AutoIt работает нормально, как в пурике вызвать - не знаю.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
 
EnableExplicit
 
#delobj = 100
#Plus  = 101
#Minus = 102
 
Structure API_OBJ
  *VTable
  cntRef.l
  *own.IUnknown
EndStructure
 
Declare.d API__Plus(*self, a.d, b.d, *res=0)
Declare.d API__Minus(*self, a.d, b.d, *res=0)
 
ProcedureDLL DllCreateObject()
  Protected *object.API_OBJ
 
  *object = AllocateMemory(SizeOf(API_OBJ))
  If *object
    *object\VTABLE = ?Methods
    *object\own   = *object
    *object\own\AddRef()
    ProcedureReturn *object
  EndIf
  ProcedureReturn 0
EndProcedure
 
Procedure.l API__QueryInterface(*self.API_OBJ, *iid.IID, *object.Integer)
  If CompareMemory(*iid, ?IID_IUnknown, 16)
    *object\i = *self
    *self\own\AddRef()
    ProcedureReturn #S_OK
  EndIf
  *Object\i = 0
  ProcedureReturn #E_NOINTERFACE
EndProcedure
 
Procedure.l API__AddRef(*self.API_OBJ)
  *self\cntRef + 1
  ProcedureReturn *self\cntRef
EndProcedure
 
Procedure.l API__Release(*self.API_OBJ)
  If *self\cntRef > 1
    *self\cntRef - 1
    ProcedureReturn *self\cntRef
  EndIf
  FreeMemory(*self)
  ProcedureReturn 0
EndProcedure
 
Procedure.l API__GetTypeInfoCount(*self.API_OBJ, *CntTypeInfo.Long)
  *CntTypeInfo\l = 0
  ProcedureReturn #S_OK
EndProcedure
 
Procedure.l API__GetTypeInfo(*self.API_OBJ, TypeInfo.l, LocalId.l, *ppTypeInfo.Integer)
  ProcedureReturn #S_OK
EndProcedure
 
Procedure.l API__GetIDsOfNames(*self.API_OBJ, *iid.IID, *Name.String, cntNames.l, lcid.l, *DispId.Long)
  Select *Name\s
    Case "Delete"
      *DispId\l = #delobj
    Case "Plus"
      *DispId\l = #Plus
    Case "Minus"
      *DispId\l = #Minus
  EndSelect    
EndProcedure
 
Procedure.l API__Invoke(*self.API_OBJ, DispId.l, *iid.IID, lcid.l, Flags.w, *DispParams.DISPPARAMS, *vResult.VARIANT, *ExcepInfo, *ArgErr.Integer)
  Dim vArg.VARIANT(20)
 
  CopyMemory (*DispParams\rgvarg, @vArg(), 20 * SizeOf(VARIANT))
  VariantChangeType_(vArg(0), vArg(0), 0, #VT_R8)
  VariantChangeType_(vArg(1), vArg(1), 0, #VT_R8)
 
  Select DispId
    Case #delobj
      API__Release(*self)
    Case #Plus  
      *vResult\vt = #VT_R8
      *vResult\dblVal = API__Plus(*self, vArg(1)\dblVal, vArg(0)\dblVal)
    Case #Minus
      *vResult\vt = #VT_R8
      *vResult\dblVal = API__Minus(*self, vArg(1)\dblVal, vArg(0)\dblVal)
  EndSelect
EndProcedure
 
Procedure.d API__Plus(*self.API_OBJ, a.d, b.d, *res.Double=0)
  Define result.d
 
  result = a + b
 
  If *res
    *res\d = result
  EndIf
  ProcedureReturn result
EndProcedure
 
Procedure.d API__Minus(*self.API_OBJ, a.d, b.d, *res.Double=0)
  Define result.d
 
  result = a - b
 
  If *res
    *res\d = result
  EndIf
  ProcedureReturn result
EndProcedure
 
DataSection
  Methods:
 Data.i @API__QueryInterface()
  Data.i @API__AddRef()
  Data.i @API__Release()
  Data.i @API__GetTypeInfoCount()
  Data.i @API__GetTypeInfo()
  Data.i @API__GetIDsOfNames()
  Data.i @API__Invoke()
  Data.i @API__Plus()
  Data.i @API__Minus()
 
  IID_IUnknown:
 Data.l $00000000
  Data.w $0000,$0000
  Data.b $C0,$00,$00,$00,$00,$00,$00,$46
EndDataSection
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 23, 2013 8:11 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6327
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
SergeyA писал(а):
В общем как - то так

Ты бы хоть сделал описание, для чего это надо такой огород городить, почему не просто DLL?

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 23, 2013 8:24 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 749
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
kvitaliy писал(а):
для чего это надо такой огород городить, почему не просто DLL?


Потому что начнутся советы как сделать по другому, которые я и сам прекрасно знаю, некая критика и т.д. У меня была цель, я добился положительного результата, вопрос решён.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 23, 2013 8:39 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6327
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
SergeyA писал(а):
Потому что начнутся советы как сделать по другому

Тема называется трюки и советы. Это твой совет или трюк - смысл его оспаривать? Лично мне просто интересно для чего это можно применить, или это фишка исключительно для AutoIt? Почему не обычная DLL ? Интересуюсь не для критики, а исключительно в целях самообразования.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 23, 2013 8:45 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 749
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
kvitaliy писал(а):
Это твой совет или трюк


Это был мой вопрос, я ни кому ни чего здесь не советовал, я рассчитывал что мне дадут совет по данному вопросу.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 23, 2013 9:03 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 749
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
kvitaliy писал(а):
Интересуюсь не для критики, а исключительно в целях самообразования.


Ну хотя бы потому что тема называется "Объектно-Ориентированная парадигма программирования в PB", раз уж можно писать в PureBasic с использованием ООП, то почему бы и dll таким макаром не сделать, ActiveX не устраивает тем что его нужно регистрировать в системе (делать записи в реестр) что не очень то и надёжно, по этому пришёл к такому варианту.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 23, 2013 9:04 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 749
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Ах да, и AutoIt тут совершенно не причём, просто нет другого языка под рукой для тестов.

_________________
medium.com/@afonichev.dev


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 23, 2013 10:01 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6327
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
SergeyA писал(а):
не устраивает тем что его нужно регистрировать в системе

Ну вообще то это как раз и есть преимущество по сравнению с DLL - вне зависимости от места положения, единожды зарегистрированный в системе компонент ActiveX будет работать с любым приложением. А DLL надо помещать в специальные папки.
Ну да разговор не о том. В общем понятно - ты просто разговор поддержал, без определённой практической цели, как я понимаю.
Но получилось интересно.

Maxus создавал стандартный компонент ActiveX для работы с 1C на Пурике, реально для работы. Это я к тому, что даже такое возможно при желании.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 23, 2013 11:27 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 749
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Может у ActiveX и есть какие - то преимущества, но затереть запись в реестре не долго (Windows любит подобные шалости делать, не раз такое бывало у меня) и тогда все программы использующие этот ActiveX попросту перестанут работать пока не исправишь проблемы, в общем Вы правы, у меня не было определённой цели, мне частенько просто так может что либо взбрести в голову, а я попытаюсь это реализовать, цель у меня всегда одна, есть идея (какая бы она бредовая ни была) - я должен её выполнить, хотя бы для саморазвития, авось и ещё кому - то пригодится, если не весь код, то хотя бы часть от него.

_________________
medium.com/@afonichev.dev


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср апр 16, 2014 9:01 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11208
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Димастый писал(а):
Указатель на объект - является обязательным аргументом в тех процедурах реализующих методы класса, в которых требуются данные класса, и если его не добавлять - нарушается соглашение о вызове thiscall. thiscall - метод вызова подпрограмм, где указатель на объект в функцию передается в регистре ECX.
В PB используется не thiscall, а stdcall. Указатель на объект передается через стек.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт мар 19, 2015 3:42 pm 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 357
Благодарил (а): 14 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
Привет всем. Нифига не пойму как сделать есть структура в структуре МАР

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Structure _iGadget
  x.l:y.l
  w.l:h.l
 
  dx.l:dy.l
 
  type.l ;
  hide.l
  on.l
  flag.l
 
  image_id_1.l
  image_id_2.l
  image_id_3.l
EndStructure
 
Structure _iTransport
  *vTable
 
  image_id_1.l; buf 1
  image_id_2.l; buf 2
  flip.l      ; flip buf  
  Map *_iGadget. _iGadget()
EndStructure



Создаю объект

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Procedure AddTransportGUIObject(W.l,H.l)
  Protected *object._iTransport
  *object = AllocateMemory(SizeOf(_iTrack))
    If *object
      ;Make sure the *vTable field points to our virtual table.
        *object\vTable = ?VTable_TransportGUIClass
      ;Initialise track
        *object\image_id_1=CreateImage(#PB_Any,W,H)
        *object\image_id_2=CreateImage(#PB_Any,W,H)
       
        ;With *object
          AddMapElement(*object\_iGadget(),"Home_Buton")
          AddGadget(*object\_iGadget(),0,0,30,30)
        ;EndWith
       
       
    EndIf
  ;Return a pointer to our object.
    ProcedureReturn *object
EndProcedure



в куске где добавляется МАР структура ошибка что МАР неинициализирован :( .
Если *object использую без * то интерфейс как таковой не инициализируется :cry:
кто сталкивался с такой бедой?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт мар 19, 2015 4:28 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11208
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
cherri123 писал(а):
в куске где добавляется МАР структура ошибка что МАР неинициализирован.
Ну правильно. Задан указатель на ассоциативный массив, который нужно проинициализировать.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB