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

Вниз

AV в dll, объясните в чем может быть причина.   Найти похожие ветки 

 
Kolan ©   (2005-06-11 16:24) [0]

Здравствуйте,
Вопрос немного запутанный...

Итак 1. Имеем форму на которой кнопка

procedure TMainForm.BitBtn1Click(Sender: TObject);
begin
 StartConnection;
end;


Функция StartConnection описанна в модуле интерфейса для dll.

function StartConnection: Integer; stdcall;
implementation

function StartConnection: Integer;  external "DeviceInterfaceLib.dll" name
 "StartConnection";


Вот сама Dll.

uses
 SysUtils,
 Classes,
 KFreGrafDeviceInterface,
 KFreGrafComInterface;

{$R *.res}

function StartConnection: Integer; stdcall;
begin
 WriteByte(Ord("W"));
 WriteByte(Ord("A"));
 WriteByte(Ord("K"));
 WriteByte(Ord("E"));
 WriteByte(Ord("U"));
 WriteByte(Ord("P"));

 
end;

exports
 StartConnection;

begin
end.


код функций WriteByte описан в модуле KFreGrafComInterface который является интерфейсом для будующей длл(которой еще нет). К сожалению по к немогу провильно написать Dll работы с портом, поэтому рещил сделать всё остальное..

Поэтому я взял компонент кинул на форму и использовал его в модуле KFreGrafComInterface.(Потом переделаю этот модуль и сделаю dll).

function WriteByte(B: Byte): Boolean;
begin
 MainForm.Comm.WriteByte(B);
 Result := True;
end;


Вот так идет пошаговая трассировка:

Нажатие кнопки -> Вызов функции из модуля интерфейса KFreGrafDeviceInterface -> попадаем в dll DeviceInterfaceLib ->
вызаваем WriteByte(Ord("W")); -> модуль работы с портом MainForm.Comm.WriteByte(B); и получаем AV привызове .

Причина ощибки мне ясна - я не очень знаю как правильно работать с dll.

А вот где ошибка и как её исправить...


 
Shuric ©   (2005-06-11 17:13) [1]

Кто такой Comm?


 
TUser ©   (2005-06-11 17:57) [2]

А кто такой MainForm? Внутри DLL оно известно?


 
Shuric ©   (2005-06-11 18:08) [3]

Не, енто, исходя из слов автора, происходит в юните формы exe :)


 
TUser ©   (2005-06-11 18:17) [4]

Да нет - StartConnection вызывает WriteByte, так что это в DLL, вроде бы.


 
Shuric ©   (2005-06-11 18:29) [5]

Хе, он же написал <.(Потом переделаю этот модуль и сделаю dll).
>


 
Kolan ©   (2005-06-11 20:22) [6]

Вот Почти весь код модуля для сом.

unit KFreGrafComInterface;

interface
 uses oComm, KFreGrafMainForm;

 function SetCom(PortName: string): Boolean;
 function OpenCom: Boolean;
 function CloseCom: Boolean;
 function WriteByte(B: Byte): Boolean;
 function ReadByte: Byte;
 function WriteArray(const Buffer: array of Byte; Count: Integer): Integer;
 function ReadArray(var Buffer: array of Byte; Count: Integer): Integer;
 // TODO: BaudRate, StopBits.
implementation

function WriteByte(B: Byte): Boolean;
begin
 MainForm.Comm.WriteByte(B);
 Result := True;
end;
end.


Comm - компонент лежещий на форме(форма называется MainForm)


> TUser ©   (11.06.05 17:57) [2]


Внутри dll нет.
library DeviceInterfaceLib;
uses
 SysUtils,
 Classes,
 KFreGrafDeviceInterface,
 KFreGrafComInterface;
{$R *.res}
function StartConnection: Integer; stdcall;
begin
 WriteByte(Ord("W"));
 WriteByte(Ord("A"));
 WriteByte(Ord("K"));
 WriteByte(Ord("E"));
 WriteByte(Ord("U"));
 WriteByte(Ord("P"));
end;
exports
 StartConnection;
begin
end.

Но внутри известен Сом порт модуль которому известна и форма и
код компонента(хотя последнее наверно неважно...)
interface
 uses oComm, KFreGrafMainForm;


 
Anatoly Podgoretsky ©   (2005-06-11 20:34) [7]

Причина ощибки мне ясна - я не очень знаю как правильно работать с dll.
А вот где ошибка и как её исправить...

Хорошо сказал и готов к странению :-)


 
GuAV ©   (2005-06-11 21:06) [8]

Форма в dll видна, потому что модуль с формой просписан в uses dll ?

Тогда это другая форма. Причём в ехе она скорее всего создаётся в begin..end. файла .dpr , а в dll - никогда. Отсюда и AV.


 
Kolan ©   (2005-06-11 21:15) [9]


> GuAV ©   (11.06.05 21:06) [8]

Вот uses dll.

uses
 SysUtils,
 Classes,
 KFreGrafDeviceInterface, - Интерфейс для этойже dll.
 KFreGrafComInterface; - интерфейс для будующей dll com порта.


Так что

> модуль с формой просписан в uses dll

Вообще не прописан. Он описан в KFreGrafComInterface...

Как правильно?


> Хорошо сказал и готов к странению :-)

К чему я готов?


 
GuAV ©   (2005-06-11 22:46) [10]

ты мспользушь форму из модуля KFreGrafMainForm в dll в модуле KFreGrafComInterface ? Значит в dll эта форма есть. Причём наферное не создаётся, о чём я уже писал.


 
Kolan ©   (2005-06-11 22:57) [11]

Понял как мне это обойти мне надо временно сделать ШО бы работало. У меня есть компонент для работы с портом...

PS Может подскажите где взять dll ку для работы с портом.
Что надо

1. Открыть/Закрыть
2. Запись.
3. Установки.

4. Самое главное чтобы чтение было такое:
function Read(... Задержка): Boolean;
Т.е. Ждать опро время если ничего ни пришло, то Flase....
И не вещало прогу конечно


 
GuAV ©   (2005-06-11 23:05) [12]

Kolan ©   (11.06.05 22:57) [11]
У меня есть компонент для работы с портом...

Ну так и его можно в dll юзать.

в KFreGrafComInterface :
var
 Comm: TComm;

function WriteByte(B: Byte): Boolean;
begin
try
  Comm.WriteByte(B);
  Result := True;
except
  Result := False;
end;
end;

initialization
 Comm := TComm.Create;
finalization
 Comm.Free;
end.

Kolan ©   (11.06.05 22:57) [11]
PS Может подскажите где взять dll ку для работы с портом.


в папке system32 ищи kernel32.dll


 
Kolan ©   (2005-06-11 23:12) [13]


> в папке system32 ищи kernel32.dll


Если ты о WriteFile итд, то я почти написал модуль использующий поток и асинхронный режим. Не как не разберусь с возвратом считанного из потока...

Хотел бы что-то готовое..

Как бы компонент кладется на форму и конструктор выглядит так
constructor TComm.Create(AOwner: TComponent);

Что будет его параметром  ..


 
Kolan ©   (2005-06-11 23:36) [14]

Из хелпа не понял какого надо передать владельца...

Написал так
initialization
 Comm := TComm.Create(nil);
finalization
 Comm.Free;


AV теперь тут

<- AV перед началом ф-ции...
function WriteByte(B: Byte): Boolean;
begin
 {MainForm.}Comm.WriteByte(B);
 Result := True;
end;


 
Kolan ©   (2005-06-11 23:38) [15]

PS Вот ошибка если это поможет...

Accsess vialation at adress 0036D994 in module "DeviceInterfaceLib.dll". Read of adress 00000304.


 
-=XP=- ©   (2005-06-11 23:52) [16]

Читайте внимательно [10].


 
Kolan ©   (2005-06-11 23:59) [17]

Ну теперь то я не использую...

unit KFreGrafComInterface;

interface
 uses oComm;//, KFreGrafMainForm;
 function WriteByte(B: Byte): Boolean;
 var
   Comm: TComm;
implementation

function WriteByte(B: Byte): Boolean;
begin
 {MainForm.}Comm.WriteByte(B);
 Result := True;
end;

initialization
 Comm := TComm.Create(nil);
finalization
 Comm.Free;

end.


Как быть с этим
Comm := TComm.Create(nil);

Какой сдесь параметр?


 
Kolan ©   (2005-06-12 11:09) [18]

Как исправить?



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

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

Наверх




Память: 0.51 MB
Время: 0.067 c
1-1118912020
Alias
2005-06-16 12:53
2005.07.11
Подайте идею как искать причину stack overflow


3-1117285895
Darkmaster
2005-05-28 17:11
2005.07.11
XML и сохранение базы


1-1118897267
leonidus
2005-06-16 08:47
2005.07.11
Корректное отображение текста в контролах на нерусских ОС


9-1109414441
Xerx
2005-02-26 13:40
2005.07.11
Помогите реализовать алгоритм


1-1118618322
01
2005-06-13 03:18
2005.07.11
Как сохранить структуру в файл