dimedrol
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 «  : 10-12-2004 19:37 »   | 
								
								 | 
							  
							 
							При объявлении экспортируемой или импортируемой функции в С ее имя получает дополнительные символы справа, например @@AYUX. Можно ли этого избежать ? А то тут одна функция не стыкуется с именем в lib файле... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Как говориться, cемь бед - один Reset    
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							lapulya
							
								Молодой специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 12-12-2004 01:59 »   | 
								
								 | 
							  
							 
							dimedrol, вообщето для данного форума этот вопрос является чистейшим оффтопом.... мммда, ну да ладно встречал я такую штуконину разок, в чем дело толком не помню, но лечилось это так:
  надо про вызове  GetProcAddress  в качестве параметра передавать не имя функции например GetProcAddress("bubu"), а символ подчеркивания и далее имя функции, типа так GetProcAddress("_bubu") 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							С уважением Lapulya 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ronin
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									«  Ответ #2 : 12-12-2004 08:14 »    | 
								
								 | 
							  
							 
							А дело тут в так называемых mangled function names - компилятор изменяет имя функции для отражения в нем информации о ее параметрах, способе вызова, и т. д. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							dimedrol
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #3 : 12-12-2004 21:16 »   | 
								
								 | 
							  
							 
							Хорошо что теперь хоть знаю название для этой штуки.. В helpах вроде советуют перед именем процедуры ставить extern "C", но проблемы это не снимает: все равно компилер после имени процы ставит суммарный размер в байтах всех ее параметров. Так что опять: LIB :    __imp_Function OBJ:    __imp_Function@8 (unresolved external) Юзание GetProcAddress не решает проблемы в корне, тем более, что библиотека экспортирует около 200 функций (линкована наверное на ASM и никаких там Mangled Names), и тут еще и H-файл колбасить придется. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Как говориться, cемь бед - один Reset    
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ronin
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #4 : 12-12-2004 21:20 »   | 
								
								 | 
							  
							 
							А в целом-то что необходимо сделать? Может, не нужна такая жесткая привязка к lib-файлам? Или из ассемблера линкуешь? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Serega
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #5 : 13-12-2004 09:53 »   | 
								
								 | 
							  
							 
							extern "C" | 	char f)int, float, double:; "  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							dimedrol
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #6 : 14-12-2004 22:24 »   | 
								
								 | 
							  
							 
							Да в общем тут у меня круто намешено! Тут и ASM модули и вот кучка таких непокорных DLL... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Как говориться, cемь бед - один Reset    
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ronin
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #7 : 14-12-2004 22:48 »   | 
								
								 | 
							  
							 
							Есть еще идея - посмотреть, как объявлены функции виндовых библиотек (например? msvcrt.dll) в сишных заголовках (это, если не ошибаюсь, с любым компилятором поставляется, сначала смотреть экспортируемые библиотекой функции, затем искать их в исходниках). Когда я линковал их из асма, проблем с именами вроде не было никаких... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							npak
							
						 | 
						
							
								  | 
								
									
									 « Ответ #8 : 15-12-2004 10:55 »   | 
								
								 | 
							  
							 
							dimedrol, если ты пользуешься только lib файлом, то тебе не надо экспортировать символы.  
  Комплируй как С, в таком случае компилятор не будет генерировать изменённые имена. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							dimedrol
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #9 : 15-12-2004 13:32 »   | 
								
								 | 
							  
							 
							Опять ничего не выходит! Короче в BC5.02 все lib для системных библиотек без Mangled, и хорошо линкуются на ASM. Однако уже на VC6.0, на котором я cейчас и пишу, какой то другой формат lib (там все Mangled!), например: __imp__CloseHandle@4           , хотя в KERNEL32 конечно нет @4. кроме того про эти lib ASM (tlink32) говорит что они повреждены, те вообще не работает с ними. Интересно, что EXE то получается уже без Mangled! Отсюда вывод: VC6.0 до последнего шага использует Mangled Names и уже в процессе линковки их удаляет. Я поробовал сделать lib для моей строптивой дллки вот так: 1.  impdef mydll.def       mydll.dll      ; impdef  из BC5.02 2.  lib   /out:mydll.lib  /def:mydll.def ; lib уже из VC6.0 Получилась библиотека с нормальными именами, те без Mangled, однако тут то появилась возможность указать вторые имена для функций в DEF файле c любыми нужными расширениями.Неужели в 21 веке это придется делать в ручную ? Значит так это делали и разработчики ДЛЯ ВСЕХ СИСТЕМНЫХ БИБЛИОТЕК(Ведь  откудато же в родных lib пакета должы были взяться Mangled).  Что-то не вериться... А может все-таки есть еще способ? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Как говориться, cемь бед - один Reset    
						 | 
					 
				 
			 |  
		 
	 | 
	 |