Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/68: Рейтинг темы: голосов - 68, средняя оценка - 4.59
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1

Создание DLL

23.07.2013, 16:20. Показов 14056. Ответов 103
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код программы (пример использования DLL):
Visual Basic
1
2
3
4
5
6
Option Explicit
Private Declare Function Symma Lib "Summ.dll" Alias "Summ" (ByVal a As Integer, ByVal b As Integer) As Integer
 
Private Sub Command1_Click()
Text3.Text = Symma(Val(Text1.Text), Val(Text2.Text))
End Sub
Код DLL (точнее ActiveX DLL):
Visual Basic
1
2
3
Private Function Summ(ByVal a As Integer, ByVal b As Integer) As Integer
Summ = a + b
End Function
В Project-References перечислены все ActiveX объекты на компьютере, там нужно добавить имя проекта DLL (например Project2).

Вот таким образом я всё сделал по инструкции из статей по работе с DLL, но не могу скомпилировать exe: пишет, что нужно скомпилировать сначала второй проект с DLL. Его компиляция (Make Summ.dll), а также (одновременная компиляция всей группы проектов) Make Project Group не дают результата - якобы он не скомпилирован, хотя это не так. Плюс при компиляции DLL выдает сообщение, что нельзя получить доступ к системному регистру (System Registry).
В чём может быть дело?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.07.2013, 16:20
Ответы с готовыми решениями:

Создание ActiveX Dll в VB 6
Здравствуйте! У меня имеется .dll, .lib и .hpp файлы, библиотека используется управления контроллером. Хочу создать ActiveX враппер для...

Создание dll на основе Visual Basic
Помогите решить рабочую задачу: создание dll на основе visual basic. Требуется трехмерная модель с указанием переменных размеров. Размеры...

Создание DLL в VB, в которой хранятся формы.
Подскажите какие-нибудь ресурсы где можно почитать о создании DLL в VB, в которой хранятся формы.

103
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
02.08.2013, 21:20  [ТС]
Студворк — интернет-сервис помощи студентам
Что касается работы с DLL, то я сам ещё полный новичок. Написал основы, их я знаю. Дальнейшее увеличение статьи потребует сначала изучения мною DLL более подробно. А пока:

Цитата Сообщение от Catstail Посмотреть сообщение
По поводу ActiveX-Dll рекомендую заглянуть сюда и сюда
Автор этих статей, вероятно, профессионал в своём деле (я про классы могу написать, а про OLE и СОМ - нет), потому я лучше дам ссылку на его статьи, чтобы читатель ознакомился с ними.

Цитата Сообщение от Catstail Посмотреть сообщение
как создает процедурные Dll автор надстройки
В конце статьи есть ссылка на форум создателей надстройки (даль тут придется её убрать!), там они в теме полностью описывают работу. Думаю, можно написать коротко на чём это вообще основывается, и если читатель заинтересуется, перейдет по ссылке для подробностей.

Цитата Сообщение от The trick Посмотреть сообщение
О соглашениях вызовов функций, хотя бы stdCall и cDecl.
stdCall, насколько я знаю, и в Delphi, и в VB6 по-умолчанию используется. Про работу cDecl в ВБ знаю только, что нужно писать Declare Sub SUB_NAME cDecl Lib "LIBRARY.DLL"... Про остальные соглашения ничего нет (Википедия), да и для понятия их принципа нужно знакомство с Ассемблером. Так что выйдет у меня коротко о них рассказать, без подробностей.
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
02.08.2013, 21:28
Цитата Сообщение от Craw Посмотреть сообщение
Declare Sub SUB_NAME cDecl Lib "LIBRARY.DLL"...
В IDE и при компиляции в P-код не пойдет, этот вызов работает только при компиляции в Native код.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
02.08.2013, 21:45
Craw, без авторства не пойдет, так что для статьи 1 гиперссылку на форум разрешаю.
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
02.08.2013, 23:52  [ТС]
Итак, все, о чём я говорил, добавил.
Рассказал и о соглашениях вообще. Описал способ объявления cdecl функций в разделе деклараций с помощью cDecl, и его недостатки.

А как насчёт динамического подключения? Я нашёл такой код:
Visual Basic
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
Option Explicit
 
'Private Declare Sub qsort Lib "ntdll" (base As Any, ByVal num As Long, ByVal width As Long, ByVal compare As Long)
'Private Declare Function VarCmp Lib "oleaut32" (ByVal pvarLeft As Variant, ByVal pvarRight As Variant, ByVal lcid As Long, ByVal dwFlags As Long) As Long
Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal Length As Long)
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpFunc As Long, ByVal Param1 As Long, ByVal Param2 As Long, ByVal Param3 As Long, ByVal Param4 As Long) As Long
Dim hModule1 As Long, EntryPoint As Long
Dim hModule2 As Long, VarCmp As Long
Dim Thunk(0 To 32) As Byte
Dim Comparer(0 To 24) As Byte
 
Public Sub Initialize()
    hModule1 = LoadLibrary("ntdll")
    EntryPoint = GetProcAddress(hModule1, "qsort")
    hModule2 = LoadLibrary("oleaut32")
    VarCmp = GetProcAddress(hModule2, "VarCmp")
    
    CopyMemory Thunk(0), &H102474FF, 4  'FF742410   push dword ptr [esp+10h]
    CopyMemory Thunk(4), &H102474FF, 4  'FF742410   push dword ptr [esp+10h]
    CopyMemory Thunk(8), &H102474FF, 4  'FF742410   push dword ptr [esp+10h]
    CopyMemory Thunk(12), &H102474FF, 4 'FF742410   push dword ptr [esp+10h]
    CopyMemory Thunk(16), &H6E8, 2      'E806000000 call $+6
    CopyMemory Thunk(21), &H10C483, 3   '83C410     add esp, 10h
    CopyMemory Thunk(24), &H10C2, 2     'C21000     ret 10h
    Thunk(27) = &H68                    '68xxxxxxxx push xxxxxxxx
    CopyMemory Thunk(28), EntryPoint, 4
    Thunk(32) = &HC3                    'C3         ret
    
    Comparer(0) = &H6A                  '6A00       push 0
    Comparer(2) = &H6A                  '6A00       push 0
    CopyMemory Comparer(4), &H102474FF, 4 'FF742410 push dword ptr [esp+10h]
    CopyMemory Comparer(8), &H102474FF, 4 'FF742410 push dword ptr [esp+10h]
    CopyMemory Comparer(12), &H2E8, 2   'E802000000 call $+2
    Comparer(17) = &H48                 '48         dec eax
    Comparer(18) = &HC3                 'C3         ret
    Comparer(19) = &H68                 '68xxxxxxxx push xxxxxxxx
    CopyMemory Comparer(20), VarCmp, 4
    Comparer(24) = &HC3                 'C3         ret
End Sub
 
Public Sub Terminate()
    FreeLibrary hModule1
    FreeLibrary hModule2
End Sub
 
Public Sub SystemSort(SortArray())
    Initialize
    CallWindowProc VarPtr(Thunk(0)), VarPtr(SortArray(LBound(SortArray))), UBound(SortArray) - LBound(SortArray) + 1, 16, VarPtr(Comparer(0))
    Terminate
End Sub
 
 
 
Sub Main()
Dim i As Long, MyArr(-800 To 4000), StartTime As Single
  
  Randomize Timer
  For i = LBound(MyArr) To UBound(MyArr)
    MyArr(i) = Rnd * 800
  Next
 
  StartTime = Timer
  SystemSort MyArr
  Debug.Print Round(Timer - StartTime, 4)
 
End Sub
Здесь используется функция qsort для сортировки массива из ntdll.dll, которая написана на Си (cdecl).
Может кто-нибудь объяснить принцип работы кода?
0
Эксперт по электронике
7139 / 3319 / 341
Регистрация: 28.10.2011
Сообщений: 13,040
Записей в блоге: 7
03.08.2013, 00:33
Цитата Сообщение от Craw Посмотреть сообщение
Может кто-нибудь объяснить принцип работы кода?
Я извиняюсь, но тут вызов через одно место. В массив записывается машинный код и запускается функцией CallWindowProc().
VB для таких целей явно не подходит. Уж лучше сделали нормальную асм. вставку, чем такую ерунду.

Добавлено через 14 минут

Не по теме:

Цитата Сообщение от Craw Посмотреть сообщение
которая написана на Си (cdecl).
ЯП значения не имеет. Создать функцию с соглашением вызова cdecl, можно на многих языках.

0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
03.08.2013, 02:47
Цитата Сообщение от Craw Посмотреть сообщение
Может кто-нибудь объяснить принцип работы кода?
Visual Basic
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
Public Sub Initialize()
    hModule1 = LoadLibrary("ntdll")
    EntryPoint = GetProcAddress(hModule1, "qsort")
    hModule2 = LoadLibrary("oleaut32")
    VarCmp = GetProcAddress(hModule2, "VarCmp")
    
    ' cDecl - ложим в стек параметры справа налево
    
    CopyMemory Thunk(0), &H102474FF, 4  'FF742410   push dword ptr [esp+10h] - помещаемаем адрес функции VarCmp
    CopyMemory Thunk(4), &H102474FF, 4  'FF742410   push dword ptr [esp+10h] - помещаем размер (в байтах) одной переменной
    CopyMemory Thunk(8), &H102474FF, 4  'FF742410   push dword ptr [esp+10h] - помещаем кол-во элементов массива
    CopyMemory Thunk(12), &H102474FF, 4 'FF742410   push dword ptr [esp+10h] - помещаем указатель на буфер
    CopyMemory Thunk(16), &H6E8, 2      'E806000000 call $+6 - помещаем в стек, адрес следующей инструкции,
                                        ' после вызова qSort, выполнение начнется с нее. А также вызываем
                                        ' инструкцию расположенную на шесть байт после текущей
    CopyMemory Thunk(21), &H10C483, 3   '83C410     add esp, 10h - вызов cDecl чистим стек здесь, потому что
                                        ' VB не будет этого за нами делать
    CopyMemory Thunk(24), &H10C2, 2     'C21000     ret 10h - Тоже для CallWindowProc
    Thunk(27) = &H68                    '68xxxxxxxx push xxxxxxxx - здесь пишем адрес функции qSort в стек
    CopyMemory Thunk(28), EntryPoint, 4
    Thunk(32) = &HC3                    'C3         ret - удаляем из стека адрес функции qSort, и вызываем ее
    
    ' Для косвенного вызова через qSort функции VarCmp (сравнение двух Variant переменных)
    ' qSort сама чистит стек после выполнения этой вставки.
    ' stdCall - ложим в стек параметры справа налево
    
    Comparer(0) = &H6A                  '6A00       push 0 - dwFlags
    Comparer(2) = &H6A                  '6A00       push 0 - lcid
    CopyMemory Comparer(4), &H102474FF, 4 'FF742410 push dword ptr [esp+10h] - pvarRight
    CopyMemory Comparer(8), &H102474FF, 4 'FF742410 push dword ptr [esp+10h] - pvarLeft
    CopyMemory Comparer(12), &H2E8, 2   'E802000000 call $+2 - Начнем выполнение с Comparer(19) (push xxxxxxxx -
                                        ' где xxxxxxxx- адрес функции VarCmp)
                                        ' Возвращаемое значение в регистре eax
    Comparer(17) = &H48                 '48         dec eax  - Вычитаем единицу для соответствия константам qSort'a
    Comparer(18) = &HC3                 'C3         ret - stdcall функция VarCmp сама почистила стек, поэтому просто выходим
                                        
    Comparer(19) = &H68                 '68xxxxxxxx push xxxxxxxx - здесь пишем адрес функции VarCmp в стек
    CopyMemory Comparer(20), VarCmp, 4
    Comparer(24) = &HC3                 'C3         ret - переходим к выполнению VarCmp
End Sub
Добавлено через 48 минут
Чуть короче и более наглядней:
Visual Basic
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
    ' cDecl - ложим в стек параметры справа налево
    
    CopyMemory Thunk(0), &H102474FF, 4  'FF742410   push dword ptr [esp+10h] - помещаемаем адрес функции VarCmp
    CopyMemory Thunk(4), &H102474FF, 4  'FF742410   push dword ptr [esp+10h] - помещаем размер (в байтах) одной переменной
    CopyMemory Thunk(8), &H102474FF, 4  'FF742410   push dword ptr [esp+10h] - помещаем кол-во элементов массива
    CopyMemory Thunk(12), &H102474FF, 4 'FF742410   push dword ptr [esp+10h] - помещаем указатель на буфер
    Thunk(16) = &HB8                    'B800000000 - помещаем в eax адрес функции qSort
    CopyMemory Thunk(17), EntryPoint, 4
    CopyMemory Thunk(21), &HD0FF, 2     'FFD0 - Call eax вызываем qSort
    CopyMemory Thunk(23), &H10C483, 3   '83C410     add esp, 10h - вызов cDecl чистим стек здесь, потому что
                                        ' VB не будет этого за нами делать
    CopyMemory Thunk(26), &H10C2, 2     'C21000     ret 10h - Тоже для CallWindowProc
 
    ' Для косвенного вызова через qSort функции VarCmp (сравнение двух Variant переменных)
    ' qSort сама чистит стек после выполнения этой вставки.
    ' stdCall - ложим в стек параметры справа налево
    
    Comparer(0) = &H6A                  '6A00       push 0 - dwFlags
    Comparer(2) = &H6A                  '6A00       push 0 - lcid
    CopyMemory Comparer(4), &H102474FF, 4 'FF742410 push dword ptr [esp+10h] - pvarRight
    CopyMemory Comparer(8), &H102474FF, 4 'FF742410 push dword ptr [esp+10h] - pvarLeft
    Comparer(12) = &HB8                 'B800000000 - помещаем в eax адрес функции VarCmp
    CopyMemory Comparer(13), VarCmp, 4
    CopyMemory Comparer(17), &HD0FF, 2  'FFD0 - Call eax вызываем VarCmp
                                        ' Возвращаемое значение в регистре eax
    Comparer(19) = &H48                 '48         dec eax  - Вычитаем единицу для соответствия константам qSort'a
    Comparer(20) = &HC3                 'C3         ret - stdcall функция VarCmp сама почистила стек, поэтому просто выходим
0
03.08.2013, 08:31

Не по теме:

Цитата Сообщение от locm Посмотреть сообщение
VB для таких целей явно не подходит.
Visual Basic изначально создавался как средство быстрой разработки прототипов программ. Но он развивался и вырос до полноценного ЯП.
Цитата Сообщение от locm Посмотреть сообщение
ЯП значения не имеет
ЯП имеет значение.
Почти на любом ЯП можно разрабатывать COM-компоненты, и естественно использовать их. Но на VB это так же просто, как ехе скомпилировать. А на других ЯП на на эту работу может уйти в 100 раз больше времени, и не факт что правильно получится.
Каждый инструмент предназначен для своих целей, это надо понимать. Профессионал подбирает для своей работы самый лучший инструмент, нужный в данный момент, а дилетант использует универсальный инструмент.

1
03.08.2013, 10:46

Не по теме:

Цитата Сообщение от Pro_grammer Посмотреть сообщение
ЯП имеет значение.
Почти на любом ЯП можно разрабатывать COM-компоненты
При чем здесь COM? Я писал про cdecl.
Посмотрите как криво вызывается cdecl функция в VB. А про создание стандартной DLL с cdelc функцией в VB, я вообще молчу.

0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
03.08.2013, 12:04
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Цитата Сообщение от locm Посмотреть сообщение
Посмотрите как криво вызывается cdecl функция в VB
Это только в IDE, в скомпилированном варианте можно сделать так, что она будет вызыватся также как и stdcall.
Вот использование qSort на примере пользовательской CallBack функции сравнения, в данном варианте сравниваются DWORD переменные, но видоизменив функцию Compare можно сравнивать все что угодно, по-любому критерию, хоть объекты, хоть UDT.
Visual Basic
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
Option Explicit
 
Private Declare Function GetMem4 Lib "msvbvm60" (pSrc As Any, pDst As Any) As Long
Private Declare Function GetMem2 Lib "msvbvm60" (pSrc As Any, pDst As Any) As Long
Private Declare Function PutMem4 Lib "msvbvm60" (pDst As Any, NewValue As Any) As Long
 
Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpFunc As Long, ByVal Param1 As Long, ByVal Param2 As Long, ByVal Param3 As Long, ByVal Param4 As Long) As Long
 
Dim hModule1 As Long, EntryPoint As Long
 
Dim Thunk(0 To 43) As Byte
 
Public Sub Initialize()
 
    hModule1 = LoadLibrary("ntdll")
    EntryPoint = GetProcAddress(hModule1, "qsort")
 
    ' cDecl - ложим в стек параметры справа налево
    
    Thunk(0) = &HB8                     'B800000000 - помещаем в eax адрес функции qSort
    GetMem4 EntryPoint, Thunk(1)
    Thunk(5) = &H5B                     'pop ebx
    GetMem2 &H1D89, Thunk(6)            'mov xxxxxxxx,ebx
    PutMem4 Thunk(8), Thunk(24)
    GetMem2 &HD0FF, Thunk(12)           'FFD0 - Call eax вызываем qSort
    GetMem2 &H1D8B, Thunk(14)           'mov ebx,xxxxxxxx
    PutMem4 Thunk(16), Thunk(24)
    Thunk(20) = &H53                    'push ebx
    GetMem2 &H10C2, Thunk(21)           'C21000     ret 10h - Тоже для CallWindowProc
 
    ' т.к. qSort сама чистит стек, Compare вызывается через вставку
    
    GetMem4 &H82474FF, Thunk(28)          'push   DWORD PTR [esp+0x8]  ' Дубликат параметра
    GetMem4 &H82474FF, Thunk(32)          'push   DWORD PTR [esp+0x8]  ' Дубликат параметра
    Thunk(36) = &HB8                      'mov eax,xxxxxxxx
    GetMem4 AddressOf Compare, Thunk(37)  'xxxxxxxx - Compare
    GetMem2 &HD0FF, Thunk(41)             'call eax - вызываем Compare
    Thunk(43) = &HC3                      'ret - Возвращаемся, стек почистит qSort
End Sub
 
Public Function Compare(ByVal lpOp1 As Long, ByVal lpOp2 As Long) As Long      ' CallBack - функция сравнения
    Dim Op1 As Long, Op2 As Long
    
    GetMem4 ByVal lpOp1, Op1
    GetMem4 ByVal lpOp2, Op2
    
    ' По возрастанию
    If Op1 < Op2 Then Compare = -1: Exit Function
    If Op1 = Op2 Then Compare = 0: Exit Function
    Compare = 1
    
    ' По убыванию
'    If Op1 < Op2 Then Compare = 1: Exit Function
'    If Op1 = Op2 Then Compare = 0: Exit Function
'    Compare = -1
    
End Function
 
Public Sub Terminate()
    FreeLibrary hModule1
End Sub
 
Public Sub SystemSort(SortArray() As Long)
    Initialize
    CallWindowProc VarPtr(Thunk(0)), _
                   VarPtr(SortArray(LBound(SortArray))), _
                   UBound(SortArray) - LBound(SortArray) + 1, _
                   LenB(SortArray(LBound(SortArray))), VarPtr(Thunk(28))
    Terminate
End Sub
 
Sub Main()
    Dim i As Long, MyArr(0 To 4000) As Long
    
    For i = 0 To UBound(MyArr)
        MyArr(i) = Rnd * 800
    Next
    
    SystemSort MyArr
 
End Sub
0
Эксперт по электронике
7139 / 3319 / 341
Регистрация: 28.10.2011
Сообщений: 13,040
Записей в блоге: 7
03.08.2013, 13:08
Цитата Сообщение от The trick Посмотреть сообщение
Это только в IDE, в скомпилированном варианте можно сделать так, что она будет вызыватся также как и stdcall.
При статической загрузке?
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
03.08.2013, 13:13
Цитата Сообщение от locm Посмотреть сообщение
При статической загрузке?
Да, только нужно tlb файл c описанием прототипа функции. Он нужен только во время компиляции, после компиляции он не нужен.
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
03.08.2013, 17:29  [ТС]
Мне, как не знакомому с Ассемблером, комментарии в этих кодах нисколько не помогают понять их смысл. Также нигде не нашел описание этих API-функций, и связь из работы с комментариями на Ассемблере.
И, кроме того, раз это мы напишем про использование, то как же создание? Или будет ещё запутанней?
0
03.08.2013, 18:38

Не по теме:

Цитата Сообщение от Craw Посмотреть сообщение
И, кроме того, раз это мы напишем про использование, то как же создание? Или будет ещё запутанней?
Забудьте, оно того не стоит.
Вы бы еще дрова на VB решили бы написать.:D:wall:

Если хотите работать с cdecl (создавать DLL с cdecl-функциями и вызывать их), то лучше сменить ЯП, хотя бы на другой бейсик (PureBasic и т. п.) в котором это изначально поддерживается без всяких танцев с бубном.

0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
03.08.2013, 19:43
Цитата Сообщение от Craw Посмотреть сообщение
Мне, как не знакомому с Ассемблером, комментарии в этих кодах нисколько не помогают понять их смысл.
Ну если хотите использовать cDecl, нужно хотябы знать основы, в данном случае механизм вызова функций, что такое стек.
Цитата Сообщение от Craw Посмотреть сообщение
Также нигде не нашел описание этих API-функций, и связь из работы с комментариями на Ассемблере.
Поищите внимательней, это обычные функция копирования в память без лишних действий, вместо огромедной CopyMemory. (GetMem, PutMem)
Цитата Сообщение от Craw Посмотреть сообщение
И, кроме того, раз это мы напишем про использование, то как же создание? Или будет ещё запутанней?
Зачем писать про создание cDecl библиотек? Использование понятно. Есть какая-нибудь DLL, которая экспортирует функции как cDecl (например для работы с каким нибудь устройством, а stdCall-версии этой библиотеки нет вообще в природе), как поступить программисту на VB? Тем более в скомпилированном варианте они вызываются также легко как и stdcall
Вообще если статья называется "Работа с DLL в Visual Basic", то нужно написать про соглашение вызова и приемы вызова cDecl функций. В противном случае статья неполна.
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
03.08.2013, 22:07  [ТС]
Статья готова, все, что просили, включил, сейчас её опубликую здесь. Текст
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
03.08.2013, 22:29
Цитата Сообщение от Craw Посмотреть сообщение
На основе этой темы и всей информации здесь я написал статью для своего сайта - Работа с DLL в Visual Basic.
Раз так. Я бы упомянул всех, кто помогал Вам со статьей.
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
03.08.2013, 22:33  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
Раз так. Я бы упомянул всех, кто помогал Вам со статьей.
А почему бы и нет? Напишу "Отдельная благодарность за помощь в написании статьи:..."
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
03.08.2013, 22:40
Цитата Сообщение от Craw Посмотреть сообщение
Статья готова, все, что просили, включил, сейчас её опубликую здесь.
Лучше добавьте код с Callback функцией, это во-первых гибче, т.к. позволяет менять критерий сравнения; во-вторых использование CopyMemory Для копирования 2-4 байт, это что из пушки по воробьям.
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
03.08.2013, 22:52  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Лучше добавьте код с Callback функцией
Добавил оба, чтобы читатель сам выбрал подходящий.
Статья готова - Работа с DLL в Visual Basic (статья)
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
03.08.2013, 23:33
Еще про псевдонимы поподробнее надо написать, что можно сделыть "как бы перегрузку" функций с помощью них
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2013, 23:33

Создание процедурных DLL в Visual Basic (статья)
Создание процедурных DLL в Visual Basic Несколько слов о резонах создания процедурных Dll на VB. Как известно, VB позволяет без...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru