Почему не хочет загружаться процедура из 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);
}
Код программы
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.
2. В той же соседней ветке тебе подсказали, что нужно укаать _stdcall рядом с экспортируемой функцией в библиотеке, а я не вижу, чтобы ты это сделал.
P.S. А почему пишешь код cpp и Delphi, а оформляешь как php? ;)
Мне казалось, С++Builder по умолчанию использует конвенцию cdecl, можно впринципе указать эту конвенцию в заголовке импорта на Delphi.
Посмотрел я токачто на код внимательнее... Могу с точной уверенностью заявить, что скорее всего, когда вы выполните экспорт функции, она не будет работать так, как вы ожидаете.
Эти грабли скрыты в проблеме отличия классов Graphics::TBitmap в C++ и Graphics.TBitmap в Delphi на этапе исполнения кода. У вас скорее всего инициализиуется два различных рантайма VCL: один из exe модуля, другой - из dll. Правильно разрешить эту проблему может помочь использование внешних vcl-библиотек, которые по-умолчанию статически линкуются в компилируемый проект.
Если вы хотите использовать код на C++ из Delphi с соблюдением всех тонкостей линковки VCL, то скорее всего нужно создавать не dll-проект, а пакет (dpk), так кажется это называется. К сожалению проверить свои утверждения не могу - нет Delphi и C++Builder-а под рукой.
Вот пакет
#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
#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;
}
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.
Кстати, автор, ты не задумывался, что может быть тебе было бы проще перенести код библиотеки из cpp в delphi? Ибо, насколько я знаю, средств для этого хватает...
Кстати, автор, ты не задумывался, что может быть тебе было бы проще перенести код библиотеки из cpp в delphi? Ибо, насколько я знаю, средств для этого хватает...
Я искал OpenCV на дельфи, но не нашёл такого. Нашёл только на C++,, мой проект на ДЕльфи, вот и пришлось писать dll. По поводу пакетов: я пытался компилировать его, но он почему-то не хочет компилироваться (см. пред. пост). И можете сказать как потом из дельфи можно вызвать нужный метод.
Кстати, о каких средствах идёт речь?