Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.05.2015, 21:22
mohnaty_shmel mohnaty_shmel вне форума
Прохожий
 
Регистрация: 01.05.2015
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Подключение dll библиотеки

Добрый день!

Есть библиотека написанная в visual studio 2008 с++ и нужно её подключить на дэлфи.

Начал я делать следующее:

Код:
unit increase_h;

interface

const
  dll = 'dll.dll';
  
  procedure Get_image_size(input_frame: char;  width: integer; height: integer); stdcall;
  procedure Read_image(fname: char;  pdat: Byte); stdcall;
  procedure Cal_psnr(pOrig: Byte;  pImg: Byte;  width: integer;  height: integer); stdcall;
  function Write2PGM(pImg: Byte;  width: integer;  height: integer;  fname: char): pImg; stdcall;
  
implementation

procedure  Get_image_size; external dll;
procedure  Read_image; external dll;
procedure  Cal_psnr; external dll;
function  Write2PGM; external dll;
procedure  read_header; external dll;
procedure  Downsampling; external dll
procedure  Bicubic; external dll;
procedure  NL_filtering; external dll;
procedure  Fast_Motion_estimation; external dll;
procedure  Data_fusion; external dll;
procedure  Cal_SAD_New; external dll;
procedure  NL_Backprojection; external dll;
procedure  Add_error; external dll;
procedure  Norm2; external dll;
procedure  Diff_Norm2; external dll;
procedure  Float2uchar; external dll;
procedure  Blurring; external dll;
procedure  Error_image; external dll;
procedure  Bicubic_float; external dll;
procedure  Data_fusion_float; external dll;

end.

У меня возникли ошибки, похоже неправильно определил входные и выходные параметры, помогите пожалуйста разобраться :3

А вот основной кусок кода из dll библиотеки:
Код:
int main(int argc, char* argv[])
{
	int                  i, j, width, height, maxval, comp, lwidth, lheight, row, col, scale;
	unsigned char        *hr_im, *ori_im, *lr_im;
	unsigned char        temp;
	double               psnr1;
	FILE                 *fp;
	int                  *g_mvx[ N ], *g_mvy[ N ];
	float                *g_mse[ N ];


	if( argc<3 )
	{
		printf("Usage: NL_Backprojection  LR_image(pgm)  HR_image(pgm)  [Original_image(pgm)]  \n");
		return 1;
	}
	scale    =  2;


	if ( Get_image_size( argv[1], &lwidth, &lheight ) )
	{
		printf( "Can not read %s", argv );
		return 1;
	}


	width       =  lwidth*scale;
	height      =  lheight*scale;
	hr_im       =  (unsigned char*) malloc( sizeof(char)*width*height );
	ori_im      =  (unsigned char*) malloc( sizeof(char)*width*height );
	lr_im       =  (unsigned char*) malloc( sizeof(char)*lwidth*lheight );


	Read_image( argv[1], lr_im );


	printf( "Start to processing %s\n", argv[1] );

	Bicubic( lr_im, hr_im, scale, lwidth, lheight );
	Write2PGM( hr_im, width, height, "Bic_image.pgm" );


	if ( argc >3 )
	{
		Read_image( argv[3], ori_im );
		printf( "Bicubic, PSNR = %f\n", Cal_psnr( ori_im, hr_im, width, height ) );
	}



	for ( i = 0; i < N; i ++ )
	{
		g_mvx[ i ]    =  (int*) malloc( sizeof(int)*width*height );
		g_mvy[ i ]    =  (int*) malloc( sizeof(int)*width*height );
		g_mse[ i ]    =  (float*) malloc( sizeof(int)*width*height );
	}

	NL_filtering( hr_im, width, height, g_mvx, g_mvy, g_mse );

	NL_Backprojection( hr_im, width, height, ori_im, g_mvx, g_mvy, g_mse, argc );

	if ( argc > 3 )
	{
		printf( "After Backprojection, PSNR = %f\n", Cal_psnr( ori_im, hr_im, width, height ) );
	}


	printf("\nWrite to file: %s.\n",argv[2]); 
	Write2PGM( hr_im, width, height, argv[2] );


	free( hr_im );
	free( ori_im );
	free( lr_im );

	for ( i = 0; i < N; i ++ )
	{
		free( g_mvx[ i ] );
		free( g_mvy[ i ] );
		free( g_mse[ i ] );
	}
	return 0;
}

Заранее благодарен)
Ответить с цитированием
  #2  
Старый 01.05.2015, 23:29
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Ну а где объявления функций из библиотеки? Мейн-то тут зачем? Вполне возможно, что не верно соглашение вызова.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
ApxaHGe1 (02.05.2015)
  #3  
Старый 02.05.2015, 21:46
mohnaty_shmel mohnaty_shmel вне форума
Прохожий
 
Регистрация: 01.05.2015
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

вот я пытался объявить функции, но не вышло

Код:
 procedure Get_image_size(input_frame: char;  width: integer; height: integer); stdcall;
  procedure Read_image(fname: char;  pdat: Byte); stdcall;
  procedure Cal_psnr(pOrig: Byte;  pImg: Byte;  width: integer;  height: integer); stdcall;
  function Write2PGM(pImg: Byte;  width: integer;  height: integer;  fname: char): pImg; stdcall;
Ответить с цитированием
  #4  
Старый 02.05.2015, 22:05
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

...
Код:
while (not дошло) do
begin
  дошло := перечитать_сообщение(#2);
end;
Еще раз спрашиваю: где объявление функций из библиотеки? Не то, которое не работает, а то, которое в рабочем сишном коде.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 02.05.2015 в 22:27.
Ответить с цитированием
  #5  
Старый 02.05.2015, 22:28
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Я в сиплюсах полный ноль, может ошибаюсь, но выходит что вот эта строчка в main()
Код:
int main(int argc, char* argv[])
подразумевает
Цитата:
на счет этих двух параметров
argc значит argument count.
argv значит argument vector.
argv[0] всегда имя программы, и argc как минимум единица.
argv[argc] всегда NULL...
в смысле - это аналогиня делфийского ParamStr() и она (это же как бы стринговая многострочная переменная) должна быть как PChar,а не просто отдельный символ char, наверное
Ответить с цитированием
  #6  
Старый 03.05.2015, 18:46
mohnaty_shmel mohnaty_shmel вне форума
Прохожий
 
Регистрация: 01.05.2015
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вот мой сишный проект(состоит из двух папок). Извиняюсь за тупость, не сразу понял какие функции Вы имеете в виду.
Вложения
Тип файла: 7z dll.7z (2.31 Мбайт, 1 просмотров)
Тип файла: 7z NL_Back_projection2.7z (2.25 Мбайт, 1 просмотров)
Ответить с цитированием
  #7  
Старый 03.05.2015, 18:55
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

1) Никогда не запихивай в архив .ncb или .sdf файлы. От них толку нет никакого, и при этом занимают они 99.999999% размера проекта.
2) В этом китайском проекте прописано:
Код:
__declspec(dllexport) int Get_image_size ( char *input_frame, int *width, int *height );
Соглашение вызова не указано. По дефолту в сях соглашение - cdecl, а не stdcall, если ничего не химичили в настройках (а автор, т.е. Weisheng Dong, вполне мог и нахимичить). Параметры - char * и int *, что означает "указатель на символы" (строка) и "указатель на целое". А потому объявление, скорее всего, будет выглядеть примерно так:
Цитата:
function Get_image_size(input_frame: PChar; width: ^Integer; height: ^Integer): integer; cdecl;
остальные по аналогии.

ЗЫЖ dll-ка в dll\Debug какая-то покоцанная, без экспортов. В NL_Back_projection2\debug\dll.dll при этом вроде нормальная.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 03.05.2015 в 19:05.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
mohnaty_shmel (03.05.2015)
  #8  
Старый 03.05.2015, 19:06
mohnaty_shmel mohnaty_shmel вне форума
Прохожий
 
Регистрация: 01.05.2015
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо за помощь) про архив запомню
Ответить с цитированием
  #9  
Старый 03.05.2015, 19:15
mohnaty_shmel mohnaty_shmel вне форума
Прохожий
 
Регистрация: 01.05.2015
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Надеюсь та, которая NL_Back_projection2\debug\dll.dll будет работать, её я так же с помощью Форумчан делал
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:21.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025