Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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
Т.е. в модуле так:

Public Sub MeesageSub()
    MsgBox "vb sub from c++ dll"
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
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
Если с параметрами то так:

В модуле:

Public Sub MeesageSub(ByVal P1 As Long, ByVal P2 As Long)
    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 Declare Function SetFuncAddr Lib "MyCool.dll" (addr As Long, Param1 As Long, Param2 As Long) As Long

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-сайт: dasharm.com
 Профиль | | #27
Добавлено: 23.03.05 21:18
можно вызывать и без ассемблера, но есть ограничение по параметрам:
CallWindowProc
(CallWndProc, CallWindowProcA)

вместо хендла окна передавай адрес функции

Ответить

Номер ответа: 28
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #30
Добавлено: 23.03.05 23:48
Начнем с того, что в самом языке Си строк вообще нет... А что касается стандартных библиотек, то там есть очень многое, в том числе и это.

Ответить

Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам