Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/43: Рейтинг темы: голосов - 43, средняя оценка - 4.98
1102 / 237 / 21
Регистрация: 20.05.2016
Сообщений: 1,068
Записей в блоге: 21
1

Подключить библиотеку dll

01.03.2017, 09:35. Показов 8022. Ответов 166
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Данным диалектом Бейсика не пользуясь, но иногда здесь бываю. Решил немного поучаствовать. Собственно вопрос в следующем: можно ли пользоватся сторонними библиотеками в этом диалекте, насколько сложен процесс использования? Цель - есть своя xll для VBA, можно убрать обертку будет dll, выложу здесь для тех кто много считает, большими числами) (Гугл не спрашивал ибо важно понять, есть целесообразность в данном продукте?)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2017, 09:35
Ответы с готовыми решениями:

Не получается подключить библиотеку Unmanaged.dll (Firefox nss3.dll)
Здравствуйте, начал изучать c#, очень понравилась тема декриптования, для начала решил из...

Подключить библиотеку dll
Имеется программа nircmd.exe, которая с помощью батника позволяет выполнять различные комманды К...

Как подключить dll библиотеку?
Здраствуйте, есть такой вопрос, как можно подключить *.dll библиотеку к код блокс или к ...

Как подключить .dll библиотеку?
Есть готовый код на С++...

166
5000 / 1672 / 409
Регистрация: 25.04.2010
Сообщений: 4,619
Записей в блоге: 2
03.04.2018, 23:13 81
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от The trick Посмотреть сообщение
Просто VB6 автоматом делает все классы Automation-совместимыми.
Цитата Сообщение от The trick Посмотреть сообщение
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
Там не написано как это в памяти организовано.
Я худо бедно скодил CoCreateInstance, и не понимаю что такое cObject, он ничего не
заполняет, я ему даю структуру из ANY PTR, равную кол-ву функций в библиотеке,
после вызова там одни нули. Нету адресов функций, как мне их добыть?
У тебя в программе на асме нет QueryInterface и всё работает.
0
Модератор
9723 / 3684 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
03.04.2018, 23:21 82
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Без манифеста эта штука будет работать? Т.е. если уже запускалась usage.exe.
Будет, но в этом случае нужно регистрировать DLL. (regsvr32)

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Что происходит в invoke CoCreateInstance, CLSDID_CTest, 0, CLSCTX_INPROC_SERVER, IID__CTest, addr cObject
Т.е. CLSDID_CTest и IID__CTest - это указатели.
Создание объекта CTest и возвращение указателя на интерфейс _CTest в параметр cObject. Да это указатели на две структуры GUID, одна с идентификатором класса, другая с идентификатором интерфейса.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Мне же просто нужен указатель на функцию, чтобы мог передать ей управление. Или это всё работает
по другому?
В COM ты получаешь не указатель на функцию, а указатель на таблицу функций (множество функций). Чтобы получить указатель на функцию, нужно ведь знать на какую. Как это определить? Обычно в DLL это делается по имени или ординалу, в COM мы получаем не функцию а список функций. Этот список всегда фиксированный и идентифицируется через GUID (IID - interface identifier). К примеру IID интерфейса _CTest равен {D83F0A2C-3940-4237-B88E-7097479D01C6}. Если ты создашь любой другой объект из любой другой DLL что поддерживает этот интерфейс ты всегда получишь указатель на список функций следующего вида:
QueryInterface
AddRef
Release
GetTypeInfoCount
GetTypeInfo
GetIDsOfNames
Invoke
ShowMsgBox

CLSID - однозначно определяет реализацию. К примеру в классическом варианте это как просто путь к DLL, но к примеру тут возникает проблема что одна DLL может иметь только одну экспортируемую функцию одного имени. В COM же GUID (CLSID - class identifier) однозначно определяет реализацию. Одна DLL может содержать множество объектов с разными CLSID и никаких проблем не возникнет.

IID - определяет интерфейс, CLSID - определяет реализацию.

Это все очень упрощенно.

Добавлено через 5 минут
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Там не написано как это в памяти организовано.
Как же?
An instance of an interface implementation is actually a pointer to an array of pointers to methods—that is, a function table that refers to an implementation of all of the methods specified in the interface.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Я худо бедно скодил CoCreateInstance, и не понимаю что такое cObject, он ничего не
заполняет, я ему даю структуру из ANY PTR, равную кол-ву функций в библиотеке,
после вызова там одни нули. Нету адресов функций, как мне их добыть?
У тебя в программе на асме нет QueryInterface и всё работает.
Нет. Ты должен предоставлять указатель на указатель 4 байта в 32 битах (8 в 64). В него функция CoCreateInstance запишет указатель на таблицу функций запрашиваемого интерфейса. Мне не нужен QueryInterface поскольку я запрашиваю интерфейс у функции CoCreateInstance которая сама мне предоставит нужный интерфейс (она создаст фабрику классов, создаст объект этого класса и запросит у него интерфейс).
Если бы гипотетически я бы реализовал в классе CTest какой-либо еще интерфейс, то я бы мог его запросить в коде через QueryInterface.
0
5000 / 1672 / 409
Регистрация: 25.04.2010
Сообщений: 4,619
Записей в блоге: 2
04.04.2018, 05:27 83
Цитата Сообщение от The trick Посмотреть сообщение
В COM ты получаешь не указатель на функцию, а указатель на таблицу функций (множество функций).
Да это понимаю. Просто пытаюсь понять что мне вернёт WinAPI функция CoCreateInstance
в место памяти указанное в последнем параметре.


Короче выяснил что Hresult равен 0x80040154, а это ошибка "класс не зарегистрирован".
Попробую зарегистрировать. Видать нули вылезали из аз этого, а я сижу бошку ломаю как идиот)))

Добавлено через 1 минуту
Цитата Сообщение от The trick Посмотреть сообщение
Ты должен предоставлять указатель на указатель 4 байта в 32 битах (8 в 64).
Жесть какая. Уже мозг в трубочку скручивается. Лан попробуем.

Добавлено через 5 часов 48 минут
Короче ничего у меня не выходит.

Подключаю хедеры:

PureBasic
1
2
   #DEFINE WIN_INCLUDEALL
   #INCLUDE ONCE "Windows.bi"
Прописываю смещения функций:
PureBasic
1
2
3
4
5
6
7
8
9
10
ENUM FuncOffset      '  Считается за константу(подставляется компил-ром в виде константы)
  F_QueryInterface   = 0 
  F_AddRef           = 4
  F_Release          = 8
  F_GetTypeInfoCount = 12
  F_GetTypeInfo      = 16
  F_GetIDsOfNames    = 20
  F_Invoke           = 24
  F_ShowMsgBox       = 28
END ENUM
Забиваю GUID:
PureBasic
1
2
DIM SHARED  CLSDID_CTest AS CLSID = (&H322E4E2F, &HE105, &H4BB0, {&H9B, &H21, &H4C, &H2A, &H6A, &HF6, &HDE, &H2D})
DIM SHARED  IID__CTest AS IID = (&HD83F0A2C, &H3940, &H4237, {&HB8, &H8E, &H70, &H97, &H47, &H9D, &H01, &HC6})
Завожу строку BSTR с запасом(4 байта длина, WIDE символы двухбайтовые UNICODE, ноль в конце):
PureBasic
1
2
3
4
5
DIM SHARED  Stroka AS WSTRING * 10
DIM SHARED  Sa AS INTEGER
Stroka = "  Hello!" + CHR(0)    '  4 байта в начале оставляем для длины
Sa = CINT(SADD(Stroka))         '  Смещение строки
POKE INTEGER, Sa, 6             '  Пишем длину
Переменные:
PureBasic
1
2
DIM SHARED  IFace AS INTEGER
DIM SHARED  hr AS HRESULT
Получаю указатель на УКАЗАТЕЛЬ, который вроде бы указывает на таблицу адресов функций.
PureBasic
1
2
    hr = CoInitialize (0)
    hr = CoCreateInstance (@CLSDID_CTest, 0, CLSCTX_INPROC_SERVER, @IID__CTest, @IFace)
Т.е. у нас есть у нас есть таблица адресов функций, на неё указывает некий указатель, который
находится по адресу смещения IFace. Если я всё правильно понял.

Наваливаем асма:

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    ASM
      MOV ECX, Sa       '  Параметр функции(смещение строки)
      PUSH ECX          '  В стек
 
      MOV ECX, IFace    '   В ECX по идее находится [указатель] на [указатель на объект]
      MOV EAX, [ECX]    '   Получим адрес объекта
      PUSH EAX          '   Забьем его в стек
      MOV ECX, EAX      '   В ECX - адрес объекта
      MOV EAX, [ECX]    '   Получим указатель на  таблицу адресов
 
      CALL [EAX + F_ShowMsgBox]   '  Вызываем
 
    END ASM
 
SLEEP    '  Ждём клавиши
И короче нифига оно не работает, отваливается с ошибкой Object variable or With block variable not set.
Делал по этому ману с другого форума:
Assembler
1
2
3
4
5
mov eax,ecx;в ecx был адрес указателя на наш объект.
mov eax,[ecx];получаем адрес самого объекта
push eax;его передаем как параметр(передается всегда)
mov eax,[eax];берем адрес VMT
call [eax+4];ну и вызов функции номер два из VMT(это AddRef)
В чём может быть дело я не знаю, отсыл параметров менял местами. Где лоханулся не знаю.
Ещё немного помучаюсь и наверное тупо забью на это, потому что пустая трата времени, сейчас
реально не до изучения тонн литературы. Куда я вообще полез, в какие-то адские дебри.
0
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
04.04.2018, 07:36 84
Quiet Snow, возьму на себя смелость показать, как это делается на PureBasic.
На примере Windows Media Player
Запускаю OLE/COM Interface generator, он ищет все OLE/COM интерфейсы в системе, или могу указать на конкретный файл dll, если не зарегистрирован в системе.
Ищу Media Player
Подключить библиотеку dll

и генерирую код.
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
; Нижние 5 комментированных строк сгенерировал OLE/COM Interface generator
; из нужной информации ProgID, пригодится в коде
 
; Created with OLE/COM Interface generator v0.1   
; Class: Windows Media Player 
; Version: 1.0 
; ProgID: "MediaPlayer.MediaPlayer.1" 
; TypeLib: "C:\WINNT\System32\msdxm.ocx" 
 
 
; ########################################## 
; #               Interfaces               # 
; ########################################## 
 
; тут ещё 15 Interfaces, я их удалил, т.к. в программе не использую
; кроме IMediaPlayer2
Interface IMediaPlayer2 ; IMediaPlayer2 Interface 
  QueryInterface(riid.l,ppvObj.l) 
  AddRef() 
  Release() 
  GetTypeInfoCount(pctinfo.l) 
  GetTypeInfo(itinfo.l,lcid.l,pptinfo.l) 
  GetIDsOfNames(riid.l,rgszNames.l,cNames.l,lcid.l,rgdispid.l) 
  Invoke(dispidMember.l,riid.l,lcid.l,wFlags.l,pdispparams.l,pvarResult.l,pexcepinfo.l,puArgErr.l) 
  get_CurrentPosition(dispidMember.l) 
  put_CurrentPosition(dispidMember.d) 
  get_Duration(dispidMember.l) 
  get_ImageSourceWidth(dispidMember.l) 
  get_ImageSourceHeight(dispidMember.l) 
  get_MarkerCount(dispidMember.l) 
  get_CanScan(dispidMember.l) 
  get_CanSeek(dispidMember.l) 
  get_CanSeekToMarkers(dispidMember.l) 
  get_CurrentMarker(dispidMember.l) 
  put_CurrentMarker(dispidMember.l) 
  get_FileName(dispidMember.l) 
  put_FileName(dispidMember.p-bstr) 
  get_SourceLink(dispidMember.l) 
  get_CreationDate(dispidMember.l) 
  get_ErrorCorrection(dispidMember.l) 
  get_Bandwidth(dispidMember.p-bstr) 
  get_SourceProtocol(dispidMember.l) 
  get_ReceivedPackets(dispidMember.l) 
  get_RecoveredPackets(dispidMember.l) 
  get_LostPackets(dispidMember.l) 
  get_ReceptionQuality(dispidMember.l) 
  get_BufferingCount(dispidMember.l) 
  get_IsBroadcast(dispidMember.l) 
  get_BufferingProgress(dispidMember.l) 
  get_ChannelName(dispidMember.l) 
  get_ChannelDescription(dispidMember.l) 
  get_ChannelURL(dispidMember.l) 
  get_ContactAddress(dispidMember.l) 
  get_ContactPhone(dispidMember.l) 
  get_ContactEmail(dispidMember.l) 
  get_BufferingTime(dispidMember.l) 
  put_BufferingTime(dispidMember.d) 
  get_AutoStart(dispidMember.l) 
  put_AutoStart(dispidMember.w) 
  get_AutoRewind(dispidMember.l) 
  put_AutoRewind(dispidMember.w) 
  get_Rate(dispidMember.l) 
  put_Rate(dispidMember.d) 
  get_SendKeyboardEvents(dispidMember.l) 
  put_SendKeyboardEvents(dispidMember.w) 
  get_SendMouseClickEvents(dispidMember.l) 
  put_SendMouseClickEvents(dispidMember.w) 
  get_SendMouseMoveEvents(dispidMember.l) 
  put_SendMouseMoveEvents(dispidMember.w) 
  get_PlayCount(dispidMember.l) 
  put_PlayCount(dispidMember.l) 
  get_ClickToPlay(dispidMember.l) 
  put_ClickToPlay(dispidMember.w) 
  get_AllowScan(dispidMember.l) 
  put_AllowScan(dispidMember.w) 
  get_EnableContextMenu(dispidMember.l) 
  put_EnableContextMenu(dispidMember.w) 
  get_CursorType(dispidMember.l) 
  put_CursorType(dispidMember.l) 
  get_CodecCount(dispidMember.l) 
  get_AllowChangeDisplaySize(dispidMember.l) 
  put_AllowChangeDisplaySize(dispidMember.w) 
  get_IsDurationValid(dispidMember.l) 
  get_OpenState(dispidMember.l) 
  get_SendOpenStateChangeEvents(dispidMember.l) 
  put_SendOpenStateChangeEvents(dispidMember.w) 
  get_SendWarningEvents(dispidMember.l) 
  put_SendWarningEvents(dispidMember.w) 
  get_SendErrorEvents(dispidMember.l) 
  put_SendErrorEvents(dispidMember.w) 
  get_PlayState(dispidMember.l) 
  get_SendPlayStateChangeEvents(dispidMember.l) 
  put_SendPlayStateChangeEvents(dispidMember.w) 
  get_DisplaySize(dispidMember.l) 
  put_DisplaySize(dispidMember.l) 
  get_InvokeURLs(dispidMember.l) 
  put_InvokeURLs(dispidMember.w) 
  get_BaseURL(dispidMember.l) 
  put_BaseURL(dispidMember.p-bstr) 
  get_DefaultFrame(dispidMember.l) 
  put_DefaultFrame(dispidMember.p-bstr) 
  get_HasError(dispidMember.l) 
  get_ErrorDescription(dispidMember.l) 
  get_ErrorCode(dispidMember.l) 
  get_AnimationAtStart(dispidMember.l) 
  put_AnimationAtStart(dispidMember.w) 
  get_TransparentAtStart(dispidMember.l) 
  put_TransparentAtStart(dispidMember.w) 
  get_Volume(dispidMember.l) 
  put_Volume(dispidMember.l) 
  get_Balance(dispidMember.l) 
  put_Balance(dispidMember.l) 
  get_ReadyState(dispidMember.l) 
  get_SelectionStart(dispidMember.l) 
  put_SelectionStart(dispidMember.d) 
  get_SelectionEnd(dispidMember.l) 
  put_SelectionEnd(dispidMember.d) 
  get_ShowDisplay(dispidMember.l) 
  put_ShowDisplay(dispidMember.w) 
  get_ShowControls(dispidMember.l) 
  put_ShowControls(dispidMember.w) 
  get_ShowPositionControls(dispidMember.l) 
  put_ShowPositionControls(dispidMember.w) 
  get_ShowTracker(dispidMember.l) 
  put_ShowTracker(dispidMember.w) 
  get_EnablePositionControls(dispidMember.l) 
  put_EnablePositionControls(dispidMember.w) 
  get_EnableTracker(dispidMember.l) 
  put_EnableTracker(dispidMember.w) 
  get_Enabled(dispidMember.l) 
  put_Enabled(dispidMember.w) 
  get_DisplayForeColor(dispidMember.l) 
  put_DisplayForeColor(dispidMember.l) 
  get_DisplayBackColor(dispidMember.l) 
  put_DisplayBackColor(dispidMember.l) 
  get_DisplayMode(dispidMember.l) 
  put_DisplayMode(dispidMember.l) 
  get_VideoBorder3D(dispidMember.l) 
  put_VideoBorder3D(dispidMember.w) 
  get_VideoBorderWidth(dispidMember.l) 
  put_VideoBorderWidth(dispidMember.l) 
  get_VideoBorderColor(dispidMember.l) 
  put_VideoBorderColor(dispidMember.l) 
  get_ShowGotoBar(dispidMember.l) 
  put_ShowGotoBar(dispidMember.w) 
  get_ShowStatusBar(dispidMember.l) 
  put_ShowStatusBar(dispidMember.w) 
  get_ShowCaptioning(dispidMember.l) 
  put_ShowCaptioning(dispidMember.w) 
  get_ShowAudioControls(dispidMember.l) 
  put_ShowAudioControls(dispidMember.w) 
  get_CaptioningID(dispidMember.l) 
  put_CaptioningID(dispidMember.p-bstr) 
  get_Mute(dispidMember.l) 
  put_Mute(dispidMember.w) 
  get_CanPreview(dispidMember.l) 
  get_PreviewMode(dispidMember.l) 
  put_PreviewMode(dispidMember.w) 
  get_HasMultipleItems(dispidMember.l) 
  get_Language(dispidMember.l) 
  put_Language(dispidMember.l) 
  get_AudioStream(dispidMember.l) 
  put_AudioStream(dispidMember.l) 
  get_SAMIStyle(dispidMember.l) 
  put_SAMIStyle(dispidMember.p-bstr) 
  get_SAMILang(dispidMember.l) 
  put_SAMILang(dispidMember.p-bstr) 
  get_SAMIFileName(dispidMember.l) 
  put_SAMIFileName(dispidMember.p-bstr) 
  get_StreamCount(dispidMember.l) 
  get_ClientId(dispidMember.l) 
  get_ConnectionSpeed(dispidMember.l) 
  get_AutoSize(dispidMember.l) 
  put_AutoSize(dispidMember.w) 
  get_EnableFullScreenControls(dispidMember.l) 
  put_EnableFullScreenControls(dispidMember.w) 
  get_ActiveMovie(dispidMember.l) 
  get_NSPlay(dispidMember.l) 
  get_WindowlessVideo(dispidMember.l) 
  put_WindowlessVideo(dispidMember.w) 
  Play() 
  Stop() 
  Pause() 
  GetMarkerTime(MarkerNum.l) 
  GetMarkerName(MarkerNum.l) 
  AboutBox() 
  GetCodecInstalled(CodecNum.l) 
  GetCodecDescription(CodecNum.l) 
  GetCodecURL(CodecNum.l) 
  GetMoreInfoURL(MoreInfoType.l) 
  GetMediaInfoString(MediaInfoType.l) 
  Cancel() 
  Open(bstrFileName.p-bstr) 
  IsSoundCardEnabled() 
  Next() 
  Previous() 
  StreamSelect(StreamNum.l) 
  FastForward() 
  FastReverse() 
  GetStreamName(StreamNum.l) 
  GetStreamGroup(StreamNum.l) 
  GetStreamSelected(StreamNum.l) 
  get_DVD(StreamNum.l) 
  GetMediaParameter(EntryNum.l,bstrParameterName.p-bstr) 
  GetMediaParameterName(EntryNum.l,Index.l) 
  get_EntryCount(EntryNum.l) 
  GetCurrentEntry() 
  SetCurrentEntry(EntryNumber.l) 
  ShowDialog(mpDialogIndex.l) 
EndInterface 
 
 
; ########################################## 
; #               Constants                # 
; ########################################## 
 ; Было много, удалил
 
; ########################################## 
; #                 GUIDs                  # 
; ########################################## 
; Удалено всё, кроме этого
DataSection 
; 
  IID_IMediaPlayer2:  ; {20D4F5E0-5475-11D2-9774-0000F80855E6} 
    Data.l $20D4F5E0 
    Data.w $5475,$11D2 
    Data.b $97,$74,$0,$0,$F8,$8,$55,$E6 
  EndDataSection
Там куча интерфейсов, которые есть у плеера - приблуда реально крутая, потому и очень много всего.
Я всё ненужное мне выбросил, оставил только тот интерфейс, с которым буду работать, а именно IMediaPlayer2
Теперь конкретно то, что я пишу руками это ниже:
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
  ; Необходимые API для инициализации 
  
  CoInitialize_(0) ; Ole32.dll
  
 ; Обычное окно средствами PB
  OpenWindow(1,0,0,400,300,"MediaPlayer test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered ) 
   
;atl.dll = AtlAxCreateControl Создает элемент управления ActiveX, инициализирует размещение его в определенном окне. 
;Если элемент управления не охватывает все окно, необходимо использовать дескриптор ContainerGadget вместо WindowID () (GadgetID ()).
  AtlAxCreateControl_("MediaPlayer.MediaPlayer.1",WindowID(1),0,0) ; ProgID или CLSID элемента управления (см. заголовок )
; atl.dll = AtlAxGetControl Получает прямой указатель интерфейса на элемент управления, содержащийся внутри указанного окна, с учетом его дескриптора.
AtlAxGetControl_(WindowID(1),@*mp.IMediaPlayer2) 
 
File$ = OpenFileRequester("Грузи медиа!", "", "Media |*.mp4;*.avi;*.mp3", 0)
  If File$
     *mp\put_FileName(File$) ;  Ваше видео или музыка
  Else
    MessageRequester("Information", "Отказался", 0) 
  EndIf
; Основной цикл программы
Repeat 
  ; текущая позиция в секундах
  *mp\get_CurrentPosition(@pos.d) 
  SetWindowTitle(1,GetFilePart(File$) +" : "+StrF(pos,2)+" cek") ; контроль времени проигрывания в заголовок
 
Until WaitWindowEvent(100)=#PB_Event_CloseWindow 
 
*mp\Release() ; Освобождаем MediaPlayer
CloseWindow(1)
Реально для работы с MediaPlayer надо всего пару строк самому написать, опять же стандартного кода.
Т.е. для другого контрола поменяется ProgID ("MediaPlayer.MediaPlayer.1" ) и указатель на интерфейс *mp.IMediaPlayer2
Естественно логику программы разумеется тоже самому.

В результате всё работает:

Подключить библиотеку dll

Это музыка, но видео тоже показывает.
Подключить библиотеку dll
Вложения
Тип файла: zip OLE_COM_GEN.zip (53.3 Кб, 1 просмотров)
1
Модератор
9723 / 3684 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
04.04.2018, 08:32 85
Quiet Snow, скинь пожалуйста exe я не сильно разбираюсь в синтаксисе fb. На первый взгляд у тебя 2 ошибки. Ты передаешь указатель на префиксную длину строки а нужно на саму строку. Вторая ошибкаэто то что ты передаешь BSTR а нужно *BSTR :
LEA ECX, Sa
0
1102 / 237 / 21
Регистрация: 20.05.2016
Сообщений: 1,068
Записей в блоге: 21
04.04.2018, 13:07  [ТС] 86
Цитата Сообщение от Quiet Snow Посмотреть сообщение
bedvit, короче попробую пошуршать всё это, если получится завести
библиотеку Анатолия с FB, тогда уже будем смотреть по вашей библиотеке.
Будут вопросы, обращайтесь, помогу чем смогу, ибо последние посты для меня, как хорошая книга - интересно и покрыто тайной.
Цитата Сообщение от The trick Посмотреть сообщение
В посте с кодом показано описание интерфейса и видно что он наследуется от IDispatch. Эти функции - просто методы этого интерфейса.
Если это про мой продукт, выложу здесь код .idl файла (может поможет для понимания процесса):
Кликните здесь для просмотра всего текста
C++
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
// BedvitCOM.idl: источник языка IDL для BedvitCOM
//
 
// Этот файл будет обработан средством MIDL для
// создание библиотеки типов ($handlersafeidlname$.tlb) и кода маршалирования.
 
import "oaidl.idl";
import "ocidl.idl";
 
[
    object,
    uuid(314ada84-0668-4a3b-bc65-097f7547202a),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface IBignumArithmeticInteger : IDispatch
{
    [id(1), helpstring("Help")] HRESULT Help();
    [propget, id(2), helpstring("Bignum(Bignum-number in the array, BignumBase(optional)=10 - the base may vary from 2 to 36). Convert Bignum/String(BSTR)")] HRESULT Bignum([in] BYTE Bignum, [in, defaultvalue(10L)] LONG  BignumBase, [out, retval] BSTR* pVal);
    [propput, id(2), helpstring("Bignum(Bignum-number in the array, BignumBase(optional)=10 - the base may vary from 2 to 36). Convert Bignum/String(BSTR)")] HRESULT Bignum([in] BYTE Bignum, [in, defaultvalue(10L)] LONG  BignumBase, [in] BSTR newVal);
    [propget, id(3), helpstring("Sign(Bignum). Sign Bignum. Return +1 if Bignum > 0, 0 if Bignum = 0, and -1 if Bignum < 0")] HRESULT Sign([in] BYTE Bignum, [out, retval] LONG* pVal);
    [propget, id(4), helpstring("Even(Bignum). Determine whether Bignum is odd or even. Return 1 - even, 0 - odd")] HRESULT Even([in] BYTE Bignum, [out, retval] LONG* pVal);
    [id(5), helpstring("BignumSet(Bignum-number in the array, StringBSTR - string-in, BignumBase(optional)=10 (2 to 36)). Convert String(BSTR) to Bignum")] HRESULT BignumSet([in] BYTE Bignum, [in] BSTR StringBSTR,[in, defaultvalue(10L)] LONG  BignumBase);
    [id(6), helpstring("Compare(Bignum1,Bignum2). Compare Bignum1 and Bignum2. Return +1 if Bignum1 > Bignum2, 0 if Bignum1 = Bignum2, and -1 if Bignum1 < Bignum2")] HRESULT Compare([in] BYTE Bignum1, [in] BYTE Bignum2, [out, retval] LONG* pVal);
    [id(7), helpstring("Sum(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 + Bignum2")] HRESULT Sum([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
    [id(8), helpstring("SumL(BignumSet, Bignum1, LONGLONG). BignumSet = Bignum1 + LongLong")] HRESULT SumL([in] BYTE BignumSet, [in] BYTE Bignum1, [in] LONGLONG LONGLONG);
    [id(9), helpstring("Abs(BignumSet, Bignum1). Set absolute value. BignumSet = Abs(Bignum1)")] HRESULT Abs([in] BYTE BignumSet, [in] BYTE Bignum1);
    [id(10), helpstring("Negate(BignumSet, Bignum1). BignumSet = - Bignum1")] HRESULT Negate([in] BYTE BignumSet, [in] BYTE Bignum1);
    [id(11), helpstring("Subtract(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 - Bignum2")] HRESULT Subtract([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
    [id(12), helpstring("SubtractL(BignumSet, Bignum1, ULONGLONG). BignumSet = Bignum1 - LongLong")] HRESULT SubtractL([in] BYTE BignumSet, [in] BYTE Bignum1, [in] ULONGLONG ULONGLONG);
    [id(13), helpstring("Multiply(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 * Bignum2")] HRESULT Multiply([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
    [id(14), helpstring("MultiplyL(BignumSet, Bignum1, ULONGLONG). BignumSet = Bignum1 * LongLong")] HRESULT MultiplyL([in] BYTE BignumSet, [in] BYTE Bignum1, [in] ULONGLONG ULONGLONG);
    [id(15), helpstring("Divide(BignumQuotient, BignumRemainder, Bignum1, Bignum2). BignumQuotient, BignumRemainder = Bignum1 / Bignum2. Divide(BignumQuotient - method 'truncate' , BignumRemainder, Bignum1, Bignum2)")] HRESULT Divide([in] BYTE BignumQuotient, [in] BYTE BignumRemainder, [in] BYTE Bignum1, [in] BYTE Bignum2);
    [id(16), helpstring("DivideL(BignumQuotient, BignumRemainder, Bignum1, ULONGLONG). BignumQuotient, BignumRemainder = Bignum1 / ULONGLONG. DivideL(BignumQuotient - method 'truncate' , BignumRemainder, Bignum1, ULONGLONG")] HRESULT DivideL([in] BYTE BignumQuotient, [in] BYTE BignumRemainder, [in] BYTE Bignum1, [in] ULONGLONG ULONGLONG);
    [id(17), helpstring("Power(BignumSet, Bignum1,  ULONGLONG). BignumSet = Bignum1 ^ ULONGLONG")] HRESULT Power([in] BYTE BignumSet, [in] BYTE Bignum1, [in] ULONGLONG ULONGLONG);
    [id(18), helpstring("Clone(BignumSet, Bignum1). BignumSet = Bignum1")] HRESULT Clone([in] BYTE BignumSet, [in] BYTE Bignum1);
    [id(19), helpstring("RootRem(BignumSet, Bignum1, ULONGLONG n_root). BignumRoot, BignumRemainder = (n-th root)√ Bignum1")] HRESULT RootRem([in] BYTE BignumRoot, [in] BYTE BignumRemainder, [in] BYTE Bignum1, [in] ULONGLONG n_root);
    [id(20), helpstring("Factorial(BignumSet, ULONG n). BignumSet = !n")] HRESULT Factorial([in] BYTE BignumSet, [in] ULONG n);
    [id(21), helpstring("Fibonacci(BignumSet, ULONGLONG n). BignumSet = Fn, the n’th Fibonacci number")] HRESULT Fibonacci([in] BYTE BignumSet, [in] ULONGLONG n);
    [id(22), helpstring("LucNum(BignumSet, ULONGLONG n). BignumSet = Ln, the n’th Lucas number")] HRESULT LucNum([in] BYTE BignumSet, [in] ULONGLONG n);
    [id(23), helpstring("FileSet(Bignum-number in the array, StringBSTR - string-in FileName, BignumBase(optional)=10 (2 to 36)). Set Bignum from a File.")] HRESULT FileSet([in] BYTE Bignum, [in] BSTR StringBSTRFileName, [in, defaultvalue(10L)] LONG  BignumBase);
    [id(24), helpstring("FileGet(Bignum-number in the array, StringBSTR - string-in FileName, BignumBase(optional)=10 (2 to 36)). Get Bignum to a File.")] HRESULT FileGet([in] BYTE Bignum, [in] BSTR StringBSTRFileName, [in, defaultvalue(10L)] LONG  BignumBase);
};
[
    object,
    uuid(d8339ca1-1fff-4cf8-a262-0a9c0e3e36f4),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface IBignumArithmeticFloat : IDispatch
{
    [id(1), helpstring("Help")] HRESULT Help();
    [propget, id(2), helpstring("SizeBits(Bignum). SizeBits - Set/Get bit size Bignum")] HRESULT SizeBits([in] BYTE Bignum, [out, retval] LONGLONG* pVal);
    [propput, id(2), helpstring("SizeBits(Bignum). SizeBits - Set/Get bit size Bignum")] HRESULT SizeBits([in] BYTE Bignum, [in] LONGLONG newVal);
    [propget, id(3), helpstring("Bignum(Bignum-number in the array, BignumBase(optional)=10 (2 to 36), Precision(optional) = 0 (0-Max, 1-... - number of digits), Separator(optional)='.', Exponential(optional) = 1 (1-Exponential entry, 0 - decimal)). Convert Bignum/String(BSTR)")] HRESULT Bignum([in] BYTE Bignum, [in, defaultvalue(10L)] LONG  BignumBase, [in, defaultvalue(0)] LONGLONG Precision, [in, defaultvalue(".")] BSTR Separator, [in, defaultvalue(-1)] VARIANT_BOOL Exponential, [out, retval] BSTR* pVal);
    [propput, id(3), helpstring("Bignum(Bignum-number in the array, BignumBase(optional)=10 (2 to 36), Precision(optional) = 0 (0-Max, 1-... - number of digits), Separator(optional)='.', Exponential(optional) = 1 (1-Exponential entry, 0 - decimal)). Convert Bignum/String(BSTR)")] HRESULT Bignum([in] BYTE Bignum, [in, defaultvalue(10L)] LONG  BignumBase, [in, defaultvalue(0)] LONGLONG Precision, [in, defaultvalue(".")] BSTR Separator, [in, defaultvalue(-1)] VARIANT_BOOL Exponential, [in] BSTR newVal);
    [propget, id(4), helpstring("Sign(Bignum). Sign Bignum. Return +1 if Bignum > 0, 0 if Bignum = 0, and -1 if Bignum < 0")] HRESULT Sign([in] BYTE Bignum, [out, retval] LONG* pVal);
    [id(5), helpstring("SizeBitsSet(Bignum, SizeBits). Set bit size Bignum")] HRESULT SizeBitsSet([in] BYTE Bignum, [in] LONGLONG SizeBits);
    [id(6), helpstring("BignumSet(Bignum-number in the array, StringBSTR - string-in, BignumBase(optional)=10 (2 to 36), Separator(optional)='.'). Convert String(BSTR) to Bignum")] HRESULT BignumSet([in] BYTE Bignum,[in] BSTR StringBSTR, [in, defaultvalue(10L)] LONG  BignumBase, [in, defaultvalue(".")] BSTR Separator);
    [id(7), helpstring("Compare(Bignum1,Bignum2). Compare Bignum1 and Bignum2. Return +1 if Bignum1 > Bignum2, 0 if Bignum1 = Bignum2, and -1 if Bignum1 < Bignum2")] HRESULT Compare([in] BYTE Bignum1, [in] BYTE Bignum2, [out, retval] LONG* pVal);
    [id(8), helpstring("Sum(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 + Bignum2")] HRESULT Sum([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
    [id(9), helpstring("Abs(BignumSet, Bignum1). Set absolute value. BignumSet = Abs(Bignum1)")] HRESULT Abs([in] BYTE BignumSet, [in] BYTE Bignum1);
    [id(10), helpstring("Subtract(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 - Bignum2")] HRESULT Subtract([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
    [id(11), helpstring("Multiply(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 * Bignum2")] HRESULT Multiply([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
    [id(12), helpstring("Divide(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 / Bignum2")] HRESULT Divide([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
    [id(13), helpstring("Root(BignumSet, Bignum1). BignumSet = √ Bignum1")] HRESULT Root([in] BYTE BignumSet, [in] BYTE Bignum1);
    [id(14), helpstring("Negate(BignumSet, Bignum1). BignumSet = - Bignum1")] HRESULT Negate([in] BYTE BignumSet, [in] BYTE Bignum1);
    [id(15), helpstring("Power(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 ^ Bignum2.")] HRESULT Power([in] BYTE BignumSet, [in] BYTE Bignum1, [in] ULONGLONG ULONGLONG);
    [id(16), helpstring("Clone(BignumSet, Bignum1). BignumSet = Bignum1")] HRESULT Clone([in] BYTE BignumSet, [in] BYTE Bignum1);
    [id(17), helpstring("FileSet(Bignum-number in the array, StringBSTR - string-in FileName, BignumBase(optional)=10 (2 to 36)). Set Bignum from a File.")] HRESULT FileSet([in] BYTE Bignum, [in] BSTR StringBSTRFileName, [in, defaultvalue(10L)] LONG  BignumBase);
    [id(18), helpstring("FileGet(Bignum-number in the array, StringBSTR - string-in FileName, BignumBase(optional)=10 (2 to 36), Precision(optional) = 0 (0-Max, 1-... - number of digits)). Get Bignum to a File.")] HRESULT FileGet([in] BYTE Bignum, [in] BSTR StringBSTRFileName, [in, defaultvalue(10L)] LONG  BignumBase, [in, defaultvalue(0L)] LONGLONG Precision);
};
[
    uuid(77d79ca3-15a0-4310-b8d8-0bcbe3f72d96),
    version(1.0),
]
library BedvitCOM //BedvitCOMLib
{
    importlib("stdole2.tlb");
    [
        uuid(7a302456-4426-48ac-a3ee-e4194b64896c)
    ]
    coclass BignumArithmeticInteger
    {
        [default] interface IBignumArithmeticInteger;
    };
    [
        uuid(2a3d6235-750f-46c2-bca3-cb7f528f127c)
    ]
    coclass BignumArithmeticFloat
    {
        [default] interface IBignumArithmeticFloat;
    };
};
 
import "shobjidl.idl";
import "shobjidl.idl";

Библа подключается по uuid(77d79ca3-15a0-4310-b8d8-0bcbe3f72d96).

В реестр пишу:
Кликните здесь для просмотра всего текста
C++
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
HKCR
{
    BedvitCOM.BignumArithmeticFloat.1 = s 'BignumArithmeticFloat class'
    {
        CLSID = s '{2a3d6235-750f-46c2-bca3-cb7f528f127c}'
    }
    BedvitCOM.BignumArithmeticFloat = s 'BignumArithmeticFloat class'
    {       
        
        CurVer = s 'BedvitCOM.BignumArithmeticFloat.1'
    }
 
    NoRemove CLSID
    {
        ForceRemove {2a3d6235-750f-46c2-bca3-cb7f528f127c} = s 'BignumArithmeticFloat class'
        {
 
            ProgID = s 'BedvitCOM.BignumArithmeticFloat.1'
            VersionIndependentProgID = s 'BedvitCOM.BignumArithmeticFloat'
 
            ForceRemove Programmable
            InprocServer32 = s '%MODULE%'
            {
                val ThreadingModel = s 'Apartment'
            }
            TypeLib = s '{77d79ca3-15a0-4310-b8d8-0bcbe3f72d96}'
            Version = s '1.0'
        }
    }
}
//и другой класс
HKCR
{
    BedvitCOM.BignumArithmeticInteger.1 = s 'BignumArithmeticInteger class'
    {
        CLSID = s '{7a302456-4426-48ac-a3ee-e4194b64896c}'
    }
    BedvitCOM.BignumArithmeticInteger = s 'BignumArithmeticInteger class'
    {   
        CLSID = s '{7a302456-4426-48ac-a3ee-e4194b64896c}'
        CurVer = s 'BedvitCOM.BignumArithmeticInteger.1'
    }
 
    NoRemove CLSID
    {
        ForceRemove {7a302456-4426-48ac-a3ee-e4194b64896c} = s 'BignumArithmeticInteger class'
        {
 
            ProgID = s 'BedvitCOM.BignumArithmeticInteger.1'
            VersionIndependentProgID = s 'BedvitCOM.BignumArithmeticInteger'
 
            ForceRemove Programmable
            InprocServer32 = s '%MODULE%'
            {
                val ThreadingModel = s 'Apartment'
            }
            TypeLib = s '{77d79ca3-15a0-4310-b8d8-0bcbe3f72d96}'
            Version = s '1.0'
        }
    }
}


По-моему к свойствам и методам можно еще обращаться и по id(). В реализации интерфейса (см.выше) можно посмотреть id() для каждого свойства или метода.
0
5000 / 1672 / 409
Регистрация: 25.04.2010
Сообщений: 4,619
Записей в блоге: 2
04.04.2018, 15:08 87
Цитата Сообщение от The trick Посмотреть сообщение
Quiet Snow, скинь пожалуйста exe
См. вложение.

Цитата Сообщение от The trick Посмотреть сообщение
Вторая ошибкаэто то что ты передаешь BSTR а нужно *BSTR
Оператор SADD получает смещение(адрес) начала памяти строки.
В начале строки я выделил 4 байта(2 пробела) и забил в них(в этот INTEGER) длину т.е значение 6.
Вроде бы всё по стандарту, в любом случае прога бы хоть что-то вывела до нуля.

Load Effective Adress (LEA) не помог.
Вложения
Тип файла: zip FBCOM.zip (11.1 Кб, 4 просмотров)
0
Модератор
9723 / 3684 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
04.04.2018, 20:13 88
Цитата Сообщение от Quiet Snow Посмотреть сообщение
См. вложение.
Посмотрел. 3 ошибки

1. Как я говорил ты передаешь указатель на префикс (6), а нужно на строку. Либо сделать типа того:
PureBasic
1
2
POKE INTEGER, Sa, 6
Sa = Sa + 4
Либо просто использовать SysAllocString которая сама делает BSTR из обычной строки.

2. Лишнее перенаправление. Вместо указателя на интерфейс ты передаешь указатель уже на метод, а вместо вызова метода по указателю вызываешь по значению первых инструкций самого метода.

3. Вместо указателя на BSTR, передается BSTR.

2 и 3 решается изменением ассемблерного кода:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
   ASM
      LEA ECX, Sa       '  Параметр функции(смещение BSTR)
      PUSH ECX          '  В стек
 
      MOV EAX, IFace    '   В EAX по идее находится [указатель на интерфейс]
      PUSH EAX          '   Забьем его в стек
      MOV ECX, EAX      '   В ECX - указатель на интерфейс
      MOV EAX, [ECX]    '   Указатель на первый элемент таблицы методов
 
      CALL [EAX + F_ShowMsgBox]   '  Вызываем
 
    END ASM
0
4392 / 2242 / 252
Регистрация: 28.10.2011
Сообщений: 8,571
Записей в блоге: 6
04.04.2018, 22:36 89
Цитата Сообщение от The trick Посмотреть сообщение
Вот простейший пример использования COM библиотеки
CoCreateInstance возвращает 8007007E.
0
Модератор
9723 / 3684 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
04.04.2018, 22:44 90
locm, dll требует MSVBVM60.dll.
0
4392 / 2242 / 252
Регистрация: 28.10.2011
Сообщений: 8,571
Записей в блоге: 6
04.04.2018, 22:58 91
Судя по тому что LoadLibrary возвращает не 0, MSVBVM60.dll есть.
0
Модератор
9723 / 3684 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
04.04.2018, 22:59 92
locm, ошибка ERROR_MOD_NOT_FOUND что означает не найден модуль, либо сама dll либо импорт, либо неправильно зарегистрирована, либо неверный манифест.
0
4392 / 2242 / 252
Регистрация: 28.10.2011
Сообщений: 8,571
Записей в блоге: 6
04.04.2018, 23:06 93
Манифест и dll взял из архива Подключить библиотеку dll
Регистрировал dll (успешно) но это не устраняло ошибку.
0
Модератор
9723 / 3684 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
04.04.2018, 23:08 94
locm, какая система? Без манифеста работает? У Quiet Snow все заработало.
Код создания мой? Или какой-то свой? Dll в папке (если используется манифест) с программой? Название как в манифесте? Если код другой, то лучше скинуть архив с файлами тогда уже видно будет.
0
4392 / 2242 / 252
Регистрация: 28.10.2011
Сообщений: 8,571
Записей в блоге: 6
04.04.2018, 23:46 95
Тот что в архиве работает. Мой код сообщает об ошибке CoCreateInstance.
Вложения
Тип файла: zip COM_Test.zip (6.4 Кб, 6 просмотров)
0
Модератор
9723 / 3684 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
04.04.2018, 23:55 96
locm, завтра посмотрю.
0
4392 / 2242 / 252
Регистрация: 28.10.2011
Сообщений: 8,571
Записей в блоге: 6
05.04.2018, 00:02 97
С ошибкой разобрался. Дело было в том что запускал под управлением отладчика и исполняемый файл создавался во временной папке.
Теперь другая проблема. Программа вылетает при вызове метода ShowMsgBox с сообщением "Невозможен доступ к памяти. Ошибка чтения по такому-то адресу". Методу передается BSTR строка.
0
Модератор
9723 / 3684 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
05.04.2018, 00:10 98
locm, нужно передавать указатель на BSTR строку.
0
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
05.04.2018, 07:32 99
Цитата Сообщение от locm Посмотреть сообщение
Методу передается BSTR строка.
OLE/COM Interface generator выдает, что там должен быть указатель
PureBasic
1
2
3
4
5
6
7
8
9
10
Interface _CTest
  QueryInterface(riid.l,ppvObj.l)
  AddRef()
  Release()
  GetTypeInfoCount(pctinfo.l)
  GetTypeInfo(itinfo.l,lcid.l,pptinfo.l)
  GetIDsOfNames(riid.l,rgszNames.l,cNames.l,lcid.l,rgdispid.l)
  Invoke(dispidMember.l,riid.l,lcid.l,wFlags.l,pdispparams.l,pvarResult.l,pexcepinfo.l,puArgErr.l)
  ShowMsgBox(sText.l)
EndInterface
И встроенных по умолчанию методов побольше. Если при подключении MSPleer я убирал "лишние" методы из интерфейса, то тоже выдает ошибку доступа к памяти. Видать эта структура жесткая, и размер контролируется или доступ по смещению.

И GUIDs не совпадает у меня, вернее один совпадает.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
DataSection
  CLSID_TESTLIB:  ; {B219CE6E-9B8D-46EA-9CBF-A7F5DDCC9E96}
    Data.l $B219CE6E
    Data.w $9B8D,$46EA
    Data.b $9C,$BF,$A7,$F5,$DD,$CC,$9E,$96
 
  IID__CTest:  ; {D83F0A2C-3940-4237-B88E-7097479D01C6}
    Data.l $D83F0A2C
    Data.w $3940,$4237
    Data.b $B8,$8E,$70,$97,$47,$9D,$1,$C6
EndDataSection
0
4392 / 2242 / 252
Регистрация: 28.10.2011
Сообщений: 8,571
Записей в блоге: 6
05.04.2018, 10:10 100
Цитата Сообщение от The trick Посмотреть сообщение
нужно передавать указатель на BSTR строку
Он и передается.

Цитата Сообщение от Pro_grammer Посмотреть сообщение
OLE/COM Interface generator выдает, что там должен быть указатель
Он вообще типы переменных не определяет.
PB по умолчанию передает строки по указателю.

Цитата Сообщение от Pro_grammer Посмотреть сообщение
И встроенных по умолчанию методов побольше.
Интерфейс аналогичен. Просто часть методов наследуется от IUnknown.
PureBasic
1
2
3
4
5
6
7
Interface CTest Extends IUnknown
  GetTypeInfoCount(pctinfo)
  GetTypeInfo(itinfo,lcid,pptinfo)
  GetIDsOfNames(riid,rgszNames,cNames,lcid,rgdispid)
  Invoke(dispidMember,riid,lcid,wFlags,pdispparams,pvarResult,pexcepinfo,puArgErr)
  ShowMsgBox(sText.p-bstr)
EndInterface
Цитата Сообщение от Pro_grammer Посмотреть сообщение
И GUIDs не совпадает у меня, вернее один совпадает.
Тоже самое. Но с такими ID не работает.
0
05.04.2018, 10:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2018, 10:10
Помогаю со студенческими работами здесь

Не могу подключить dll библиотеку
Вообщем есть библиотека Visa32.dll и я не могу ее подключить. Так же есть два заголовочных файла -...

Как подключить библиотеку 7z.dll?
Как подключить библиотеку 7z.dll. Я скачал архив с сурсами, откопал 7z.dll пытаюьс добавить в...

Как подключить библиотеку i7000.dll?
у меня есть библиотека i7000.dll библиотека необходимая для работы с com портами все остальное...

Как подключить библиотеку shell32.dll ?
Решил воспользоваться примером открытия файла с помощью необходимого приложения. В примере...


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru