-
Млин, в основном все вроде понятно, только никак разбудить его не могу после включения компа.... в чем собака порылась...
-
Подскажите как деактивировать прибор после получения купюр.
-
По кнопочке, или по таймауту...
-
И то и другое если можно
-
По кнопочке: для запуска POLL-цикла используем отдельный поток, тормозим кнопочкой, запускаем команду reset. По таймауту: делать пока .... то-то
-
Спасибо. Уже сам разобрался
-
Приветствую мастеров! У кого есть исходник, могли бы мне кинуть. xazan@bk.ru. Буду очень признателен
-
Мастера ну скиньте пожалуйста! очень нужно. xazan@bk.ru
-
Скинь и мне плиззз astrot1988 [at] gmail.com
-
Выложите прямо тут - никому не помешает. Выкладывайте все, кто чего-то добился в этом вопросе, и кому не жалко
-
//Профи! Не смейтесь, написал как смог...// program CashCode_SM1;
uses Forms, Unit1 in '..\Test_CachCode\Unit1.pas' {Form1}, Unit2 in '..\Test_CachCode\Unit2.pas';
{$R *.res}
begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.
-
//форма object Form1: TForm1 Left = 323 Top = 183 BiDiMode = bdLeftToRight BorderStyle = bsSingle Caption = 'Программа тестирования CashCode-SM' ClientHeight = 415 ClientWidth = 702 Color = clMedGray Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False ParentBiDiMode = False Position = poDefault Visible = True OnActivate = FormActivate PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 96 Top = 16 Width = 79 Height = 13 Caption = '№ серийный:' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [fsBold] ParentFont = False end object Label3: TLabel Left = 8 Top = 16 Width = 62 Height = 13 Caption = '№ партии:' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [fsBold] ParentFont = False end object Label2: TLabel Left = 192 Top = 16 Width = 123 Height = 13 Caption = 'Достоинство купюр:' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [fsBold] ParentFont = False end object Label4: TLabel Left = 512 Top = 224 Width = 177 Height = 49 Alignment = taRightJustify AutoSize = False BiDiMode = bdLeftToRight Caption = '0.00' Font.Charset = RUSSIAN_CHARSET Font.Color = clWindowText Font.Height = -48 Font.Name = 'Times New Roman' Font.Style = [fsBold] ParentBiDiMode = False ParentFont = False Layout = tlCenter end object Label5: TLabel Left = 585 Top = 288 Width = 105 Height = 49 Alignment = taRightJustify AutoSize = False Caption = '0' Font.Charset = RUSSIAN_CHARSET Font.Color = clWindowText Font.Height = -48 Font.Name = 'Times New Roman' Font.Style = [fsBold] ParentFont = False Layout = tlCenter end object Label6: TLabel Left = 376 Top = 227 Width = 121 Height = 46 Alignment = taRightJustify AutoSize = False BiDiMode = bdLeftToRight Caption = 'Сумма:' Font.Charset = RUSSIAN_CHARSET Font.Color = clWindowText Font.Height = -32 Font.Name = 'Times New Roman' Font.Style = [fsBold] ParentBiDiMode = False ParentFont = False Layout = tlCenter end object Label7: TLabel Left = 218 Top = 296 Width = 281 Height = 41 Alignment = taRightJustify AutoSize = False BiDiMode = bdLeftToRight Caption = 'Количество купюр:' Font.Charset = RUSSIAN_CHARSET Font.Color = clWindowText Font.Height = -32 Font.Name = 'Times New Roman' Font.Style = [fsBold] ParentBiDiMode = False ParentFont = False Layout = tlCenter end object Label8: TLabel Left = 586 Top = 351 Width = 105 Height = 50 Alignment = taRightJustify AutoSize = False Caption = '0' Font.Charset = RUSSIAN_CHARSET Font.Color = clWindowText Font.Height = -48 Font.Name = 'Times New Roman' Font.Style = [fsBold] ParentFont = False Layout = tlCenter end object Label9: TLabel Left = 221 Top = 356 Width = 281 Height = 45 Alignment = taRightJustify AutoSize = False BiDiMode = bdLeftToRight Caption = 'Номинал купюры:' Font.Charset = RUSSIAN_CHARSET Font.Color = clWindowText Font.Height = -32 Font.Name = 'Times New Roman' Font.Style = [fsBold] ParentBiDiMode = False ParentFont = False Layout = tlCenter end object Label10: TLabel Left = 376 Top = 16 Width = 143 Height = 13 Caption = 'Трассировка запросов:' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [fsBold] ParentFont = False end object Button3: TButton Left = 192 Top = 64 Width = 177 Height = 25 Caption = 'Принимаемые купюры' TabOrder = 0 OnClick = Button3Click end object Button4: TButton Left = 8 Top = 128 Width = 177 Height = 25 Caption = 'Получить статус' TabOrder = 1 OnClick = Button4Click end object Button5: TButton Left = 192 Top = 160 Width = 177 Height = 25 Caption = 'Выключение' TabOrder = 2 OnClick = Button5Click end object Button6: TButton Left = 192 Top = 96 Width = 177 Height = 25 Caption = 'Старт POLL' TabOrder = 3 OnClick = Button6Click end object Memo1: TMemo Left = 376 Top = 32 Width = 313 Height = 185 ScrollBars = ssVertical TabOrder = 4 end object Button7: TButton Left = 192 Top = 128 Width = 177 Height = 25 Caption = 'Стоп POLL' TabOrder = 5 OnClick = Button7Click end object Button8: TButton Left = 8 Top = 96 Width = 177 Height = 25 Caption = 'Перезагрузка' TabOrder = 6 OnClick = Button8Click end object Button9: TButton Left = 8 Top = 64 Width = 177 Height = 25 Caption = 'Инициализация' TabOrder = 7 OnClick = Button9Click end object Edit6: TEdit Left = 8 Top = 32 Width = 81 Height = 21 BevelOuter = bvNone BiDiMode = bdLeftToRight Color = clScrollBar Font.Charset = DEFAULT_CHARSET Font.Color = clWindowFrame Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Pitch = fpFixed Font.Style = [fsBold] ParentBiDiMode = False ParentFont = False TabOrder = 9 end object Edit7: TEdit Left = 96 Top = 32 Width = 89 Height = 21 BevelOuter = bvSpace BiDiMode = bdLeftToRight Color = clScrollBar Ctl3D = True Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [fsBold] ParentBiDiMode = False ParentCtl3D = False ParentFont = False TabOrder = 8 end object Button10: TButton Left = 8 Top = 160 Width = 177 Height = 25 Caption = 'Режим ожидания купюры' TabOrder = 10 OnClick = Button10Click end object Edit8: TEdit Left = 192 Top = 32 Width = 177 Height = 21 BiDiMode = bdLeftToRight CharCase = ecLowerCase Color = clScrollBar Ctl3D = True Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [fsBold] ParentBiDiMode = False ParentCtl3D = False ParentFont = False TabOrder = 11 end object ComboBox1: TComboBox Left = 8 Top = 192 Width = 177 Height = 21 Style = csDropDownList ItemHeight = 13 ItemIndex = 0 TabOrder = 12 Text = 'Com1:' OnChange = ComboBox1Change Items.Strings = ( 'Com1:' 'Com2:' 'Com3:' 'Com4:' 'Com5:' 'Com6:' 'Com7:') end end
-
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit2;
type TForm1 = class(TForm) Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; Button8: TButton; Button9: TButton; Edit6: TEdit; Edit7: TEdit; Label1: TLabel; Label3: TLabel; Button10: TButton; Memo1: TMemo; Edit8: TEdit; Label2: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; ComboBox1: TComboBox; procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Button10Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure ComboBox1Change(Sender: TObject);
private { Private declarations } public { Public declarations } TPotok : Potok; procedure UpdateSumm; end; // объява длл функций //procedure PDConnect(Var ComPortss : String); StdCall; //procedure PDDisConnect; StdCall; //procedure PDPoll; StdCall; //procedure PDStopPoll(var StopPolle : Boolean); StdCall; //function LastSumm:integer; StdCall; const ConReACK : array[1..6] of Byte = ($02,$03,$06,$00,$C2,$82); ConReset : array[1..6] of Byte = ($02,$03,$06,$30,$41,$B3); ConGetSt : array[1..6] of Byte = ($02,$03,$06,$31,$C8,$A2); ConStPoll: array[1..6] of Byte = ($02,$03,$06,$33,$DA,$81); ConIdent : array[1..6] of Byte = ($02,$03,$06,$37,$FE,$C7); ConGetBT : array[1..6] of Byte = ($02,$03,$06,$41,$4F,$D1); ConStack : array[1..6] of Byte = ($02,$03,$06,$35,$EC,$E4); ConReturn: array[1..6] of Byte = ($02,$03,$06,$36,$77,$D6); ConHold : array[1..6] of Byte = ($02,$03,$06,$38,$09,$3F); ConExtBD : array[1..6] of Byte = ($02,$03,$06,$3A,$1B,$1C); ConReqSt : array[1..6] of Byte = ($02,$03,$06,$60,$C4,$E1); ConEnBT : array[1..12] of Byte = ($02,$03,$0C,$34,$FF,$FF,$FF,$00,$00,$00,$B5,$C1); ConDiBT : array[1..12] of Byte = ($02,$03,$0C,$34,$00,$00,$00,$00,$00,$00,$17,$0C);
var Form1 : TForm1; ComPorts : string; ComFile : THandle; ReadAr : array[1..255] of byte; BytesWritten: DWORD; BytesRead : DWORD;
function ArrInStr(InDtn: array of byte; DatLng: dword) : string; // блок длл функций //procedure PDConnect; external 'CashCodeSM.dll' name 'PDConnect'; //procedure PDDisConnect; external 'CashCodeSM.dll' name 'PDDisConnect'; //procedure PDPoll; external 'CashCodeSM.dll' name 'PDPoll'; //procedure PDStopPoll; external 'CashCodeSM.dll' name 'PDStopPoll'; //function LastSumm; external 'CashCodeSM.dll' name 'LastSumm'; // implementation
{$R *.dfm}
// Массив в строку function ArrInStr(InDtn: array of byte; DatLng: dword) : string; var s: integer; begin Result := ''; for s:=0 to (DatLng-1) do Result := Result+IntToStr(InDtn[s])+' '; end;
//Раскладка в строку function ASCIIToStr(AsciiString: string): string; var I, X, L, Lastpos: Integer; CurDIGChar, CurrAddChar, RS: string;
begin RESULT := ''; L := Length(AsciiString); if L = 0 then Exit; X := 0; LASTPOS := 1; repeat I := X; CurDIGChar := ''; repeat I := I + 1; if AsciiString[I] <> '#' then CurDIGChar := CurDIGChar + AsciiString[I]; until (AsciiString[I] = '#') or (i = l); X := I; if CurDIGChar <> '' then begin try CurrAddChar := CHR(STRTOINT(CurDIGChar)); except CurrAddChar := ''; end; Insert(CurrAddChar, RS, lastpos); LastPos := LastPos + Length(CurrAddChar); end; until (X >= L) or (I >= L); Result := RS; end;
// OpenCOMPort function OpenCOMPort: Boolean; var DeviceName: array[0..80] of Char; begin StrPCopy(DeviceName, ComPorts); ComFile := CreateFile(DeviceName, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if ComFile = INVALID_HANDLE_VALUE then Result := False else Result := True; end;
// SetupCOMPort function SetupCOMPort: Boolean; const RxBufferSize = 256; TxBufferSize = 256; var DCB: TDCB; CommTimeouts: TCommTimeouts;
begin Result := True; if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then Result := False; if not GetCommState(ComFile, DCB) then Result := False; DCB.BaudRate:=9600; DCB.ByteSize:=8; DCB.Parity:=noparity; DCB.StopBits:=ONESTOPBIT; DCB.Flags:=DTR_CONTROL_ENABLE; if not SetCommState(ComFile, DCB) then Result := False; with CommTimeouts do
begin ReadIntervalTimeout := 400; ReadTotalTimeoutMultiplier := 0; ReadTotalTimeoutConstant := 400; WriteTotalTimeoutMultiplier := 0; WriteTotalTimeoutConstant := 400; end;
if not SetCommTimeouts(ComFile, CommTimeouts) then Result := False; end;
// продолжение следует...
-
// продолжение... function ReadText: string; var i: integer; begin if ComFile = INVALID_HANDLE_VALUE then raise Exception.Create('Не открыта запись в Com порт'); if ReadFile(ComFile, ReadAr, SizeOf(ReadAr), BytesRead, nil) then begin for i := 1 to BytesRead do Result := Result+IntToStr(ReadAr[i])+' '; end else raise Exception.Create('Ошибка приема данных:'); end;
// CloseCOMPort procedure CloseCOMPort; begin CloseHandle(ComFile); end;
// Перезагрузка procedure GetReset; begin WriteFile(ComFile, ConReset, SizeOf(ConReset), BytesWritten, nil); ReadFile(ComFile, ReadAr, SizeOf(ReadAr), BytesRead, nil); end;
// Инициализация procedure GetInisialise; var p: integer; ResP1 : string; ResP2 : string; ResP3 : string; ResP4 : string; begin WriteFile(ComFile, ConIdent, SizeOf(ConIdent), BytesWritten, nil); ReadFile(ComFile, ReadAr, SizeOf(ReadAr), BytesRead, nil); for p := 1 to BytesRead do begin if (p > 3) and (p < 15) then begin ResP1 := ResP1 + IntToStr(ReadAr[p])+'#'; ResP2 := ASCIIToStr(ResP1); end; if (p > 18) and (p < 31) then begin ResP3 := ResP3 + IntToStr(ReadAr[p])+'#'; ResP4 := ASCIIToStr(ResP3); end; end; Form1.Edit6.Text := ResP2; Form1.Edit7.Text := ResP4; Sleep(100); end;
// Получим номиналы купюр которые принимаем procedure GetNominal; var p: integer; ResP1, ResP2, ResP3, ResP4, ResP5, ResP6 : string; begin
WriteFile(ComFile, ConGetBT, SizeOf(ConGetBT), BytesWritten, nil); ReadFile(ComFile, ReadAr, SizeOf(ReadAr), BytesRead, nil); for p := 1 to BytesRead do begin if (p > 13) and (p < 19) then ResP1 := '10'; if (p > 18) and (p < 24) then ResP2 := '50'; if (p > 23) and (p < 29) then ResP3 := '100'; if (p > 28) and (p < 34) then ResP4 := '500'; if (p > 33) and (p < 39) then ResP5 := '1000'; if (p > 38) and (p < 44) then ResP6 := '5000'; end; Form1.Edit8.Text := ResP1 + ', ' + ResP2 + ', ' + ResP3 + ', ' + ResP4 + ', ' + ResP5 + ', ' + ResP6 ; end;
// Вход в режим опроса procedure GetPollStatys; begin WriteFile(ComFile, ConStPoll, SizeOf(ConStPoll), BytesWritten, nil); end;
// Выключение procedure GetShatDone; begin //PDDisConnect; // типа дял длл //работа без длл GetPollStatys; Sleep(10); WriteFile(ComFile, ConEnBT, SizeOf(ConEnBT), BytesWritten, nil); Sleep(10); ReadFile(ComFile, ReadAr, SizeOf(ReadAr), BytesRead, nil); Sleep(10); WriteFile(ComFile, ConDiBT, SizeOf(ConDiBT), BytesWritten, nil); Sleep(10); ReadFile(ComFile, ReadAr, SizeOf(ReadAr), BytesRead, nil); Sleep(10); end;
procedure TForm1.Button3Click(Sender: TObject); begin GetNominal; end;
procedure TForm1.Button4Click(Sender: TObject); begin GetPollStatys; end;
procedure TForm1.Button5Click(Sender: TObject); begin GetShatDone; end;
procedure TForm1.Button7Click(Sender: TObject); begin TPotok.Terminate; // добавил корректный тормоз потока //PDStopPoll(StopPoll); // длл WriteFile(ComFile, ConDiBT, SizeOf(ConDiBT), BytesWritten, nil); end;
procedure TForm1.UpdateSumm; // синхрониз begin Label4.Caption := IntToStr(SumBill)+'.00'; Label5.Caption := IntToStr(KolBill); Label8.Caption := IntToStr(LastBill); end;
procedure TForm1.Button6Click(Sender: TObject); begin //PDPoll; //для длл // стартуем поток по умному TPotok := Potok.Create(True); TPotok.FreeOnTerminate := True; TPotok.Priority := tpLower; TPotok.Resume; end;
procedure TForm1.Button8Click(Sender: TObject); begin GetReset; end;
procedure TForm1.Button9Click(Sender: TObject); begin GetInisialise; end;
// Режим ожидания купюры procedure TForm1.Button10Click(Sender: TObject); begin GetPollStatys; sleep(10); WriteFile(ComFile, ConEnBT, SizeOf(ConEnBT), BytesWritten, nil); end;
procedure TForm1.ComboBox1Change(Sender: TObject); begin CloseCOMPort; ComPorts := ComboBox1.Items.Strings[ComboBox1.ItemIndex]; OpenCOMPort; SetupCOMPort; GetReset; GetInisialise; GetNominal; end;
// При открытии формы Активируем порт и его установки procedure TForm1.FormActivate(Sender: TObject); begin ComPorts := ComboBox1.Items.Strings[0]; //PDConnect(ComPorts); // длл // работа без длл OpenCOMPort; SetupCOMPort; GetReset; GetInisialise; GetNominal; end;
end.
-
//Юнит-поток unit Unit2;
interface
uses Classes; type Potok = class(TThread) private { Private declarations } protected procedure Execute; override; end; var
SumBill : Integer; KolBill : Integer; LastBill : Integer;
implementation
uses Windows, SysUtils, Unit1;
{ Important: Methods and properties of objects in visual components can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure Potok.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; }
{ Potok }
procedure Potok.Execute; var i: integer; s: integer; p: integer; n: integer; ResP : string; begin
WriteFile(ComFile, ConIdent, SizeOf(ConIdent), BytesWritten, nil); Sleep(10); ReadFile(ComFile, ReadAr, SizeOf(ReadAr), BytesRead, nil); Sleep(10); i := 0; s := 0; n := 0;
repeat WriteFile(ComFile, ConReACK, SizeOf(ConReACK), BytesWritten, nil); Sleep(10); WriteFile(ComFile, ConStPoll, SizeOf(ConStPoll), BytesWritten, nil); Sleep(10); ReadFile(ComFile, ReadAr, SizeOf(ReadAr), BytesRead, nil); Form1.Memo1.Lines.Add('<-- '+ArrInStr(ReadAr, BytesRead)); if ReadAr[4] = 19 then Form1.Memo1.Lines.Add('** Инициализация **'); if ReadAr[4] = 25 then begin Form1.Memo1.Lines.Add('** Ожидаю купюру **'); WriteFile(ComFile, ConEnBT , SizeOf(ConEnBT) , BytesWritten, nil); Sleep(10); ReadFile (ComFile, ReadAr , SizeOf(ReadAr) , BytesRead , nil); Sleep(10); end; if ReadAr[4] = 21 then Form1.Memo1.Lines.Add('****** Акцепт *****'); if ReadAr[4] = 23 then Form1.Memo1.Lines.Add('******* Стэк ******'); for p := 1 to 5 do ResP := ResP+IntToStr(ReadAr[p]); if ResP = '2371292' then begin Form1.Memo1.Lines.Add('10 рублей'); i := i + 1; s := s + 10; n := 10; end; if ResP = '2371293' then begin Form1.Memo1.Lines.Add('50 рублей'); i := i + 1; s := s + 50; n := 50; end; if ResP = '2371294' then begin Form1.Memo1.Lines.Add('100 рублей'); i := i + 1; s := s + 100; n := 100; end; if ResP = '2371295' then begin Form1.Memo1.Lines.Add('500 рублей'); i := i + 1; s := s + 500; n := 500; end; if ResP = '2371296' then begin Form1.Memo1.Lines.Add('1000 рублей'); i := i + 1; s := s + 1000; n := 1000; end; if ResP = '2371297' then begin Form1.Memo1.Lines.Add('5000 рублей'); i := i + 1; s := s + 5000; n := 5000; end; if ResP = '23728101' then Form1.Memo1.Lines.Add('Не съедобно'); if ResP = '23728108' then Form1.Memo1.Lines.Add('Тоже не съедобно'); if ResP = '23728100' then Form1.Memo1.Lines.Add('Разверни бамажку'); Form1.Memo1.Lines.Add('<-- '+ResP); ResP := ''; SumBill := s; KolBill := i; LastBill := n; Synchronize(Form1.UpdateSumm); until Terminated;
Form1.Memo1.Lines.Add('** Тормозимся **');
WriteFile(ComFile, ConDiBT, SizeOf(ConDiBT), BytesWritten, nil); Form1.Memo1.Lines.Add('--> '+ArrInStr(ConDiBT, BytesWritten)); ReadFile(ComFile, ReadAr, SizeOf(ReadAr), BytesRead, nil); Form1.Memo1.Lines.Add('<-- '+ArrInStr(ReadAr, BytesRead));
WriteFile(ComFile, ConReACK, SizeOf(ConReACK), BytesWritten, nil); Form1.Memo1.Lines.Add('--> '+ArrInStr(ConReACK, SizeOf(ConReACK)));
WriteFile(ComFile, ConStPoll, SizeOf(ConStPoll), BytesWritten, nil); Form1.Memo1.Lines.Add('--> '+ArrInStr(ConStPoll, SizeOf(ConStPoll))); ReadFile(ComFile, ReadAr, SizeOf(ReadAr), BytesRead, nil); Form1.Memo1.Lines.Add('<-- '+ArrInStr(ReadAr, BytesRead)); end;
end.
-
Вот...
-
Алекс_ТК . Что то не понятно тут с кодами, может выложешь куда нибудь архивчмк с программой, например на ifolder.ru, иль будь добр на fullsux@mail.ru... В долгу не останусь... расчёты через Яндекс-деньги.
-
Вопрос для профи: как теперь вогнать вышеизложенное в длл... Столкнулся с проблемой извлечения значений переменных из потока...
-
Вот полные исходники для всех купюрников и принтеров.. только ковырятся надо: Полные исхоники программы Ciberplat http://www.technocode.ru/techno.htmlпароль по запросу на ridall@mail.ru
-
Есть C++ API и несколько примеров от производителя. Я писал на cachcode.com запрос и мне выслали исходники библиотеки (несколько исходных файлов, не собранных в проект) и хелп. Кому надо - мыльте, я перешлю.
А вообще я на .NET за пол дня весь протокол сделал. Ихний API имеет универсальный характер для всех типов устройств и очень накрученный. Надо его собирать в либу, потом делать враппер на .NET. Короче легкий путь споймать кучу багов :) Поэтому я не использовал. У кого проект на плюсах можете сразу в проект вставлять исходники библиотеки и наслаждаться :)
|