Перенос кода из *.pas в dll помогите
Доброго времени суток уважаемые товарищи программисты!
Есть в наличии устройство работающее через COM-Port, есть написанное под него приложение которое отправляет устройству команды и получает от него ответы. приложение вполне работоспособно и функционально работает с портом по средству BComPort. Но вот стала необходимость быстро перевести код приложения в dll библиотеку из которой будет экспортироваться всего несколько функций. Думаю ну задача та простая банально подключаю к библиотеке pas файл из которого и идет работа с программой а процедуры которые были в программе перегоняю в 2 функции библиотеки. Все было прекрасно библиотека создалась тестовое приложение для работы с ней готово. Но вот всплыла проблема после запуска тестового приложения данные в контроллер отправляются а обратно ничего не приходит, в тоже время проверяю работу через первое приложение там все нормально работает и отправляется и передается, а вот через dll ничего хорошего не происходит. Помогите может кто сталкивался с подобными ситуациями. Заранее благодарю!
Код:
{Основное работающее приложение}
unit main_Form;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, usbToken, XPMan;
type
TForm1 = class(TForm)
openPort: TButton;
GroupBox1: TGroupBox;
tokenIdent: TButton;
autoGenButton: TButton;
randomEditIdent: TLabeledEdit;
autoGenEnable: TCheckBox;
XPManifest1: TXPManifest;
keyTokenEdit: TLabeledEdit;
resultLabel: TLabel;
closePort: TButton;
GroupBox2: TGroupBox;
guidSoftwareEdit: TLabeledEdit;
keySoftwareName: TLabeledEdit;
softwareIdent: TButton;
resultLabelSoft: TLabel;
procedure autoGenEnableClick(Sender: TObject);
procedure tokenIdentClick(Sender: TObject);
procedure autoGenButtonClick(Sender: TObject);
procedure openPortClick(Sender: TObject);
procedure closePortClick(Sender: TObject);
procedure softwareIdentClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses DateUtils;
procedure TForm1.autoGenEnableClick(Sender: TObject);
begin
if autoGenEnable.Checked then
begin
autoGenButton.Visible := true;
end
else
begin
autoGenButton.Visible := false;
end;
end;
procedure TForm1.tokenIdentClick(Sender: TObject);
var temp, key, randomNumber : string;
chipherText, outText : word;
begin
randomEditIdent.Enabled := false;
keyTokenEdit.Enabled := false;
temp := '';
randomNumber := randomEditIdent.Text;
key := keyTokenEdit.Text;
if (length(randomNumber) = 4) and (length(key) = 8) then
begin
temp := tokenUsb.tarIdentification(randomNumber);
if temp ='noAnsw' then
begin
Application.MessageBox('Устройтво не отвечает! Убедитесь в правильности подключения и номера порта.', 'Внимание!', MB_OK + MB_ICONINFORMATION);
randomEditIdent.Enabled := true;
keyTokenEdit.Enabled := true;
end
else
begin
temp := copy(temp, 4, 4);
try
chipherText := StrToInt('$' + temp);
except
NULL;
end;
outText := tokenUsb.decryptBlockFeistel(StrToInt('$' + key), chipherText);
if outText = StrToInt('$' + randomNumber) then
begin
resultLabel.Caption := 'Ключ обнаружен';
GroupBox2.Enabled := true;
end
else
resultLabel.Caption := 'Ключ не обнаружен';
randomEditIdent.Enabled := true;
keyTokenEdit.Enabled := true;
end;
end
else
begin
Application.MessageBox('Допускаются шестнадцатиричные числа длинной 2 байта.', 'Введены не коректные данные!', MB_OK + MB_ICONINFORMATION);
randomEditIdent.Enabled := true;
keyTokenEdit.Enabled := true;
end;
end;
procedure TForm1.autoGenButtonClick(Sender: TObject);
var
temp : word;
tyear,tmonth,tday,thour,tmin,tsec,tmsec: word;
begin
{ if length(beginNumberEdit.Text) = 4 then
begin
temp := tokenUsb.generatorCongruential(StrToInt('$' + beginNumberEdit.Text));
randomEditIdent.Text := IntToHex(temp, 4);
end
else
Application.MessageBox('Допускаются шестнадцатиричные числа длинной 2 байта.', 'Введены не коректные данные!', MB_OK + MB_ICONINFORMATION);}
DecodeDateTime(now,tyear,tmonth,tday,thour,tmin,tsec,tmsec);
temp:= tyear + tmonth + tday + thour + tmin + tsec + tmsec;
temp := tokenUsb.generatorCongruential(temp);
randomEditIdent.Text := IntToHex(temp, 4);
end;
procedure TForm1.openPortClick(Sender: TObject);
begin
tokenUsb.initComPort('COM1');
if tokenUsb.openComPort then
begin
openPort.Enabled := false;
closePort.Enabled := true;
GroupBox1.Enabled :=true;
end;
end;
procedure TForm1.closePortClick(Sender: TObject);
begin
if tokenUsb.closeComPort then
begin
openPort.Enabled := true;
closePort.Enabled := false;
GroupBox1.Enabled := false;
end;
end;
procedure TForm1.softwareIdentClick(Sender: TObject);
var softwareGuid, keySoftware, temp : string;
imitoToSend : word;
begin
temp := ''; imitoToSend := $0000;
keySoftware := keySoftwareName.Text;
softwareGuid := guidSoftwareEdit.Text;
if (length(keySoftware) = 8) and (length(softwareGuid) = 32)then
begin
temp := tokenUsb.parIdentification;
if temp ='noAnsw' then
Application.MessageBox('Устройтво не отвечает! Убедитесь в правильности подключения и номера порта.', 'Внимание!', MB_OK + MB_ICONINFORMATION)
else
begin
temp := copy(temp, 4, 4);
imitoToSend := tokenUsb.imitoCreate(StrToInt('$' + temp),StrToInt('$' + keySoftware), softwareGuid);
temp := '';
temp := tokenUsb.pairIdentification(IntToHex(imitoToSend, 4));
temp := copy(temp, 5, 3);
if temp = 'YES' then
resultLabelSoft.Caption := 'ПО идентифицировано'
else
resultLabelSoft.Caption := 'ПО не идентифицировано';
end;
end;
end;
end.
Код:
{Библиотека которую пытаюсь создать}
library sdk;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils,
Classes,
Dialogs,
forms,
usbToken in 'usbToken.pas';
{$R *.res}
Function proverka(rand,k: string): string; stdcall;
var
temp,randomNumber,key : string;
chipherText, outText: word;
begin
tokenUsb:= TtokenUsb.Create(nil);
tokenusb.BComPort1.Close;
tokenusb.BComPort1.Port:= 'COM1';
tokenusb.BComPort1.Open;
temp:='';
chipherText:=0;
randomNumber:= rand;
key:= k;
if (length(randomNumber)=4)and(length(key)=8) then
begin
temp:= tokenusb.tarIdentification(randomNumber);
if temp='noAnsw' then
begin
ShowMessage('устройство не подключено');
end
else
begin
temp:=copy(temp,4,4);
try
chipherText:=StrToInt('$'+temp);
except
ShowMessage('ничего нет, полный 0');
end;
outText:= tokenusb.decryptBlockFeistel(StrToInt('$'+key),chipherText);
if outText=StrToInt('$'+randomNumber) then
begin
Result:='Устройство опознано';
end
else
Result:='Устройство не опознано';
end;
end
else
begin
ShowMessage('Допускаются');
end;
tokenusb.BComPort1.Close;
end;
exports proverka;
begin
end.
Код:
{тестовая часть с вызовом функции из библиотеки}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,DateUtils;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
function proverka(rand,k: string):string; stdcall;
implementation
{$R *.dfm}
function proverka; external 'sdk.dll' name 'proverka';
function generatorCongruential(initNumber : word):word;
begin
generatorCongruential := ($00AB * initNumber + $2BCD) mod $CF85;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
temp : word;
tyear,tmonth,tday,thour,tmin,tsec,tmsec: word;
rand,rez,k: string;
begin
DecodeDateTime(now,tyear,tmonth,tday,thour,tmin,tsec,tmsec);
temp:= tyear + tmonth + tday + thour + tmin + tsec + tmsec;
temp := generatorCongruential(temp);
Edit1.Text := IntToHex(temp, 4);
rand:=Edit1.Text;
k:=Edit2.Text;
rez:=proverka(rand,k);
form1.Memo1.Lines.Add(rez);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Close;
end;
end.
|