Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.05 c
3-1117530841
ryds
2005-05-31 13:14
2005.07.11
как программно запустить диалоговое окно IBDatabase Editor?


14-1117924451
паша_голубь
2005-06-05 02:34
2005.07.11
Киевская Встреча Мастаков


14-1118831214
Romkin
2005-06-15 14:26
2005.07.11
Отзыв о работе


3-1117022451
PHilosoPH!
2005-05-25 16:00
2005.07.11
Загрузка изображения из *.jpg файла в BLOB-поле через TDBImage


10-1095245277
Pumpa
2004-09-15 14:47
2005.07.11
Это кто? PortableServer_POA::AdapterNonExistent





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский