![]() |
| ||
|
|
Новости |
Поиск |
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 14:51:00) [21]А как это может работать в дебаге?
MBo (2013-07-23 14:47:00) [22]>Видимо да
Это должно быть в сишных заголовках или сопутствующих файлах от dll-ки
loser (2013-07-23 14:37:00) [23]И еще странность: если раскомментировать showmessage в функции класса, то всё тоже работает
loser (2013-07-23 14:33:00) [24]Странным мне еще кажется то, что в дебаге всё замечательно работает
loser (2013-07-23 14:32:00) [25]Видимо да, т.к. без этого не работает
MBo (2013-07-23 14:29:00) [26]а в DLL-ке точно stdcall используется?
loser (2013-07-23 14:26:00) [27]Сравнивал, совпадает((
RWolf (2013-07-23 14:20:00) [28]Размер структуры DEVINFO неплохо бы сравнить с исходным.
loser (2013-07-23 14:09:00) [29]В объявлении функции
Сергей М. (2013-07-23 14:00:00) [30]
> function Dev_Open; external 'DevDriver.dll' ;
> function Dev_Enum; external 'DevDriver.dll' ;
>
stdcall куда делся ?