Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Вопрос: C++ vs Basic
Добавлено: 21.03.05 18:24
Автор вопроса: Дмитрий Щапов
Ответы
Всего ответов: 127
Номер ответа: 16
Автор ответа:
Дмитрий Щапов
Вопросов: 71
Ответов: 321
Профиль | | #16
Добавлено: 23.03.05 18:15
Тьфу, блин. Точно __stdcall забыл подставить.
А в WIN 32 DLL как вызвать вункцию. Ну мне надо сделать типа события. Так может вызывать её по адресу.
Номер ответа: 17
Автор ответа:
Дмитрий Щапов
Вопросов: 71
Ответов: 321
Профиль | | #17
Добавлено: 23.03.05 18:21
Мда. Функцию вызвать внешнюю. Допустим я в Basic использую ДЛЛ и мне из DLL надо вызвать функцию Basic'a.
Номер ответа: 18
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #18
Добавлено: 23.03.05 18:44
Ну передай в dll addressof функции, и вызывай.
Номер ответа: 19
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #19
Добавлено: 23.03.05 18:53
Только функция, адрес которой передаёшь в dll, должна находиться в модуле
Номер ответа: 20
Автор ответа:
Дмитрий Щапов
Вопросов: 71
Ответов: 321
Профиль | | #20
Добавлено: 23.03.05 18:54
Главное осталось незатронутым. Ну и как вызывать-то?
Номер ответа: 21
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #21
Добавлено: 23.03.05 19:50
1.Пишешь в модуле свою процедуру.
2.Получаешь при помощи addressof её адрес.
3.Вызываешь в dll процедуру, и передаёшь ей этот адрес. Процедура может сохранить этот адрес где-нибудь в переменной, например vbfuncaddr.
4. Когда нужно вызвать vb процедуру, достаешь её адрес из переменной, и вызываешь call по этому адресу:
__asm{
mov eax, vbfuncaddr
call eax
}
5.Всё.
Номер ответа: 22
Автор ответа:
Дмитрий Щапов
Вопросов: 71
Ответов: 321
Профиль | | #22
Добавлено: 23.03.05 19:56
А как с параметрами быть?
Номер ответа: 23
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #23
Добавлено: 23.03.05 20:12
Т.е. в модуле так:
MsgBox "vb sub from c++ dll"
End Sub
Public Function GetAddr(lngAddr As Long) As Long
GetAddr = lngAddr
End Function
В форме так:
Dim pArr As Long
pArr = GetAddr(AddressOf MeesageSub)
SetFuncAddr pArr
End Sub
В dll так:
//===============================================
DWORD __declspec(dllexport) __stdcall SetFuncAddr(int dwAddr){
char buffer[32];
wsprintf(buffer,"%lu",dwAddr);
MessageBox(NULL,buffer,"Address From VB",0);
__asm{
mov eax,dwAddr
mov eax,[eax]
call eax
}
return 0;
}
Номер ответа: 24
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #24
Добавлено: 23.03.05 20:13
Блин, тебе ещё и параметры подавай !
Номер ответа: 25
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #25
Добавлено: 23.03.05 20:33
Если с параметрами то так:
В модуле:
MsgBox "vb sub from c++ dll" & vbNewLine & P1 & vbNewLine & P2
End Sub
Public Function GetAddr(lngAddr As Long) As Long
GetAddr = lngAddr
End Function
В форме так:
Private Sub Command1_Click()
Dim pArr As Long
pArr = GetAddr(AddressOf MeesageSub)
SetFuncAddr pArr, 111111, 222222
End Sub
//===============================================
DWORD __declspec(dllexport) __stdcall SetFuncAddr(int dwAddr, int par1, int par2){
char buffer[32];
wsprintf(buffer,"%lu",dwAddr);
MessageBox(NULL,buffer,"Address From VB",0);
__asm{
mov eax, par2
mov eax, [eax]
push eax
mov eax, par1
mov eax, [eax]
push eax
mov eax, dwAddr
mov eax, [eax]
call eax
}
return 0;
}
Обрати внимание на то, что ф-ция в dll принимает параметры не ByVal. Поэтому в dll делаем ещё и mov eax,[eax].
Если изменить декларацию на ByVal addr, ByVal Param1, ByVal Param2, то mov eax,[eax] не нужно будет. Но без ByVal более гибко получается. Можно иметь кроме самого значения адреса и параметров ещё и адреса ячеек, где они прописаны. На всякий случай.
Номер ответа: 26
Автор ответа:
Дмитрий Щапов
Вопросов: 71
Ответов: 321
Профиль | | #26
Добавлено: 23.03.05 20:59
.Спасибо cresta, зато смотри сколько у тебя сразу ответов стало! Уухх! Аж дыхание перехватывает и сердце останавливается.
Номер ответа: 27
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #27
Добавлено: 23.03.05 21:18
можно вызывать и без ассемблера, но есть ограничение по параметрам:
CallWindowProc
(CallWndProc, CallWindowProcA)
вместо хендла окна передавай адрес функции
Номер ответа: 28
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #28
Добавлено: 23.03.05 21:19
можно вызывать и без ассемблера, но есть ограничение по параметрам:
CallWindowProc
(CallWndProc, CallWindowProcA)
вместо хендла окна передавай адрес функции
Номер ответа: 29
Автор ответа:
Дмитрий Щапов
Вопросов: 71
Ответов: 321
Профиль | | #29
Добавлено: 23.03.05 23:25
Блин. В сях есть функ для замены текста в строке или нет?! Типа Replace в VB.
Номер ответа: 30
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #30
Добавлено: 23.03.05 23:48
Начнем с того, что в самом языке Си строк вообще нет... А что касается стандартных библиотек, то там есть очень многое, в том числе и это.