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

Вниз

Вызов функции из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.002 c
2-1374653973
delphistorm
2013-07-24 12:19
2014.05.04
Как правильнее?


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


15-1383220486
DevilDevil
2013-10-31 15:54
2014.05.04
СТРОКИ НЕ ПОТОКОБЕЗОПАСНЫ


15-1383510603
Юрий
2013-11-04 00:30
2014.05.04
С днем рождения ! 4 ноября 2013 понедельник


4-1268893097
DremLIN.Ru
2010-03-18 09:18
2014.05.04
Как достоверно определить что программа запущена из планировщика?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский