purebasic.info

PureBasic forum
Текущее время: Пт апр 27, 2018 11:43 am

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




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

Зарегистрирован: Вт май 24, 2011 7:01 pm
Сообщений: 505
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
SergeyA
Ну где-то так. усли я правильно понял.
Код:
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
 
CompilerIf Defined(I_Str,#PB_Structure) = 0
  Structure I_Str
    *lpData.l
    dwResult.l
  EndStructure
CompilerEndIf
 
CompilerIf Defined(I_Inter,#PB_Interface) = 0
  Interface I_Inter
    GetNumber.l()
    SetNumber(Num.l)
    ToString(*Buffer)
    Release()
  EndInterface
CompilerEndIf
 
ProcedureDLL I_Inter()
  Protected *this.I_Str = AllocateMemory(SizeOf(I_Str))
  InitializeStructure(*this,I_Str)
  If Not *this
    Debug "Error Allocated *this { "+#PB_Compiler_Procedure+" }"
    ProcedureReturn -1
  EndIf
  *this\lpData = ?_I_Inter_
  ProcedureReturn  *this
EndProcedure
 
Procedure I_Inter_GetNumber(*this.I_Str)
  ProcedureReturn *this\dwResult
EndProcedure
 
Procedure I_Inter_SetNumber(*this.I_Str,Num.l)
  *this\dwResult = Num
  ProcedureReturn *this\dwResult
EndProcedure
 
Procedure I_Inter_ToString(*this.I_Str,*Buffer)
  ProcedureReturn PokeS(*Buffer,Str(*this\dwResult))
EndProcedure
 
Procedure I_Inter_Release(*this.I_Str)
  ProcedureReturn FreeMemory(*this)
EndProcedure
 
DataSection
  _I_Inter_:
 Data.i @I_Inter_GetNumber  ()
  Data.i @I_Inter_SetNumber  ()
  Data.i @I_Inter_ToString   ()
  Data.i @I_Inter_Release    ()
EndDataSection
 
 
 
 
 
*test.I_Inter = I_Inter()
 
*test\SetNumber(34)
Debug *test\GetNumber()
Debug *test\ToString(@String.s{128})
Debug String
*test\Release()
 



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

_________________
Я спокоен! Я Спокоен вашу мать! И АДЕКВАТЕН... КОРАБЛЬ!!! ложись!! *уснул*


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 18, 2013 10:50 pm 
Не в сети
профессор

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

Благодарю.

_________________
https://www.instagram.com/sergey.afonichev/


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

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

Код:
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
 
Interface API
  GetComputerName.s()
  GetUserName.s()
  CountSystemCPU.i()
EndInterface
 
Structure API_OBJ
  *vTable
EndStructure  
 
Procedure.s API__ComputerName(*self.API_OBJ)
  ProcedureReturn ComputerName()
EndProcedure
 
Procedure.s API__UserName(*self.API_OBJ)
  ProcedureReturn UserName()
EndProcedure
 
Procedure.i API__CountSystemCPU(*self.API_OBJ)
  ProcedureReturn CountCPUs(#PB_System_CPUs)
EndProcedure
 
ProcedureDLL DllCreateObject()
  Protected *object.API, *struct.API_OBJ = AllocateMemory(SizeOf(API_OBJ))
  If *struct
    *struct\vTable = ?Methods
    *object = *struct
    ProcedureReturn *object
  EndIf
  ProcedureReturn 0
EndProcedure
 
DataSection
  Methods:
 Data.i @API__ComputerName()
  Data.i @API__UserName()
  Data.i @API__CountSystemCPU()
EndDataSection
 



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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
Что-то не припомню чтобы выкладывал подобный пример, ну да ладно.

SergeyA писал(а):
что делать если допустим вызывать такую dll в другом языке где нет поддержки интерфейсов
Если нет поддержки интерфейсов, то вызывать ActiveX будет проблематично. Или я что-то не так понял?

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 22, 2013 7:11 am 
Не в сети
профессор

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


Нет, это не ActiveX dll, это простая dll с одной экспортируемой функцией DllCreateObject(), в AutoIt я вызываю её и мне возвращается объект, в AutoIt есть функция на проверку объекта (IsObj) ставлю условие на проверку объекта и то что внутри условия срабатывает, значит это действительно объект, но методы этого объекта вызвать не возможно пока не создашь интерфейс что и делает функция ObjCreateInterface, хочу узнать, возможно ли переделать этот пример так, что бы при вызове dll в другом ЯП, не было необходимости писать интерфейсы, то есть вызываем DllCreateObject(), и просто вызываем методы этого объекта, в ActiveX за такое отвечает GetIDsOfNames, при вызове какого либо метода объекта, автоматом срабатывает GetIDsOfNames и возвращает нам имя вызываемого метода а с помощью Invoke вызываем нужную нам процедуру из dll, как то так...


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
Нужно что-то подобное ActiveX, но без регистрации в системе? Или что?

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


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

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

Да, нужно что - то подобное ActiveX'у но чтобы вызывалась как обычная dll без надобности регистрации в системе...

_________________
https://www.instagram.com/sergey.afonichev/


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
Нужно погуглить как работать с ActiveX без регистрации в системе.
Но не все так просто. Скажем, ActiveX загружается по имени, зарегистрированному в системе и если ЯП, вызывающий ActiveX не поддерживает другие способы вызова (без регистрации), то это не сработает.
Объясни зачем понадобилось все это (если не секрет)?
Чем обычные DLL не подошли?

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


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

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


Скажем так, это моя прихоть...


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

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


Не ну это слишком, да и настоящий ActiveX мне не нужен, тем более я не знаю как его писать, тот пример выше, мне подходит идеально, но проблема в интерфейсах, в некоторых языках их нет...

_________________
https://www.instagram.com/sergey.afonichev/


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
SergeyA писал(а):
Скажем так, это моя прихоть...
Тогда гугли и может найдешь как реализовать эту прихоть.

SergeyA писал(а):
проблема в интерфейсах, в некоторых языках их нет
Если нет интерфейсов, то как собираешься вызывать функции объекта?

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


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

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


Так я вот и спрашиваю, как это можно сделать...


Последний раз редактировалось SergeyA Пт авг 23, 2013 6:16 pm, всего редактировалось 1 раз.

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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
SergeyA писал(а):
как это можно сделать
Если ЯП не имеет интерфейсов и в нем нет возможности создать COM объект, то простыми способами не получится подключить ActiveX.

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


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

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


Возможность есть, но мне не нужен настоящий ActiveX, пример dll выше уже возвращает объект, но для использования его методов нужен интерфейс которого в некоторых языках нет.


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
Я не понимаю в чем проблема. Если не поддерживается COM интерфейс, то функции из ActiveX будет проблематично вызывать.

SergeyA писал(а):
но мне не нужен настоящий ActiveX
А какой нужен? Это что-то типа: "Мне нужна программа, но программа мне не нужна". :shock: :shock:

SergeyA писал(а):
но для использования его методов нужен интерфейс которого в некоторых языках нет
См. выше.

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


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

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


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

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


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

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