Страница: 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
 GSerg


Вопросов: 0
Ответов: 1876 
      
 Профиль |  | #18
       
Добавлено:  23.03.05 18:44
       
    
       
  
Ну передай в dll addressof функции, и вызывай.
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 19 
      
Автор ответа: cresta
 cresta


Вопросов: 117
Ответов: 1538
      
 Профиль |  | #19
       
Добавлено:  23.03.05 18:53
       
    
       
  
Только функция, адрес которой передаёшь в dll, должна находиться в модуле
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 20 
      
Автор ответа: Дмитрий Щапов
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
      
 Профиль |  | #20
       
Добавлено:  23.03.05 18:54
       
    
       
  
Главное осталось незатронутым. Ну и как вызывать-то?
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 21 
      
Автор ответа: cresta
 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
 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
 cresta


Вопросов: 117
Ответов: 1538
      
 Профиль |  | #24
       
Добавлено:  23.03.05 20:13
       
    
       
  
Блин, тебе ещё и параметры подавай !
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 25 
      
Автор ответа: cresta
 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
 DaSharm

ICQ: 780477 
Вопросов: 72
Ответов: 1297
      
 Web-сайт:  
 Профиль |  | #27
      
Добавлено:  23.03.05 21:18
       
    
       
  
можно вызывать и без ассемблера, но есть ограничение по параметрам:
 
    
CallWindowProc
(CallWndProc, CallWindowProcA)
вместо хендла окна передавай адрес функции
		
	  
			 
	
		 
    
       
    
Номер ответа: 28 
      
Автор ответа: DaSharm
 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
 Sharp










Лидер форума
ICQ: 216865379 
Вопросов: 106
Ответов: 9979
      
 Web-сайт:  
 Профиль |  | #30
      
Добавлено:  23.03.05 23:48
       
    
       
  
Начнем с того, что в самом языке Си строк вообще нет... А что касается стандартных библиотек, то там есть очень многое, в том числе и это.