Текущий архив: 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
-> попадаем в dllDeviceInterfaceLib
->
вызаваем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 inmodule "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.49 MB
Время: 0.038 c