Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почему не хочет загружаться процедура из dll.

548
12 июня 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
Я написал dll на c++ Builder и вызываю её из дельфи. Почему то при запуске программы выдаёт сообщение об ошибке: Точка входа в процедуру FindContours не найдена в библиотеке DLL OCVLib.dll. Скажите в чём ошибка и как её можно исправить.
Код dll
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#include <vcl.h>
#include <cv.h>
#include <highgui.h>
#include <IplConverter.h>
#pragma hdrstop

extern "C" __declspec(dllexport) void FindContours(Graphics::TBitmap &bmp, Graphics::TBitmap outputBmp, int threshould1, int threshould2);
//---------------------------------------------------------------------------

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}
//---------------------------------------------------------------------------

void FindContours(Graphics::TBitmap &bmp, Graphics::TBitmap outputBmp, int threshould1, int threshould2)
{
    IplImage *image = TBitmapToIplImage(&bmp);
    IplImage *convertedImage = cvCreateImage( cvSize(image->width, image->height), image->depth, 1 );
    cvSetImageCOI( image, 2 );
    cvCopy( image, convertedImage, 0 );
    cvCanny(convertedImage, convertedImage, threshould1, threshould2, 3 );
    IplImageToTBitmap(convertedImage, &outputBmp);
}


Код программы
Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

procedure FindContours(bmp, outputBmp : TBitmap; t1, t2 : integer); stdcall; external 'OCVLib.dll'

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  FindContours(Image1.Picture.Bitmap, Image1.Picture.Bitmap, 200, 50);
end;

end.
6
12 июня 2008 года
George
4.1K / / 05.01.2007
1. Ты ж в соседней ветке вроде динамически пытался...
2. В той же соседней ветке тебе подсказали, что нужно укаать _stdcall рядом с экспортируемой функцией в библиотеке, а я не вижу, чтобы ты это сделал.

P.S. А почему пишешь код cpp и Delphi, а оформляешь как php? ;)
5
12 июня 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Washington
2. В той же соседней ветке тебе подсказали, что нужно укаать _stdcall рядом с экспортируемой функцией в библиотеке, а я не вижу, чтобы ты это сделал.


Мне казалось, С++Builder по умолчанию использует конвенцию cdecl, можно впринципе указать эту конвенцию в заголовке импорта на Delphi.

548
12 июня 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
я попробовал постваить в Дельфи вместо stdcall cdecl - то же самое. Может кто-нибудь исправить мой код, и выложить его сюда.
5
13 июня 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Maximillian_Cavalera
Я написал dll на c++ Builder и вызываю её из дельфи. Почему то при запуске программы выдаёт сообщение об ошибке: Точка входа в процедуру FindContours не найдена в библиотеке DLL OCVLib.dll. Скажите в чём ошибка и как её можно исправить.

Посмотрел я токачто на код внимательнее... Могу с точной уверенностью заявить, что скорее всего, когда вы выполните экспорт функции, она не будет работать так, как вы ожидаете.
Эти грабли скрыты в проблеме отличия классов Graphics::TBitmap в C++ и Graphics.TBitmap в Delphi на этапе исполнения кода. У вас скорее всего инициализиуется два различных рантайма VCL: один из exe модуля, другой - из dll. Правильно разрешить эту проблему может помочь использование внешних vcl-библиотек, которые по-умолчанию статически линкуются в компилируемый проект.
Если вы хотите использовать код на C++ из Delphi с соблюдением всех тонкостей линковки VCL, то скорее всего нужно создавать не dll-проект, а пакет (dpk), так кажется это называется. К сожалению проверить свои утверждения не могу - нет Delphi и C++Builder-а под рукой.

6
13 июня 2008 года
George
4.1K / / 05.01.2007
А чё, c++Bulider тоже поддерживает пакеты?
548
13 июня 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
попытался создать пакет в Builder'е - он не хочет компилироваться, и у builder'овские пакеты имеют расширение *.bpk, а дельфи нужно *.dpk.
Вот пакет
Код:
//---------------------------------------------------------------------------

#include <basepch.h>
#include <vcl.h>
#include <windows.h>
#include <vcl.h>
#include <cv.h>
#include <highgui.h>
#include <IplConverter.h>
#pragma hdrstop
#pragma package(smart_init)
//---------------------------------------------------------------------------

//   Package source.
extern "C" __declspec(dllexport) void FindContours(Graphics::TBitmap &bmp, Graphics::TBitmap outputBmp, int threshould1, int threshould2);
//---------------------------------------------------------------------------

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
    return 1;
}
//---------------------------------------------------------------------------
 void FindContours(Graphics::TBitmap &bmp, Graphics::TBitmap outputBmp, int threshould1, int threshould2)
{
    IplImage *image = TBitmapToIplImage(&bmp);
    IplImage *convertedImage = cvCreateImage( cvSize(image->width, image->height), image->depth, 1 );
    cvSetImageCOI( image, 2 );
    cvCopy( image, convertedImage, 0 );
    cvCanny(convertedImage, convertedImage, threshould1, threshould2, 3 );
    IplImageToTBitmap(convertedImage, &outputBmp);
}


[Linker Error] Unresolved external '__fastcall Graphics::TBitmap::~TBitmap()' referenced from D:\CAVALERA\CONTOURFINDER(OPENCV)\PACK\PACKAGE1.OBJ
[Linker Error] Unresolved external '__fastcall Graphics::TBitmap::GetScanline(int)' referenced from D:\CAVALERA\CONTOURFINDER(OPENCV)\PACK\PACKAGE1.OBJ
[Linker Error] Unresolved external '__fastcall Graphics::TBitmap::SetPixelFormat(Graphics::TPixelFormat)' referenced from D:\CAVALERA\CONTOURFINDER(OPENCV)\PACK\PACKAGE1.OBJ
548
13 июня 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
Я попробовал переписать dll вот так, теперь аналогичная ошибка с функцией Summ

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#include <vcl.h>
#include <cv.h>
#include <highgui.h>
#include <IplConverter.h>
#pragma hdrstop

extern "C" __declspec(dllexport) void FindContours(Graphics::TBitmap &bmp, Graphics::TBitmap outputBmp, int threshould1, int threshould2);
extern "C" __declspec(dllexport) DWORD Summ(DWORD a, DWORD b);
//---------------------------------------------------------------------------

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}
//---------------------------------------------------------------------------

void FindContours(Graphics::TBitmap &bmp, Graphics::TBitmap outputBmp, int threshould1, int threshould2)
{
    IplImage *image = TBitmapToIplImage(&bmp);
    IplImage *convertedImage = cvCreateImage( cvSize(image->width, image->height), image->depth, 1 );
    cvSetImageCOI( image, 2 );
    cvCopy( image, convertedImage, 0 );
    cvCanny(convertedImage, convertedImage, threshould1, threshould2, 3 );
    IplImageToTBitmap(convertedImage, &outputBmp);
}

DWORD Summ(DWORD a, DWORD b)
{
    return a + b;
}


Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

//procedure FindContours(bmp, outputBmp : TBitmap; t1, t2 : integer); stdcall; external 'OCVLib.dll'
function Summ(a, b : DWORD) : DWORD; cdecl; external 'OCVLib.dll'

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
//  FindContours(Image1.Picture.Bitmap, Image1.Picture.Bitmap, 200, 50);
Caption := IntToStr(Summ(2, 2));
end;

end.
6
13 июня 2008 года
George
4.1K / / 05.01.2007
Я так подозреваю, что компилированные пакеты, что в Delphi, что в C++Builder'e имеют расширение ".bpl".
Кстати, автор, ты не задумывался, что может быть тебе было бы проще перенести код библиотеки из cpp в delphi? Ибо, насколько я знаю, средств для этого хватает...
548
13 июня 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
Цитата: Washington
Я так подозреваю, что компилированные пакеты, что в Delphi, что в C++Builder'e имеют расширение ".bpl".
Кстати, автор, ты не задумывался, что может быть тебе было бы проще перенести код библиотеки из cpp в delphi? Ибо, насколько я знаю, средств для этого хватает...


Я искал OpenCV на дельфи, но не нашёл такого. Нашёл только на C++,, мой проект на ДЕльфи, вот и пришлось писать dll. По поводу пакетов: я пытался компилировать его, но он почему-то не хочет компилироваться (см. пред. пост). И можете сказать как потом из дельфи можно вызвать нужный метод.
Кстати, о каких средствах идёт речь?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог