![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Всем привет! 
		
	
		
		
		
		
		
	
		
		
	
	
	Такая проблема: Написал на С библиотеку: файл unit1.cpp Код: 
	#define BUILD_DLL
#include "File1.h"
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
int Messagess (int k)
{
        return k;
}заголовочный файл File1.h Код: 
	#if defined(BUILD_DLL) # define DLL_EXP __declspec(dllexport) #else # if defined(BUILD_APP) # define DLL_EXP __declspec(dllimport) # else # define DLL_EXP # endif #endif DLL_EXP int Messagess (int k); нарисовал в Дельфи тестовую форму с кнопкой Код: 
	type
Tcalc_double = function ( k: integer ): integer;
................
procedure TForm1.Button2Click(Sender: TObject);
var 
  hndDLLHandle: THandle;
  calc_double: Tcalc_double;
begin
    try 
       hndDLLHandle := loadLibrary ( 'C:\C\t3\project1.dll' );
       if hndDLLHandle <> 0 then begin
          @calc_double := getProcAddress ( hndDLLHandle, 'Messagess' );
          if addr ( calc_double ) <> nil then begin
             showMessage ( intToStr ( calc_double ( 105 ) ) );
          end else
             showMessage ( 'Function not exists...' );
       end else
          showMessage ( 'DLL not found...' );
    finally
       freeLibrary ( hndDLLHandle );
    end;
end;Очень хочется разобраться в данном вопросе, т.к. в будущем потребуется подключать к некоторым проектам С-шные библиотеки. Спасибо.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 >говорит, что нет такой функции в библиотеке 
		
	
		
		
		
		
		
	
		
		
	
	
	Посмотри, какая есть, например с помощью TDUMP.EXE Скорее всего есть _Messagess Во вторых, нужно уточнять соглашения о вызовах.  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Удивительно, но выдает, что экспортируемая функция называется как "Function      Messagess(int)". 
		
	
		
		
		
		
		
	
		
		
	
	
	![]()  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Я разобрался! 
		
	
		
		
		
		
		
	
		
		
	
	
	Надо было поставить Extern "C" в Код: 
	# define DLL_EXP Extern "C" __declspec(dllexport)  | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
  | 
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
 
kast2k (26.10.2012)
  | ||
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Да, я помню о соглашении. 
		
	
		
		
		
		
		
	
		
		
	
	
	стоит _cdecl  | 
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
 Код: 
	type Tcalc_double = function ( k: integer ): integer; Должно быть так: Код: 
	type Tcalc_double = function ( k: integer ): integer; cdecl;  | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 да, на странице не стоит (т.к. на тот момент я еще инфу не нашел), а в текущем коде стоит  
		
	
		
		
		
		
		
	
		
		
	
	
	![]() и главное, работает ![]()  |