Страница: 1 | 2 | 
		
		 
			   
			 
			 
			 
			 
			
 
  
		
     
  
    
Вопрос: Вопросы по написанию DLL
     
    
Добавлено: 06.08.05 22:33
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
    
 HACKER
      
       
  
Всем хело!
 
    
вопросы...
1) Вот создал я в классмодуле функцию, у ней есть входные параметры, скомпилировал dll, как мне приципить свою dll к другой проге, как запустить нужную мне функцию и передать её параметры.
2) Нужно ли регестрировать в реестре DLL ? Или достаточно её выбрать/прописать ?
3) Могут ли потом мою DLL использовать в других языках программрования?
Заранее спасибо.
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 19
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 1 
      
Автор ответа:
 DaSharm
![]()
ICQ: 780477 
Вопросов: 72
Ответов: 1297
      
 Web-сайт:  
 Профиль |  | #1
      
Добавлено:  06.08.05 23:49
       
    
       
  
 
    
3 вопроса - 3 на уровне едтского сада. Не обижайся, но они ведь глупые...
Стоп, куда прицепить? Внедрить или использовать в своём ВБ прилоджении?
Регистрировать? Конечно нужно, это ведь ActiveX компонент. Прописать? Хм, а ты знаешь что такое регистрация? Это и есть прописывание в реестр ГУИДА, модели сервера и пути к DLL/OCX, т. е. прописать можно, но толку то.....
Без коментариев.... 
Что такое DLL на ВБ?Это COM сервер в исполнении DLL. А COM он был, есть и будет. И все языки, что поддерживают COM, способны работать с твоей ДЛЛ.
П. С. Подучись теоретически. В жизни любого программиста настает период, когда нужно закинуть практику и открыть книгу.
		
	  
			 
	
		 
    
       
    
Номер ответа: 2 
      
Автор ответа:
 CyRax 
![]()
![]()
![]()
![]()
Разработчик Offline Client
ICQ: 204447456 
Вопросов: 180
Ответов: 4229
      
 Web-сайт:  
 Профиль |  | #2
      
Добавлено:  07.08.05 08:48
       
    
       
  
1. Скорее всего так:
 
    
 Inst1=CreateObject("PrjName.ClassName"
 Вызов: Inst1.Method1([param]), Result=Inst1.Propery1
2. regsvr32 mydll.dll
3. см. 1
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа:
 DaSharm
![]()
ICQ: 780477 
Вопросов: 72
Ответов: 1297
      
 Web-сайт:  
 Профиль |  | #3
      
Добавлено:  07.08.05 12:16
       
    
       
  
1.
 
    
2CyRax: CreateObject не очень хороший вид связывания. Лучше в Project->References выбери нужную DLL и Создавай класс :
2. Я бы предпочел регистрировать самостоятельно, без третьих лиц 
. Просто вызви функцию саморегистрации, которая есть во всех ActiveX'ах:
   hInst = LoadLibrary("C:\yourdll.dll"
   hFunc = GetProcAddress(hInst, "
llRegisterServer"
   CallWindowProc hFunc, 0, 0, 0, 0
   FreeLibrary hInst
		
	  
			 
	
		 
    
       
    
Номер ответа: 4 
      
Автор ответа:
 DaSharm
![]()
ICQ: 780477 
Вопросов: 72
Ответов: 1297
      
 Web-сайт:  
 Профиль |  | #4
      
Добавлено:  07.08.05 12:22
       
    
       
  
 
    
А сам CreateObject больше подходит для скриптовых языков потому, что используя этот вид связывания (позднего связывания) невозможно реализовать IDispatch интерфейс и, следственно у тебя не будет событий. Ты сможешь вызывать функции из DLL, но сама DLL не сможет передавать проге евенты типа Command1_Click(). Да и ещё против позднего вида связывания выступает то, что он самый медленный. Но достоинство этого вида лежит в том, что твоя прога не вылетит с ошибкой, если данная ДЛЛ не найдена, ты всегда сможешь контролировать загрузки ДЛЛ.Не удалась CreateObject - забили и поехали дальше без длл, типа того 
		
	  
			 
	
		 
    
       
    
Номер ответа: 5 
      
Автор ответа:
 HACKER
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
 
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
      
 Профиль |  | #5
       
Добавлено:  07.08.05 15:34
       
    
       
  
Глупых вопросов небывает. Я не имел ввиду внедрить, просто использовать мою длл в других (моих же)программах. Прописать я имел ввиду в программе, а не в реестре, с реестром я и сам разберусь. Я добавляю к своей проге DLL через Project->References, но далле тёмный лес... Помойму исходя из других примеров нужно в декларациях её объявить, что-то типа
 
    
Private Declare Sub SaveToJpg1 Lib "c:\savtojpg.dll" (ByVal hgd As Long, ByVal FileName As String, _ 
ByVal Height As Long, ByVal Width As Long) 
Есть так, то с параметрами всё ясно, но здесь указан конкретный путь к этой DLL, поэтому я и спрашивал, обязательно ли её нужно через Project->References выбирать. С реестром вопрос снять, будем регестрировать
2 CyRax Мало чё понял, может есть какая нибуть статья, ли др. инфа, или может на примере покажешь?
		
	  
			 
	
		 
    
       
    
Номер ответа: 6 
      
Автор ответа:
 GSerg
![]()
![]()
Вопросов: 0
Ответов: 1876
      
 Профиль |  | #6
       
Добавлено:  07.08.05 15:35
       
    
       
  
 
    
DaSharm, ты не поверишь, но позднее связывание целиком основано на IDispatch и невозможно без него.
Кроме того, иногда это единственный выход. Например, если хочешь, чтобы прога работала с любой версией Office, придётся использовать позднее.
		
	  
			 
	
		 
    
       
    
Номер ответа: 7 
      
Автор ответа:
 GSerg
![]()
![]()
Вопросов: 0
Ответов: 1876
      
 Профиль |  | #7
       
Добавлено:  07.08.05 15:38
       
    
       
  
 
    
Подключить через references.
Не использовать declare.
Забыть про фактическое местоположение ввиду его неважности.
Потом создавать экземпляры классов библиотеки и вызывать их методы.
		
	  
			 
	
		 
    
       
    
Номер ответа: 8 
      
Автор ответа:
 DaSharm
![]()
ICQ: 780477 
Вопросов: 72
Ответов: 1297
      
 Web-сайт:  
 Профиль |  | #8
      
Добавлено:  07.08.05 17:12
       
    
       
  
2GSerg: да, я ошибся, просто не то ,Что надо в голову влезло. В действительности динамическое связывание использует IDispatch, и очень активно, от этого и тормоза.
 
    
ошибся я в том, что при использовании позднего (динамического) или раннего связывания невозможно реализовать события (или, скажем, невозможно назначить обложки для евентов). Только "очень раннее" связывание даёт нам такую возможность.
		
	  
			 
	
		 
    
       
    
Номер ответа: 9 
      
Автор ответа:
 Barsik
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Разработчик Offline Client
ICQ: 343368641 
Вопросов: 17
Ответов: 686
      
 Web-сайт:  
 Профиль |  | #9
      
Добавлено:  07.08.05 17:44
       
    
       
  
а не проще ли писать библиотеки на PB?
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 10 
      
Автор ответа:
 HACKER
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
 
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
      
 Профиль |  | #10
       
Добавлено:  07.08.05 23:19
       
    
       
  
2 Barsik 
 
    
В моём случае не проше
2 ALL
Чуваки, мне конечно очень интерестно читать про всякие IDispatch в ваших постах итп итд... Если не сложно, привидите пример какой нибуть dll из одной функции/подпрограммы, и из другого примера вызовите ту подпрограмму передав ей параметры, всё! это всё что мне нужно. Это я конечно наглею, но тогда дайте чё нибуть почитать на русском по этому поводу, разобраться то надо.
		
	  
			 
	
		 
    
       
    
Номер ответа: 11 
      
Автор ответа:
 GSerg
![]()
![]()
Вопросов: 0
Ответов: 1876
      
 Профиль |  | #11
       
Добавлено:  08.08.05 04:14
       
    
       
  
После MSDN читать про то же на русском не хочется.
 
    
Библиотека содержит класс, допустим, Global.
В дизайнере этому классу присвоить Instancing: Global multi use.
Воткнуть в класс 
  add=i1+i2
end function
Скомпилировать.
Подключить к новому проекту.
В новом проекте набрать 
Чё не понятно-то?
		
	  
			 
	
		 
    
       
    
Номер ответа: 12 
      
Автор ответа:
 LamerOnLine
![]()
![]()
![]()
ICQ: 334781088 
Вопросов: 108
Ответов: 2822
      
 Профиль |  | #12
       
Добавлено:  08.08.05 10:36
       
    
       
  
 
    
А сам CreateObject больше подходит для скриптовых языков потому, что используя этот вид связывания (позднего связывания) невозможно реализовать IDispatch интерфейс и, следственно у тебя не будет событий.
Отчасти согласен, это по большей части для скриптов, но в тех же скриптах скриптовая машина позволяет отслеживать для таких объектов события.
DaSharm, ты не поверишь, но позднее связывание целиком основано на IDispatch и невозможно без него.
Подозреваю что он имел ввиду IUnknown
 Это я конечно наглею, но тогда дайте чё нибуть почитать на русском
Достоевский подойдет? Могу намылить 
Если серьезно - открой любой пример и посмотри, их и на этом сайте полно. Естественно, параллельно с теорией.
Кстати, насколько я знаю, Global Multi Use - фича конкретно для VB, в других языках аналога нету.
Освой для начала MultiUse и New. Примеров уйма.
		
	  
			 
	
		 
    
       
    
Номер ответа: 13 
      
Автор ответа:
 CyRax 
![]()
![]()
![]()
![]()
Разработчик Offline Client
ICQ: 204447456 
Вопросов: 180
Ответов: 4229
      
 Web-сайт:  
 Профиль |  | #13
      
Добавлено:  08.08.05 12:35
       
    
       
  
HACKER,
 
    
 Вообще то это для 1С-ки. Мож в VB и по другому 
		
	  
			 
	
		 
    
       
    
Номер ответа: 14 
      
Автор ответа:
 GSerg
![]()
![]()
Вопросов: 0
Ответов: 1876
      
 Профиль |  | #14
       
Добавлено:  08.08.05 12:51
       
    
       
  
 
    
Гы, тогда ещё страннее - потому что IUnknown точно есть везде в COM 
Скорее всего, он имел в виду IConnectionPoint, через который реализуется механизм событий. Впрочем, события можно заиметь и тут, просто всё то, что VB делает сам, придётся делать руками.
		
	  
			 
	
		 
    
       
    
Номер ответа: 15 
      
Автор ответа:
 HACKER
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
 
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
      
 Профиль |  | #15
       
Добавлено:  08.08.05 12:56
       
    
       
  
2 GSerg 
 
    
А когда класс уже скомпилирован в DLL подключаю её через Project->References и??? и чё больше ничё 
? тупо вызывать же функцию с dll неполучится, чё то объявить, прописать от это я и спрашиваю