Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

DLL   Найти похожие ветки 

 
ChcngerMan   (2004-03-12 13:40) [0]

Мне нужно, чтобы через Дллку появилось окно, делаю так:

Код самой длл:
library twain;

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls, ImageEnView, ImageEnIO, ComCtrls,
 Options in "Options.pas" {Form1};
{$R *.res}

function ShowMyDialog: Boolean;
begin
 {Создаем экземпляр Form1 формы TForm1}
 Form1 := TForm1.Create(Application);
 {В Label1 выводим Msg}
 {Возвращаем True только если нажата OK (ModalResult = mrOk)}
 //Result := (Form1.ShowModal = mrOk);
 {Освобождаем память}
 
//  Form1.Free;
end;
EXPORTs ShowMyDialog;
end.

Код формы:

unit oPTIONS;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls, ImageEnView, ImageEnIO, ComCtrls;

type
 TForm1 = class(TForm)
   ImageEnIO1: TImageEnIO;
   ImageEnView1: TImageEnView;
   Panel1: TPanel;
   GroupBox1: TGroupBox;
   CheckBox1: TCheckBox;
   GroupBox2: TGroupBox;
   ComboBox1: TComboBox;
   Label1: TLabel;
   Edit1: TEdit;
   Label2: TLabel;
   Edit2: TEdit;
   Label3: TLabel;
   ComboBox2: TComboBox;
   CheckBox2: TCheckBox;
   GroupBox3: TGroupBox;
   Label4: TLabel;
   Label5: TLabel;
   Label6: TLabel;
   Label7: TLabel;
   Edit3: TEdit;
   Edit4: TEdit;
   Edit5: TEdit;
   Edit6: TEdit;
   Button1: TButton;
   Button2: TButton;
   ProgressBar1: TProgressBar;
   CheckBox3: TCheckBox;
   CheckBox4: TCheckBox;
   CheckBox5: TCheckBox;
   Button3: TButton;
   procedure FormActivate(Sender: TObject);
   procedure ComboBox1Change(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure ImageEnIO1Progress(Sender: TObject; per: Integer);
   procedure CheckBox5Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
   procedure FillBack; // copy twain parameters to the controls
   procedure FillIn; // copy controls to twain parameters
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
BitMap:TBitmap;
implementation

{$R *.DFM}

procedure TForm1.FormActivate(Sender: TObject);
var
i:integer;
begin
// fills TWain sources
for i:=0 to ImageEnIO1.TWainParams.SourceCount-1 do
   ComboBox1.Items.Add( ImageEnIO1.TWainParams.SourceName[i] );
  // Select first scanner
  ComboBox1.ItemIndex:=0;
  ImageEnIO1.TWainParams.SelectedSource:=ComboBox1.ItemIndex;
ImageEnIO1.TWainParams.AppVersionInfo:="1.0";
  ImageEnIO1.TWainParams.AppManufacturer:="Hyrix";
  ImageEnIO1.TWainParams.AppProductFamily:="Image processing";
  ImageEnIO1.TWainParams.AppProductName:="ImageEn demo";
  FillBack;
end;

// Select scanner
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
ImageEnIO1.TWainParams.SelectedSource:=ComboBox1.ItemIndex;
  FillBack;
end;

// negotiate parameters (verify that scanner supports Frame rectangle, Dpi...)
procedure TForm1.Button2Click(Sender: TObject);
begin
FillIn;
  ImageEnIO1.TWainParams.Update; // verify here...
  FillBack;
end;

// copy twain parameters to the controls
procedure TForm1.FillBack;
const
COLORS:array [0..2] of string=("Black&White","GrayScale","RGB");
var
i:integer;
begin
  Edit1.Text:=FloatToStr( ImageEnIO1.TWainParams.YResolution.CurrentValue );
Edit2.Text:=FloatToStr( ImageEnIO1.TWainParams.XResolution.CurrentValue );
  // Fill Colors (0=B/W 1=GrayScale 2=RGB) combobox
  ComboBox2.Clear;
for i:=0 to ImageEnIO1.TWainParams.PixelType.Count-1 do
   ComboBox2.Items.Add( COLORS[ ImageEnIO1.TWainParams.PixelType[i] ] );
  ComboBox2.ItemIndex:=ImageEnIO1.TWainParams.PixelType.IndexOf(ImageEnIO1.TWainParams.PixelType.CurrentValue);
// frame
Edit3.Text:=FloatToStr(ImageEnIO1.TWainParams.AcquireFrameLeft);
Edit4.Text:=FloatToStr(ImageEnIO1.TWainParams.AcquireFrameTop);
  Edit5.Text:=FloatToStr(ImageEnIO1.TWainParams.AcquireFrameRight);
  Edit6.Text:=FloatToStr(ImageEnIO1.TWainParams.AcquireFrameBottom);
end;

// copy controls values to twain parameters
procedure TForm1.FillIn;
begin
ImageEnIO1.TWainParams.VisibleDialog:=CheckBox1.Checked;
  ImageEnIO1.TWainParams.ProgressIndicators:=CheckBox2.Checked;
ImageEnIO1.TWainParams.AcquireFrameLeft:=StrToFloat( Edit3.Text );
ImageEnIO1.TWainParams.AcquireFrameTop:=StrToFloat( Edit4.Text );
  ImageEnIO1.TWainParams.AcquireFrameRight:=StrToFloat( Edit5.Text );
  ImageEnIO1.TWainParams.AcquireFrameBottom:=StrToFloat( Edit6.Text );
  ImageEnIO1.TWainParams.PixelType.CurrentValue:=ComboBox2.ItemIndex;
  ImageEnIO1.TWainParams.YResolution.CurrentValue:=StrToInt( edit1.text);
ImageEnIO1.TWainParams.XResolution.CurrentValue:=StrToInt( edit2.text);
  ImageEnIO1.TWainParams.BufferedTransfer:=CheckBox4.Checked;
end;

// Acquire
procedure TForm1.Button1Click(Sender: TObject);
begin
Bitmap.Width := 640 ;
Bitmap.Height := 480 ;
FillIn;
  ImageEnIO1.Acquire;
  ProgressBar1.Position:=0;
end;

// progress
procedure TForm1.ImageEnIO1Progress(Sender: TObject; per: Integer);
begin
ProgressBar1.Position:=per;
  if CheckBox3.Checked then begin
   ImageEnView1.Update;
   application.processmessages;
  end;
end;

// enable/disable acquire frame
procedure TForm1.CheckBox5Click(Sender: TObject);
begin
edit3.enabled:=CheckBox5.Checked;
edit4.enabled:=CheckBox5.Checked;
  edit5.enabled:=CheckBox5.Checked;
  edit6.enabled:=CheckBox5.Checked;
  ImageEnIO1.TWainParams.AcquireFrameEnabled:=CheckBox5.Checked;
  ImageEnIO1.TWainParams.Update;
FillBack;
end;


Так вот почему, когда я из своей программы вызываю показ этого окна, оно появляется, вот только никаких действий не выполняет, постоянно ошибки вылетают, хотя в проекте(программе) все работает нормально (все что на форме), а как вызваю то появляются ошибки

function ShowMyDialog: Boolean; stdcall; external "twain.DLL";

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
ShowMyDialog);
end;



Почему?


 
clickmaker ©   (2004-03-12 13:41) [1]

в длл
function ShowMyDialog: Boolean; stdcall;


 
Alx2 ©   (2004-03-12 13:43) [2]

Код не читал. Только секцию uses посмотрел. Попробуй поставить на первое место в uses модуль ShareMem. Причем hostе - в головной модуль.


 
Alx2 ©   (2004-03-12 13:45) [3]

>clickmaker ©   (12.03.04 13:41)
Точно. Спецификаторы разные. :)


 
ChcngerMan   (2004-03-12 13:58) [4]

Все сделал как сказали :)
Все равно ошибка(когда форма появляется)
тут:

procedure TForm1.FormActivate(Sender: TObject);
var
i:integer;
begin
// fills TWain sources
for i:=0 to ImageEnIO1.TWainParams.SourceCount-1 do
  ComboBox1.Items.Add( ImageEnIO1.TWainParams.SourceName[i] );
 // Select first scanner
 ComboBox1.ItemIndex:=0;
 ImageEnIO1.TWainParams.SelectedSource:=ComboBox1.ItemIndex;
ImageEnIO1.TWainParams.AppVersionInfo:="1.0";
 ImageEnIO1.TWainParams.AppManufacturer:="Hyrix";
 ImageEnIO1.TWainParams.AppProductFamily:="Image processing";
 ImageEnIO1.TWainParams.AppProductName:="ImageEn demo";
 FillBack;
end;

Из-за чго может быть?


 
evvcom   (2004-03-12 14:03) [5]

То что соглашения о вызовах разные - это в данном случае замечание, но на ошибку никак не влияет, т.к. функция эта без параметров. В данном случае stdcall и fastcall идентичны.

А трассировать свою dll пробовал? И что дает?


 
Alx2 ©   (2004-03-12 14:07) [6]

А что за ошибка?


 
ChcngerMan   (2004-03-12 14:10) [7]

"Access violation ..." :(


 
ChcngerMan   (2004-03-12 14:11) [8]

Еще пишет при закрытии: Invalid pointer operation


 
Alx2 ©   (2004-03-12 14:20) [9]

Кажется, нужно сделать где-то один раз Application.Initialize. Но, если не нужно раздельных экземпляров Application, лучше передавать его из приложения-хоста как параметр.


 
Alx2 ©   (2004-03-12 14:38) [10]

Сейчас проверил в простейшем случае. У меня работает без ошибок.

Есть вопросы: глобальная переменная BitMap где инициализируется? Или до procedure TForm1.Button1Click(Sender: TObject) дело пока не доходит?


 
ChcngerMan   (2004-03-12 21:29) [11]

До нее пока дело не дошло :)
Какие еще есть вариянты?
:(


 
ChcngerMan   (2004-03-12 21:45) [12]

Еще прикол в том, что весь код формы прекрасно работает, когда является просто формой программы, а как в Дллку ее запихал, появились такие вот ошибки


 
Defunct ©   (2004-03-13 00:42) [13]

Попробуйте:

Form1 := TForm1.Create(Nil);


 
ChcngerMan   (2004-03-13 12:10) [14]

Все равно глючит :(
А нужно самому вручную создавать свои объекты (точней компоненты), или можно просто на форму поставить???
Че то никак не пойму почему не работает :(


 
ChcngerMan   (2004-03-13 19:38) [15]

.



Страницы: 1 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.036 c
1-1079254528
Tarquin
2004-03-14 11:55
2004.04.04
Как проверить существование файла при его удалении.


1-1079172401
PiratA
2004-03-13 13:06
2004.04.04
TTreeView


1-1079432738
Луарвик
2004-03-16 13:25
2004.04.04
Потоки не пашут паролельно! По очереди они...


1-1079591756
Rem
2004-03-18 09:35
2004.04.04
Автозапуск с Flash-карты


1-1079385275
Маришка
2004-03-16 00:14
2004.04.04
IE Toolbar