![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Повторная загрузка изображения на форму, которая в DLL
>|< © (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;
>|< (2012-07-02 19:03:00) [29]
> Это только слова, а вот что в файле проекта?
код приведен в посте >|< (02.07.12 18:29) [4]
>|< (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 подключен.
Это только слова, а вот что в файле проекта?
>|< (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.
>|< (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
точно там вылетает?
>|< (2012-07-02 17:48:00) [35]Форма создается только один раз при загрузке dll и освобождается только когда приложение завершает свою работу