Вызов функции из DLL (DLL на Dephi)
От: AlexFilan  
Дата: 02.05.11 14:34
Оценка:
Помогите разобраться с вызовом функции.
Есть длл-ка на Delphi, возникла трудность с вызовом именно одной функции, которая принимает в качестве параметров структуры.

{TParam - Входные данные следующей структуры:}
type TParam = record  
  Cmd   :Byte;
  Sm    :PChar;
  Cr    :PChar; {3+1 байт, если '', то по умолчанию} 
  Tr2   :PChar; {если '',то не учитывается, max 48 байт} 
  Add   :PChar; {если nil или '', то не учитывается. Max 184 байт} 
end; 

{TResult – Выходные данные следующей структуры:}
type TResult = record  
  Cmd   :Byte;
  St    :Byte;
  Sm    :PChar; {12+1 байт}
  Cd    :PChar; {max 48 байт}
  Cr    :PChar; {3+1 байт}
  RN    :PChar; {12+1 байт}
  DT    :PChar; {19+1 байт}
  TI    :PChar; {8+1 байт}
  CN    :PChar; {5+1 байт}
  AC    :PChar; {6+1 байт}
  HC    :PChar; {2+1 байт}
  HT    :PChar; {32+1 байт}
  ED    :PChar; {4+1 байт}
  TO    :DWord; 
  TLV   :PChar; {129+1 байт}
end;

Function Func(p1:Byte; var p: TParam; var r: TResult) : Byte; stdcall;


Вот как я вызываю функцию:


typedef struct TParam {
  uchar Cmd;
  char Sm[13];
  char Cr[4];
  char Tr2[48];
  char Add[184];
};

typedef struct TResult {
  uchar Cmd;
  uchar St;
  char Sm[13];
  char Cd[48];
  char Cr[4];
  char RN[13];
  char DT[20];
  char TI[9];
  char CN[6];
  char AC[7];
  char HC[3];
  char HT[33];
  char ED[5];
  ulong TO; 
  char TLV[130];
};

extern "C" {
  typedef uchar __declspec(dllimport)(__stdcall *Func)(uchar ver, TParam, TResult*);
}

...

TParam p;
p.Cmd = 0x20;
strcpy(p.Sm, "100");
strcpy(p.Cr, "");
strcpy(p.Tr2, "");
strcpy(p.Add, "");

TResult r;

uchar ret = lib.Func(4, p, &r); {здесь вываливается}

...

uchar Lib::Func(uchar ver, TParam p, TResult* r) {
  Func function = (Func)lib.resolve("Func");
  if( function) {
    return function(ver, p, r);
  }
  return -1;
}


Как правильно переписать эти структуры на С++, что бы они были съедобны для DLL?
Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.