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

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

Вызов функции из DLL в методе объекта ( c кодом)


Страницы:   1 2

Loser ©   (2013-07-23 12:11:00) 

Всем привет! Столкнулся со следующей проблемой: при компиляции в режиме Debug все замечательно, в релизе - случайное поведение (access violation и т.д.). В чем может быть ошибка?

unit DEV_API;

interface

uses Windows,SysUtils,Dev_Const;

function Dev_Open(hDev: PHANDLE;  serNum: WORD): integer;stdcall;
{ int Dev_Open(HANDLE* hDev, WORD serNum)
Описание: Открывает дескриптор устройства.
Параметры: HANDLE *hDev – адрес дескриптора устройства;
           WORD serNum – серийный номер устройства (определяется с помощью функции Si_Enum).
Возвр. значение: Порядковый номер устройства или -1 в случае ошибки.
}

//-----------------------------------------------------------------------------------------------------

function  Dev_Enum(i: DWORD;  di : PDEVINFO):BOOL;stdcall;
{BOOL Dev_Enum(DWORD i, SI_DEVINFO& di)
Описание: Получает информацию об адаптере по порядковому номеру.
Параметры: DWORD i – порядковый номер устройства, начиная с 0;
           DEVINFO& di – структура, в которую сохраняется информация об устройстве, включая серийный номер.
Возвр. значение: TRUE – устройство с заданным индексом существует.
}
//-----------------------------------------------------------------------------------------------------

implementation

function Dev_Open;     external 'DevDriver.dll' ;
function Dev_Enum;     external 'DevDriver.dll' ;

end.


unit DEV_CLASS;

interface

uses
 SysUtils, Windows, Variants, Classes,Dialogs,Dev_API,Dev_Const;

type

 TDev = class
 private
   FDev_HANDLE:     Cardinal;
   FConnected: BOOL;
 public
   function   Init(): Integer;
 end;

implementation

function   TDev.Init(): Integer;
var
inf :  DEVINFO;
begin
FConnected:=False;
FDev_HANDLE:=0;
if Dev_Enum(0,@Inf) then
  begin
   Result:= Dev_Open(@FDev_HANDLE,Inf.ser);
   //ShowMessage(IntToStr(Result));
  end;

end;

end.


unit Unit1;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils,  System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, DEV_class,DEV_const,
 Vcl.ExtCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Timer1: TTimer;
   procedure Button1Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 Device: TDev;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Device:=TDev.Create;
Device.Init;
timer1.Enabled:=true;
Device.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
//do nothing
end;

end.


loser   (2013-07-23 22:48:00) [1]

Ребята, всем спасибо за ответы. С Вашей помощью разобрался.

P.S.

> brother ©   (23.07.13 21:14) [29]

а что не так?


brother   (2013-07-23 21:14:00) [2]

имхо, человеку пишущему подобные вещи - стоит писать о своих проблеммах или подробнее, или не браться за подобное
> unit DEV_API;
>
> interface
>
> uses Windows,SysUtils, Dev_Const;


brother   (2013-07-23 20:51:00) [3]

> о причине такого поведения программы

имхо, нарушено соглашение вызова или не верное описание типов...


brother   (2013-07-23 20:49:00) [4]

да, сколько можно тянуть то? где возникает AV?


Сергей М.   (2013-07-23 20:47:00) [5]


> //ShowMessage(IntToStr(Result));


Почему закомментарено ?
Это же важно, возникает ли месседж до АВ или после и возникает ли вообще ..


loser   (2013-07-23 19:03:00) [6]

Замечательная притча, спасибо. Но суть Вашего ответа была понятна и ранее, только речь не о следствии , а о причине такого поведения программы.


Inovet   (2013-07-23 18:18:00) [7]

> [19] loser   (23.07.13 17:49)

Раз про звёзды непонятно.

Релиз.
Шёл однажды мужик с базара. Как водится, перед тем как идти домой, отметил с друзьями субботний день, да засиделся допоздна. Идёт он навеселе, песни поёт, а уже смеркается, не заметил канавы, да как хряпнулся в неё со всего размаха. Вывихнул ногу. Лежит он на дне, встать не может, кричит, а никто неслышит - поздно уже. Жена ждала-ждала, и пошла искать мужа. Нашла его в канаве уже далеко заполночь, побежала за кузнецом. Приехали на телеге, вытащили его из канавы, да к утру домой привезли.

Дебаг.
Собрался мужик на базар, а жена говорит - Небось пить будешь вечером, пойду-ка я тоже в город к сестре, давно не виделись. Ну пойдём, коли хочешь, - отвечает муж. А зачем пойдём? - говорит жена. Я щас кузнеца позову, он нас на телеге довезёт раненько с утра. После базара вечером мужик выпил с друзьями, а жена уже тут как тут - приехала с кузнецом на телеге. Сели, да ещё засветло все вместе и доехали до дома.

В обеих версиях муж выпил, канава была, жена была, кузнец был, телега была. А события развивались по-разному и с разными последствиями.


loser   (2013-07-23 18:08:00) [8]

А в контексте выполнения основной программы функции этой библиотеки тоже работают


loser   (2013-07-23 18:04:00) [9]

Ну, уверенность только из того, что программка тестовая к этой dll-ке работает без проблем..


brother   (2013-07-23 18:03:00) [10]

> в случае этого говнокода, можно уверенно сказать, что работает.

не согласен, ибо av ты ловишь, значит вызов не корректен...


RWolf   (2013-07-23 18:02:00) [11]

откуда такая уверенность, без исходников-то?
может, эта DLL по-тихому расстреливает память, в дебаге вред приходится на одни адреса, где это незаметно, в релизе — на другие, где это вызывает AV.


loser   (2013-07-23 17:49:00) [12]

Нет, в случае этого говнокода, можно уверенно сказать, что работает.
А в релизе исключение возникает в участках кода, никак не связанных с объектом.
Я в панике


Inovet   (2013-07-23 17:46:00) [13]

> [17] loser   (23.07.13 17:28)
> Блин, ну почему в дебаге-то эта хрень работает?

Отсутствие АВ ещё не значит, что работает.


loser   (2013-07-23 17:28:00) [14]

Сишных нету файлов, только описание ( оно в закомментированных участках под объявлениями функций).
Блин, ну почему в дебаге-то эта хрень работает?
Кстати, если функции длл вызывать из основной программы (без объектов всяких), то тоже всё работает


MBo   (2013-07-23 16:58:00) [15]

>Сишных файлов нет
Не, брат, с таким настроением ты слона не продашь (©)


Inovet   (2013-07-23 16:03:00) [16]

> [12] loser   (23.07.13 15:09)
> Расположение звезд стационарно и детерминировано

В дебаг версии Мироздания оно отлично от релиза.


loser   (2013-07-23 15:43:00) [17]

Сишных файлов нет. В dev_const одна структура
DevInfo : packed record  of
Param: word;
State: word;
Ser: word;
Str: array[0..255] of AnsiChar;
end;


MBo   (2013-07-23 15:32:00) [18]

сишные файлы и Dev_Const где?


loser   (2013-07-23 15:09:00) [19]

Расположение звезд стационарно и детерминировано, а поведение моего кода случайно


Inovet   (2013-07-23 15:00:00) [20]

> [10] loser   (23.07.13 14:51)
> А как это может работать в дебаге?

От разного расположения звёзд.


Страницы:   1 2

Наверх

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