Przetłumaczenie kodu obsługi DLL z C++ na Delphi

0

Witam wszystkich mam problem z przetłumaczeniem wywołania dll-a napisanego w C++ na delphi.

      BYTE data[16*3];
      int ret;
      int g_block;

      ret = RayoReadSectorData(g_block, data, 16*3, 0, 10) ;

próbowałem tak

TData = array of byte;
pData = ^TData;

  function RayoReadSectorData(block:BYTE; Data: pData; len:BYTE; CardType:BYTE; time:longint):longint;stdcall; external _DLL_NAME_1;
0

Raczej zamiast
Data: pData;
raczej
var Data;

wywołanie

var
  lData: array[0..47] of Byte;
  lres, lBlock: Integer;
begin
... 
  lres := RayoReadSectorData(lBlock, lData[0], 16 * 3, 0, 10);
...
2
type
  PData = ^TData;
  TData = array [16 * 3] of Byte;
function RayoReadSectorData(ABlock: LongInt; AData: PData; ALen, ACardType, ATime: LongInt): LongInt; stdcall; external _DLL_NAME_1;

Obstawiam, że tak to powinno wyglądać, bo parametry typu Byte wcale mi tutaj nie pasują. Użycie:

var
  Data: TData;
  Ret, Block: Integer;
begin
  // wypełnienie zmiennych danymi

  Ret := RayoReadSectorData(Block, @Data, 16 * 3, 0, 10);
0

@piars a możesz podać jak ta funkcja jest w C++ dokładnie zdeklarowana?

0
RAYOAPI int WINAPI RayoReadSectorData(
                             BYTE block, //absolute block number
                             PBYTE pData, //Returned data, 3 blocks of data (16*3)
                             BYTE len,//data length
                             BYTE CardType,//Type of card, 0 ordinary card, 1 authorization card, 0xff white card
                             Int time//attempts
                             );
0

W takim razie poniższe powinno pasować:

function RayoReadSectorData(ABlock: Byte; AData: PByte; ALen, ACardType: Byte; ATime: LongInt): LongInt; stdcall; external _DLL_NAME_1;
0

No właśnie nie pasuje ... funkcja zwraca zero ale "AData" za każdym razem jest innej wartości

0

Pokaż w jaki sposób używasz tej funkcji – jakie dane przekazujesz i w jaki sposób.

Sama funkcja jest poprawnie przetłumaczona – typy się zgadzają, kolejność też, konwencja wywołania raczej również (choć zawsze możesz spróbować z inną, np. cdecl).

0

próbowałem stdcall i cdecl i nic to nie daje ... wiem co to znaczy ale nie działa :(

TData = array of byte;
pData = ^TData;

FRetData : pData;



var  
//  FRetData : pdata;//array[0..2, 0..15] of byte;
  RetData : array[0..2, 0..15] of byte;
  CardType, time, block, ret :Integer;
  s:string;
begin
//  Memo1.Lines.Clear;
  //
  ret := RayoOpenHotelReader(0);
  memo1.Lines.Add('RayoOpenHotelReader: result=' + GetErrName(ret));
  //
  FRetData := nil;
  GetMem(FRetData, 16*3);
  //FillChar(FRetData, SizeOf(FRetData),#0);
  block:=48;//g_block;
  CardType:=0;
  time:=10;

  ret:=RayoReadSectorData(block, FRetData, 16*3, CardType, time);       // tu teoretycznie jest 0 czyli ok

  memo1.Lines.Add('RayoReadSectorData: result=' + GetErrName(ret));
  memo1.Lines.Add('data:'+ BytesToString(RetData[0]));
  memo1.Lines.Add('data:'+ BytesToString(RetData[1]));
  memo1.Lines.Add('data:'+ BytesToString(RetData[2]));

0

„Nie działa” to nie jest sensowny opis problemu! Poza tym straszny bajzel masz w tym kodzie.

type
  TData = array [0 .. 2, 0 .. 15] of Byte;
var
  Data: TData;
  Block, CardType, Time, Ret: Integer;
begin
  FillChar(Data[0, 0], SizeOf(TData), 0);
  Ret := RayoReadSectorData(48, @Data[0, 0], SizeOf(TData), 0, 10);

Sprawdź pod debuggerem co się dzieje – obstawiam, że macierz nie jest prawidłowo wypełniana danymi. Jeśli w ten sposób nie zadziała prawidłowo to albo wartości podawane w parametrach są nieprawidłowe, albo problem leży gdzieś indziej.

0

0

Użyj tego nagłówka:

function RayoReadSectorData(ABlock: Byte; AData: PByte; ALen, ACardType: Byte; ATime: LongInt): LongInt; stdcall; external _DLL_NAME_1;

i tego kodu:

type
  TData = array [0 .. 2, 0 .. 15] of Byte;
var
  Data: TData;
  Block, CardType, Time, Ret: Integer;
begin
  FillChar(Data[0, 0], SizeOf(TData), 0);
  Ret := RayoReadSectorData(48, @Data[0, 0], SizeOf(TData), 0, 10);

Nie powinno wyrzucać żadnego błędu kompilacji – sprawdziłem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1