Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

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 куда делся ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо