Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.05.04;
Скачать: CL | DM;

Вниз

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

 
Loser   (2013-07-23 12:11) [0]

Всем привет! Столкнулся со следующей проблемой: при компиляции в режиме 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.


 
Сергей М. ©   (2013-07-23 14:00) [1]


> function Dev_Open;     external "DevDriver.dll" ;
> function Dev_Enum;     external "DevDriver.dll" ;
>


stdcall куда делся ?


 
loser   (2013-07-23 14:09) [2]

В объявлении функции


 
RWolf ©   (2013-07-23 14:20) [3]

Размер структуры DEVINFO неплохо бы сравнить с исходным.


 
loser   (2013-07-23 14:26) [4]

Сравнивал, совпадает((


 
MBo ©   (2013-07-23 14:29) [5]

а в DLL-ке точно stdcall используется?


 
loser   (2013-07-23 14:32) [6]

Видимо да, т.к. без этого не работает


 
loser   (2013-07-23 14:33) [7]

Странным мне еще кажется то, что в дебаге всё замечательно работает


 
loser   (2013-07-23 14:37) [8]

И еще странность: если раскомментировать showmessage в функции класса, то всё тоже работает


 
MBo ©   (2013-07-23 14:47) [9]

>Видимо да
Это должно быть в сишных заголовках или сопутствующих файлах от dll-ки


 
loser   (2013-07-23 14:51) [10]

А как это может работать в дебаге?


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

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

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


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

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


 
MBo ©   (2013-07-23 15:32) [13]

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


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

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


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

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

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


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

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


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

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


 
Inovet ©   (2013-07-23 17:46) [18]

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

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


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

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


 
RWolf ©   (2013-07-23 18:02) [20]

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


 
brother ©   (2013-07-23 18:03) [21]

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

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


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

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


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

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


 
Inovet ©   (2013-07-23 18:18) [24]

> [19] loser   (23.07.13 17:49)

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

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

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

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


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

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


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


> //ShowMessage(IntToStr(Result));


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


 
brother ©   (2013-07-23 20:49) [27]

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


 
brother ©   (2013-07-23 20:51) [28]

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

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


 
brother ©   (2013-07-23 21:14) [29]

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


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

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

P.S.

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

а что не так?



Страницы: 1 вся ветка

Текущий архив: 2014.05.04;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.007 c
15-1383748436
SergP
2013-11-06 18:33
2014.05.04
Динамический массив записей со строками. подскажите


2-1374567086
Loser
2013-07-23 12:11
2014.05.04
Вызов функции из DLL в методе объекта ( c кодом)


2-1374665706
Стас258
2013-07-24 15:35
2014.05.04
Как в мемо проймать прокрутку?


15-1383833853
Ptr_Suspend
2013-11-07 18:17
2014.05.04
Как сделать фунцкию LoWord()?


1-1324995516
Dark King
2011-12-27 18:18
2014.05.04
Компилятор