Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 08.07.2022
Сообщений: 24

Импорт интерфейсных функций (методов класса С) из dll

26.02.2026, 11:30. Показов 279. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Подскажите кто знает как, если это возможно.
Есть библиотека dll на С .
В ней одна импортируемая функция f(), все остальное в классе. Функция f() возвращает ссылку на объект класса. Для f() написал прототип, он работает.
Существуют ли способы достучаться до методов класса?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2026, 11:30
Ответы с готовыми решениями:

Разработка интерфейсных форм по использованию объектной модели приложения Excel
Для списка определенной структуры разработать форму (я разработал), которая вызывалась командой или...

Импорт функции из DLL Ms Visual C++ 6.0
Не могу вызвать функции из Dll написаной на Ms VC++ 6. Возникает сообщение о том что функция не...

За какую функцию отвечают user32.dll,kernel32,winmm.dll
Помогите мне пожалуйста,разобратся с этими DLLками. Если есть где можно скачать матерьял,буду...

1
Эксперт по электронике
6850 / 3274 / 339
Регистрация: 28.10.2011
Сообщений: 12,807
Записей в блоге: 7
26.02.2026, 12:44
В теории да. На практике нужно знать формат данных хранения адресов функций класса.
Можно попробовать написать интерфейс и вызвать функции класса через него. Может сработать но при определенных условиях. Соглашение вызова методов должно быть stdcall, но обычно оно thiscall. Это нужно изменить при компиляции dll. Если исходников нет, тогда нужно в код PB добавить макрос исправляющий вызовы stdcall на thiscall.
Code
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
;{ thiscall макрос.
CompilerIf #PB_Compiler_OS = #PB_OS_Windows And #PB_Compiler_Processor = #PB_Processor_x86
 
!macro CALL arg
! {
! clabel = $
! CALL arg
! plabel = clabel-3
! callsize = $-clabel
! load ops dword from plabel
! load opc byte from plabel+4
! If ops=$FF008B50 & (opc=$10 | opc=$50 | opc=$90)
!   If opc=$10
!     db $10
!   Else If (opc=$50 | opc=$90)
!     db $00
!     Repeat callsize
!       load op byte from clabel+callsize-%
!       store byte op at clabel+callsize-%+1
!     End Repeat
!   End If
!   store dword $008BC189 at plabel
!   store byte $FF at plabel+4
! End If
! }
 
CompilerEndIf
  ;}
Вот пример отсюда как выглядит вызов методов класса.
PureBasic
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
XIncludeFile "vsm.pbi"
 
Structure ClassParam
  *vt ;pointer to virtual table as first entry 
  
  ; Приватные переменные класса.
  *inst.IINSTANCE
  *ckt.IDSIMCKT
  *Pin1.IDSIMPIN
  *Pin2.IDSIMPIN
  *Pin3.IDSIMPIN
  *Pin4.IDSIMPIN
EndStructure 
 
EnableExplicit
EnableASM
 
Declare ModelNEW()
 
ProcedureCDLL createdsimmodel(device.s, *ils.ILICENCESERVER)
  Protected *Result=0
  
  If *ils\Authorize($80808081)
    *Result=ModelNEW()
  EndIf
     
  ProcedureReturn *Result
EndProcedure
 
ProcedureCDLL deletedsimmodel(*model.IDSIMMODEL)
  If *model
    ;ClearStructure(*model, ClassParam)
    FreeMemory(*model) 
  EndIf
EndProcedure
 
; Первой для каждого вывода вызывается функция isdigital.
; Она должна вернуть «1», если вывод с данным именем является цифровым, и «0», если нет.
Procedure isdigital(*PinName)
  Protected *This.ClassParam
  mov *This, ecx
  
  ProcedureReturn 1 ; В компоненте все выводы цифровые.
EndProcedure
 
; Далее, вызывается функция setup.
; Ей передаются интерфейсы объектов IINSTANCE – интерфейс экземпляра,
; и IDSIMCKT – интерфейс схемы. 
; В этой функции мы должны проинициализировать внутренние переменные, 
; а также сохранить на будущее ссылки на IINSTANCE и IDSIMCKT.
; Также, в этой функции чаще всего сохраняются адреса интерфейсов выводов
; (через вызов функции inst->getdsimpin).
Procedure setup(*instance.IINSTANCE, *dsimckt.IDSIMCKT)
  Protected *This.ClassParam
  mov *This, ecx
  
  *This\inst = *instance ; Сохраняем указатели на объекты.
  *This\ckt  = *dsimckt
  
  ; Сохраняем указатели на объекты выводов модели.
  *This\Pin1 = *instance\getdsimpin("In", #True)
  *This\Pin2 = *instance\getdsimpin("Out", #True)
  *This\Pin3 = *instance\getdsimpin("pinx", #True)
  *This\Pin4 = *instance\getdsimpin("G", #True)
  
  ; Запускаем таймер. Через полсекунды будет вызнана процедура setcallback() с кодом $20.
  *This\ckt\setcallback(500000000000, *This, $20)
  
EndProcedure
 
; Функция runctl вызывается при смене режима симуляции – например,
; когда мы приостанавливаем процесс симуляции.
; Это удобно для того, чтобы остановить внутренние таймеры
; или проделать другие необходимые действия.
Procedure runctrl(mode.RUNMODES)
  Protected *This.ClassParam
  mov *This, ecx
EndProcedure
 
; Функция actuate вызывается, если у нас приводятся в действие актюаторы – стандартные
; элементы управления компонентом. Они бывают двух видов – «больше/меньше» и «нажато/отпущено». 
Procedure actuate(time.REALTIME, newstate.ACTIVESTATE)
  Protected *This.ClassParam
  mov *This, ecx
EndProcedure
 
; Функция indicate вызывается каждый раз при перерисовке экрана.
; Если мы возвращаем значение FALSE, то эта функция больше не будет вызываться.
Procedure indicate(time.REALTIME,  *aData.ACTIVEDATA)
  Protected *This.ClassParam
  mov *This, ecx
  
  ProcedureReturn #True
EndProcedure
 
; Функция simulate вызывается при каждом изменении состояния выводов.
; Небольшое замечание – она вызывается также когда мы изменяем состояние собственного вывода,
; так что необходимо точно устанавливать, произошло ли какое-либо входное событие и какое именно.
Procedure simulate(time.ABSTIME, mode.DSIMMODES)
  Protected *This.ClassParam
  mov *This, ecx
  
  ; Считываем логическое состояние входа "In" и устанавливаем противоположное на выходе "Out".
  If ishigh(*This\Pin1\istate())
    *This\Pin2\setstate2(time, 1, #SLO)
  Else
    *This\Pin2\setstate2(time, 1, #SHI)
  EndIf
  
EndProcedure
 
; Функция callback вызывается при наступлении определенного времени,
; которое задается вызовом IDSIMCKT::setcallback. Её удобно использовать для тактовых генераторов.
Procedure callback(time.ABSTIME, eventid.EVENTID)
  Protected *This.ClassParam
  mov *This, ecx
  
  If eventid = $20
    
    ; Считываем логическое состояние выхода "G" и устанавливаем противоположное на этом выходе,
    ; т. е. инвертируем логическое состояние выхода "G".
    If ishigh(*This\Pin4\istate()) 
      *This\Pin4\setstate2(time, 1, #SLO)
    Else
      *This\Pin4\setstate2(time, 1, #SHI)
    EndIf
    
    ; Запускаем таймер. Через полсекунды будет вызнана процедура setcallback() с кодом $20.
    *This\ckt\setcallback(time + 500000000000, *This, $20)
    
  EndIf
EndProcedure
 
; Создание объекта.
Procedure ModelNEW()
  Protected *this.ClassParam=0
  
  *this = AllocateMemory(SizeOf(ClassParam)) 
  If *this
    ;InitializeStructure(*this, ClassParam)
    *this\vt = ?ClassFunct
  EndIf   
  
  ProcedureReturn *this 
EndProcedure
 
DataSection
  ClassFunct:
  Data.i @isdigital()
  Data.i @setup()
  Data.i @runctrl()
  Data.i @actuate()
  Data.i @indicate()
  Data.i @simulate()
  Data.i @callback()
EndDataSection
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2026, 12:44
Помогаю со студенческими работами здесь

ntdll.dll и kernel32.dll - Реальные примеры работы на vb6
Копался, копался по стороннему форуму и наткнулся на всевозможные вызовы апифункций из...

Ошибка Can't find DLL entry point CryptEnumProvidersA in advapi32.dll
Проблема вот в чем. Объявляем CryptEnumProviderTypesA Private Declare Function...

ActiveX Document DLL.Результат видет только на компах, где прописана dll
Пробовал создать, получил *.vbd и *.dll На Web сервере запускаю vbd - все ОК. Результат видет...

Как сохранить форму в dll и потом вызвать её из проэкта к которому подключена эта dll?
Как сохранить форму в dll и потом вызвать её из проэкта к которому подключена эта dll?

Visual Basic + VC++ DLL = ошибка Bad DLL calling convertation
Попытался я написать DLL-ку на VC++, для последующего использования ее в VB. Но поскольку я в VC++...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru