p.S:
I still got External Exception E06D7363
//////////////////////
THE C++BUILDER CODE
//////////////////////
//..unumbercaller.h
#include <System.hpp>
#include "opencv2/imgproc/imgproc_c.h"
struct TIplImage
{
IplImage *Image;
TIplImage() : Image(NULL) {}
~TIplImage() { cvReleaseImage(&Image); }
};
typedef DynamicArray< TIplImage > ArrayOfImage;
typedef DynamicArray< int > ArrayOfInteger;
typedef DynamicArray< String > ArrayOfString;
const double dbldial = 1000.1;
class xCommon: TInterfacedObject
{
public:
friend class TNumberCaller;
TNumberCaller* creator;
void __fastcall Create( TNumberCaller* xpointer );
};
//INTERFACE, NOT USABLE
/*
class
INumberCaller: public IUnknown
{
public:
virtual void __fastcall draw(ArrayOfImage &dimage) = 0;
virtual void __fastcall save(const String fn ) = 0;
virtual void __fastcall load(const String fn ) = 0;
};
*/
class TNumberCaller: public xCommon
{
public:
friend class xCommon;
void __fastcall createNumberCaller( int dial1 = 1, double dial2 = dbldial );
__fastcall virtual ~TNumberCaller();
void __fastcall draw(ArrayOfImage &dimage);
void __fastcall save(const String fn );
void __fastcall load(const String fn );
};
//
//
//
//
//
//..unumbercaller.cpp
#include <vcl.h>
#pragma hdrstop
#include <System.hpp>
#include "unumbercaller.h"
void __fastcall xCommon::Create( TNumberCaller *xpointer )
{
creator = xpointer;
}
extern "C" __declspec(dllimport) TNumberCaller* __stdcall Create_NumberCaller( int dial1 = 1, double dial2 = dbldial );
extern "C" __declspec(dllimport) void __stdcall NumberCallerDraw( const void* dcaller, IplImage** dimage, int* dnum );
extern "C" __declspec(dllimport) void __stdcall NumberCallerLoad(const void* dcaller, char* fn);
extern "C" __declspec(dllimport) void __stdcall NumberCallerSave(const void* dcaller, char* fn);
extern "C" __declspec(dllimport) void __stdcall DestroyNumberCaller(const void* x);
/* TNumberCaller */
void __fastcall TNumberCaller::createNumberCaller( int dial1, double dial2 )
{
Create(Create_NumberCaller( dial1, dial2 ));
}
__fastcall TNumberCaller::~TNumberCaller( )
{
if (( creator != NULL ) )
{
DestroyNumberCaller( creator );
creator = NULL;
}
}
void __fastcall TNumberCaller::draw(ArrayOfImage &dimage)
{
DynamicArray<IplImage*> images;
DynamicArray<int> nums;
int count = dimage.Length;
images.Length = count;
nums.Length = count;
for (int idx = 0; idx < count; ++idx)
{
images[idx] = dimage[idx].Image;
nums[idx] = idx;
}
//=============================================================================
//
//STILL I GOT DIVISION BY ZERO / External Exception E06D7363 by this line below
//
NumberCallerDraw( creator, (count > 0) ? &images[0] : NULL, (count > 0) ? &nums[0] : NULL );
}
void __fastcall TNumberCaller::load(const String fn )
{
NumberCallerLoad( creator, ( PAnsiChar ) ( &( ((AnsiString) fn )[1] ) ) );
}
void __fastcall TNumberCaller::save(const String fn )
{
NumberCallerSave( creator, ((AnsiString) fn ).c_str());
}
.
.
.
.
.
.
.
.
//////////////////////
THE DELPHI CODE
//////////////////////
///********************************************
///********************************************
//
unit unumbercaller;
interface
Uses ocv.core.types_c{,inputoutputcall};
const
dbldial = 1000.1;
mycppdialdll = 'mycppdialdll.dll';
type
ArrayOfImage = Array of pIplImage;
ArrayOfInteger = Array of integer;
xCommon = class(TInterfacedObject)
protected
creator: Pointer;
public
constructor Create(const xpointer: Pointer);
end;
INumberCaller = interface
procedure save(const fn: string);
procedure load(const fn: string);
procedure draw(dimage: ArrayOfImage; dnum: ArrayOfInteger);
end;
TNumberCaller = class(xCommon, INumberCaller)
public
constructor createNumberCaller(dial1: Integer = 0; dial2: double = dbldial);
procedure draw(dimage: ArrayOfImage; dnum: ArrayOfInteger);
procedure load(const fn: string);
procedure save(const fn: string);
destructor Destroy; override;
end;
implementation
constructor xCommon.Create(const xpointer: Pointer);
begin
creator := xpointer;
end;
function Create_NumberCaller(dial1: Integer = 1; dial2: double = dbldial): Pointer; stdcall;
external mycppdialdll name '_Create_NumberCaller@12';
procedure NumberCallerDraw(const x: Pointer; dimage: Pointer; dnum: Pointer); stdcall;
external mycppdialdll name '_NumberCallerDraw@16';
procedure NumberCallerLoad(const x: Pointer; fn: PAnsiChar); stdcall;
external mycppdialdll name '_NumberCallerLoad@8';
procedure NumberCallerSave(const x: Pointer; fn: PAnsiChar); stdcall;
external mycppdialdll name '_NumberCallerSave@8';
procedure DestroyNumberCaller(const x: Pointer); stdcall;
external mycppdialdll name '_DestroyNumberCaller@4';
{ TNumberCaller }
constructor TNumberCaller.createNumberCaller(dial1:integer; dial2:double);
begin
inherited Create(Create_NumberCaller(dial1, dial2));
end;
procedure TNumberCaller.draw(dimage: ArrayOfImage; dnum: ArrayOfInteger);
begin
NumberCallerDraw(creator, @dimage[0], @dnum[0]);
end;
procedure TNumberCaller.load(const fn: string);
begin
NumberCallerLoad(creator, pAnsiChar(AnsiString(fn)));
end;
procedure TNumberCaller.save(const fn: string);
begin
NumberCallerSave(creator, pAnsiChar(AnsiString(fn)));
end;
destructor TNumberCaller.Destroy;
begin
if Assigned(creator) then
begin
DestroyNumberCaller(creator);
creator := nil;
end;
inherited;
end;
end.
///********************************************
///THE main Delphi code :: which RUNS very good!
///
unit Unit1;
interface
uses
unumbercaller,
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
callerid : INumberCaller; // I_Number_Caller
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
fimages:ArrayofImage;
fnumbers:ArrayofInteger;
begin
//
callerid := TNumberCaller.createNumberCaller(1,101.1);
//
//
callerid.load('testload');
//
callerid.save('testsave');
//
callerid.draw(fimages, fnumbers);
//
//
end;
end.
Connect with Us