Страница: 1 | 
		
		 
			   
			 
			 
			 
			 Страница: 1 | 
 
			
 
  
		
     
  
    
Вопрос: Работа с DLL – как: основы?
     
    
Добавлено: 07.09.08 13:24
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
    
 robinLib
      
       
  
Доброе время суток! Есть идея поработать на VBA с DLL – т.е. перенести часть функций в DLL файл и обращаться к нему из VBA…..однако про подобные вещи я знаю лишь в теории…есть ли какой-нибудь пример – как это можно реализовать?
 
    
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 11
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 1 
      
Автор ответа:
 Jasmin
![]()
![]()
![]()
![]()
Вопросов: 23
Ответов: 417
      
 Профиль |  | #1
       
Добавлено:  08.09.08 06:38
       
    
       
  
Можно создать DLL, например, на Delphi, а потом подключить ее в VBA. Пробовала один-два раза, но что-то не нужно мне оказалось пока. Есть почта, скину файлик по созданию DLL ?
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 2 
      
Автор ответа:
 robinLib
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 5
Ответов: 5
      
 Профиль |  | #2
       
Добавлено:  08.09.08 10:10
       
    
       
  
Да если можно вот сюда jiura@rambler.ru
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа:
 mc-black
![]()
![]()
ICQ: 308-534-060 
Вопросов: 20
Ответов: 1860
      
 Web-сайт:  
 Профиль |  | #3
      
Добавлено:  08.09.08 12:21
       
    
       
  
Вопрос в том, на чем бы ты хотел переносить ход в DLL?
 
    
Если на VB6, то тебе надо в VisualBasic создавать ActiveX DLL. Есть небольшие сложности, если ты собираешься переносить свои файлы на другие компьютеры - тогда тебе надо будет везде регистрировать свою dll, например при помощи *.bat'ника и regsvr32. Зато VB6 идеально подходит для легкого переноса готовых макросов и оччень удобно работает со всеми оффисными объектными моделями.
Есть и другой вариант, что тебе предлагается. Это создание нативных dll в различных программных средах (PB/C/C++/Depphy/asm/др.). В таком случае организация макросов на VBA будет представлять собой вызов API-функций этих DLL. Прямой доступ к объектной модели Excel/Office у тебя в этом случае будет не во всех случаях и не настолько в удобной форме, как это реализовано в VB6/VBA. Чаще всего таким способом API-функции принимают параметры и возвращают результат в виде строкогого представления таблицы Excel с разделителями - табами и возвратами каретки. Плюс - не надо регистрировать нативные библиотеки.
		
	  
			 
	
		 
    
       
    
Номер ответа: 4 
      
Автор ответа:
 mc-black
![]()
![]()
ICQ: 308-534-060 
Вопросов: 20
Ответов: 1860
      
 Web-сайт:  
 Профиль |  | #4
      
Добавлено:  08.09.08 12:24
       
    
       
  
А ещё для сокрытия макросов можно использовать надстройки Excel, может тебе это подойдёт больше всего. В зависимости от задач.
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 5 
      
Автор ответа:
 robinLib
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 5
Ответов: 5
      
 Профиль |  | #5
       
Добавлено:  11.09.08 12:25
       
    
       
  
Интересует метод именно через ActiveX DLL
 
    
Кто-нибудь дайте пожалуйста примерчик!
		
	  
			 
	
		 
    
       
    
Номер ответа: 6 
      
Автор ответа:
 robinLib
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 5
Ответов: 5
      
 Профиль |  | #6
       
Добавлено:  11.09.08 12:43
       
    
       
  
C примером разобрался, только что не ясно каким путем можнго зарегестрировать DLL библиотеку, чтобы она при открытии файла автоматически подгружалась (даже на новом компе)
 
    
TO mc-black
а ЧТО  за функция скрытия макросов?
		
	  
			 
	
		 
    
       
    
Номер ответа: 7 
      
Автор ответа:
 robinLib
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 5
Ответов: 5
      
 Профиль |  | #7
       
Добавлено:  11.09.08 12:58
       
    
       
  
т.е. другими словами библиотеку саму мне зарегестрирует инсталятор, а как сделать так чтобы галочка появилась в References в Excel-е на новом компе?
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 8 
      
Автор ответа:
 mc-black
![]()
![]()
ICQ: 308-534-060 
Вопросов: 20
Ответов: 1860
      
 Web-сайт:  
 Профиль |  | #8
      
Добавлено:  12.09.08 13:58
       
    
       
  
напиши в консоли (cmd.exe):
 
    
regsvr32 /?
Он выдаст тебе справку по использованию, т.е. как зарегистрировать и как отменить регистрацию ActiveX DLL (так же можно поступать и с ActiveX Control - *.ocx)
Создай bat два bat-файла: один регистрирует библиотеку (install.bat), другой - отменяет регистрацию (uninstall.bat). Так тебе будет проще отлаживать.
А многие нормальные инсталляторы умеют регистрировать ActiveX DLL, только при этом ты сам об этом должен иметь понимание и отличать их от нативных dll, таких как kernel32, user32, gdi32 и т.д.
		
	  
			 
	
		 
    
       
    
Номер ответа: 9 
      
Автор ответа:
 mc-black
![]()
![]()
ICQ: 308-534-060 
Вопросов: 20
Ответов: 1860
      
 Web-сайт:  
 Профиль |  | #9
      
Добавлено:  12.09.08 14:10
       
    
       
  
;install.bat
 
    
;-----------
regsvr32 /s *.dll
;uninstall.bat
;-------------
regsvr32 /u /s *.dll
если на новой машине после установки инсталлятором dll не появится в references, то это значит, что dll НЕ зарегистрирована (а в лучшем случае просто скопирована куда-то на компьютер. перед удалением программ необходимо снимать регистрацию dll в них входящих, а только потом физически их удалять
		
	  
			 
	
		 
    
       
    
Номер ответа: 10 
      
Автор ответа:
 svaanir
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 2
Ответов: 6
      
 Профиль |  | #10
       
Добавлено:  18.09.08 14:59
       
    
       
  
Вот как я использую DLL:
 
    
Public Declare Function aGenLike Lib "c:\softunion\services\library\sgenerators.dll" Alias "GenLike" (ByVal NameP As String, ByVal Poisk As String) As String
aGenLike - это мое имя функции (как я использую в VB)
sgenerators.dll - это собственно сама DLL и указан путь к ней
GenLike - эта функция внутри DLL, которой я решила воспользоваться (она написана на Делфи, формирует строку поиска)
Вызов функции вот так:
NAMEORG = aConvertStr(F)
		
	  
			 
	
		 
    
       
    
Номер ответа: 11 
      
Автор ответа:
 mc-black
![]()
![]()
ICQ: 308-534-060 
Вопросов: 20
Ответов: 1860
      
 Web-сайт:  
 Профиль |  | #11
      
Добавлено:  19.09.08 10:53
       
    
       
  
svaanir Это типично API'шное объявление и типичный API-вызов. Автора как я понял заинтересовали ActiveX DLL.
 
    
а ЧТО за функция скрытия макросов?
Функции такой нет, не заморачивайся - это я так не точно выразился. Имеется ввиду, что некоторые используют DLL чтобы максимально спрятать свой код от любопытных глаз. А если закрыть паролем проект макросов VBA, скрыв код от глаз, то нельзя быть уверенным в том, что люди не воспользуются распространенными утилитами, раскрывающими доступ к проектам VBA. Макросы VBA очень слабо защищены от посторонних глаз. Используя ActiveX DLL ты тоже не имеешь 100% гарантии, но тем, кто возьмется исследовать твою программу прийдется намного дольше разбираться с дизассемблерами, отладчиками и кучей лишних сложностей. К тому же, чтобы исследовать откомпилированную ActiveX DLL, надо иметь неслабый багаж знаний.