Форум: "Начинающим";
Текущий архив: 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.003 c