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

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

AV в dll, объясните в чем может быть причина. [D7, WinXP]


Kolan ©   (2005-06-11 16:24:00) 

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

Итак 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.

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


Kolan   (2005-06-12 11:09:00) [1]

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


Kolan   (2005-06-11 23:59:00) [2]

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

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);

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


-=XP=-   (2005-06-11 23:52:00) [3]

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


Kolan   (2005-06-11 23:38:00) [4]

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

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


Kolan   (2005-06-11 23:36:00) [5]

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

Написал так
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:12:00) [6]


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


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

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

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

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


GuAV   (2005-06-11 23:05:00) [7]

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 22:57:00) [8]

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

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

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

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


GuAV   (2005-06-11 22:46:00) [9]

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


Kolan   (2005-06-11 21:15:00) [10]


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

Вот uses dll.

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


Так что

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

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

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


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

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


GuAV   (2005-06-11 21:06:00) [11]

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

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


Anatoly Podgoretsky   (2005-06-11 20:34:00) [12]

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

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


Kolan   (2005-06-11 20:22:00) [13]

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

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;


Shuric   (2005-06-11 18:29:00) [14]

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


TUser   (2005-06-11 18:17:00) [15]

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


Shuric   (2005-06-11 18:08:00) [16]

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


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

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


Shuric   (2005-06-11 17:13:00) [18]

Кто такой Comm?


Наверх

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