Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Повторная загрузка изображения на форму, которая в DLL


Страницы:   1 2

>|< ©   (2012-07-02 17:37:00) 

Здравствуйте, уважаемые мастера!
Есть форма, которая находится в DLL.
На форме находится компонент TImage.
DLL экспортирует функцию, которая для своей работы создает экземпляр формы и загружает в компонент TImage изображение.
При повторном вызове метода Image.LoadFromFile вылетает Access Violation и приложение, которое использует данную DLL падает.

Подскажите, как можно решить данную проблему.
Модуль ShareMem в секции uses подключен.

Заранее благодарен.


Ega23   (2012-07-02 23:47:00) [21]


> в этом как раз вопросов нет. заказчик загадал сделать в
> виде dll, чтобы использовать из Java.


И ты думаешь, что в Java есть свой ShareMem?


KilkennyCat   (2012-07-02 22:10:00) [22]

а мне казалось, что нужно на вызвавшее ссылаться....


Давайте будем жрать!   (2012-07-02 21:51:00) [23]


> а nil ли здесь должен быть?
Вай нот? Он же сам её разрушает.


KilkennyCat   (2012-07-02 21:15:00) [24]


> MRZRecognizeForm := TMRZRecognizeForm.Create(nil);

а nil ли здесь должен быть?


>|<   (2012-07-02 20:12:00) [25]


> необходимость которой под вопросом

в этом как раз вопросов нет. заказчик загадал сделать в виде dll, чтобы использовать из Java.


>  и у тебя еще куча ошибок и связаны они все с неправильным
> использованием ДЛЛ

можно с этого места поподробней?
Буду очень признателен.)
Или хотя бы ссыль бросьте, где можно почитать, как правильно работать с DLL


Anatoly Podgoretsky   (2012-07-02 20:00:00) [26]

Как видишь в [4] ничего не приведено и у тебя еще куча ошибок и связаны они все с неправильным использованием ДЛЛ, необходимость которой под вопросом.


>|<   (2012-07-02 19:42:00) [27]

Нашел в чем причина.
Модуль ShareMem нужно подключать не только в library но и в приложении, которое использует эту Dll.

Но возникла другая проблема:
При закрытии приложения появляется такая ошибка:
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help  
---------------------------


>|<   (2012-07-02 19:12:00) [28]

когда добавил пересоздание формы для каждого вызова экспортируемой функции, то AV начал выпадать в месте второго создания формы:
function RecognizeDetails(AImageFilename: string; var values: TInteger_Array;
 var trust: TSingle_Array): integer;
var
 I: Integer;
 RecognisedStr: widestring;

begin
 //  if not Assigned(MRZRecognizeForm) then
  MRZRecognizeForm := TMRZRecognizeForm.Create(nil);<- при втором вызове здесь вываливает  Access Violation
 try
   try
     MRZRecognizeForm.Visible := false;
     RecognisedStr := MRZRecognizeForm.RecognizeImage(AImageFilename, trust);
     Result := Length(RecognisedStr);
     SetLength(values, Result);

     for I := 1 to Result do
       values[i - 1] := Pos(RecognisedStr[i], MRZ_Chars) - 1;
   except
     on E: Exception do
     begin
       ShowMessage(E.Message);
       Result := -1;
     end;
   end;
 finally
   FreeAndNil(MRZRecognizeForm);
 end;
end;


&gt;|&lt;   (2012-07-02 19:03:00) [29]


> Это только слова, а вот что в файле проекта?

код приведен в посте >|<   (02.07.12 18:29) [4]


&gt;|&lt;   (2012-07-02 19:02:00) [30]

в окне CPU под отладчиком вываливается в методе
LoadResString:
на строчке
0052658D 6800040000              push $00000400

если эта информация сможет помочь найти причину проблемы...

Туманно я догадываюсь, что из-за того что форма в в dll, ресурсы связанные с ней нужно как-то расшарить для повторного доступа к ним.
Но пока понятия не имею, как это сделать.
ShareMem использовал, но он ничего не дал.
Даже пересоздаю каждый раз форму при вызове функции - и это не помогло.
Ошибка осталась та же.


Anatoly Podgoretsky   (2012-07-02 18:54:00) [31]


> Модуль ShareMem в секции uses подключен.

Это только слова, а вот что в файле проекта?


&gt;|&lt;   (2012-07-02 18:29:00) [32]

На всякий случай покажу код:
library MRZRecognizer;

uses
 ShareMem,
 SysUtils,
 Classes,
 Graphics,
 FannNetwork,
 Windows,
 Dialogs,
 MRZ_Recognize in 'MRZ_Recognize.pas' {MRZRecognizeForm};

// interface

{$R *.res}

function RecognizeMRZ(AImageFilename: TFilename): widestring;
var trust:TSingle_Array;
begin
 if not Assigned(MRZRecognizeForm) then
   MRZRecognizeForm := TMRZRecognizeForm.Create(nil);
 try
   MRZRecognizeForm.Visible := false;
   Result := MRZRecognizeForm.RecognizeImage(AImageFilename,trust);
 finally
 end;
end;

function RecognizeDetails(AImageFilename: string; var values:  TInteger_Array;
 var trust:TSingle_Array): integer;
var
 I: Integer;
 RecognisedStr:widestring;

begin
 if not Assigned(MRZRecognizeForm) then
   MRZRecognizeForm := TMRZRecognizeForm.Create(nil);
 try
   MRZRecognizeForm.Visible := false;
   RecognisedStr := MRZRecognizeForm.RecognizeImage(AImageFilename, trust);
   Result := Length(RecognisedStr);
   SetLength(values, Result);

   for I := 1 to Result do
     values[i-1]:=Pos(RecognisedStr[i],MRZ_Chars)-1;
 except
   on E:Exception do
   begin
      ShowMessage(E.Message);
      Result := -1;
   end;
 end;
end;

exports RecognizeMRZ, RecognizeDetails;

procedure MyDLLMain(dwReasson: DWORD);
begin
 case dwReasson of

   DLL_PROCESS_DETACH:
     begin
       if Assigned(MRZRecognizeForm) then
       begin
         MRZRecognizeForm.Free;
         MRZRecognizeForm := nil;
       end;
     end;
 end;
end;

begin
 DllProc := @MyDLLMain;

end.

unit MRZ_Recognize;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, FannNetwork,
 DBClient, ComCtrls, acPNG;

const
 CharWidth = 11;
 CharHeight = 34;
 MRZ_Chars = '0123456789<ABCDEFGHIJKLMNOPQRSTUVWXYZ';

type
 tsingle_array = array of single;
 TInteger_Array = array of integer;

 TMRZRecognizeForm = class(TForm)
  ...
  ...
  ...

function TMRZRecognizeForm.RecognizeImage(Afilename: string;
 var trust:TSingle_Array): widestring;
var
BMP1: TBitmap;
begin
 Result := '';

  Image1.Picture.LoadFromFile(Afilename);
//в этом месте при второй попытке вылетает Access Violation
 BMP1 := TBitmap.Create;
 try
   BMP1.Height := Image1.Height + 10;
   BMP1.Width := Image1.Width + 10;
   BMP1.Canvas.Draw(5, 5, Image1.Picture.Graphic);
   Image1.Picture.Bitmap.Assign(BMP1);
 finally
   BMP1.Free;
 end;
 Result := GetImageChars(Image1.Picture.Bitmap, trust);
end;

end.


&gt;|&lt;   (2012-07-02 18:24:00) [33]

точно

под отладчиком смотрел.
вываливается ---------------------------
Debugger Fault Notification
---------------------------
Project1.exe faulted with message: 'access violation at 0x0052658d: write of address 0x00030d6c'. Process Stopped. Use Step or Run to continue.
---------------------------
OK  
---------------------------


KilkennyCat   (2012-07-02 18:15:00) [34]

> Image.LoadFromFile вылетает Access Violation
точно там вылетает?


&gt;|&lt;   (2012-07-02 17:48:00) [35]

Форма создается только один раз при загрузке dll и освобождается только когда приложение завершает свою работу


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо