![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов функции из DLL в методе объекта ( c кодом)
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)
> А как это может работать в дебаге?
От разного расположения звёзд.