![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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-> попадаем в dllDeviceInterfaceLib->
вызаваем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 inmodule '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?