Re: Вызов функции из DLL (DLL на Dephi)
От: AlexFilan  
Дата: 02.05.11 20:19
Оценка:
Вот что получилось:
#pragma pack(push)
#pragma pack(1)

typedef struct TInfo {
  int Open;
  char *SerNo;
  char *Curr;
  char *Currs;
  char *Opers;
};

typedef struct TParam { 
  uchar Cmd;
  char *Sm;
  char *Cr;
  char *Tr2;
  char *Add;
};

typedef struct TResult {
  uchar Code;
  uchar State;
  char *Summa;
  char *Card;
  char *Currency;
  char *RefNo;
  char *DateTime;
  char *TerminalId;
  char *CheckNo;
  char *AutCode;
  char *HostCode;
  char *HostText;
  char *ExparyDate;
  ulong Trans_Op;
  char *TLV_Block;
};

#pragma pack(pop)

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

int main(int argc, char* argv[]) {

  HMODULE hLib = LoadLibrary("srv.dll");
  if (!hLib) return 0;

  GetData funcGetData = (GetData)GetProcAddress(hLib, "GetData");
  if (!funcGetData) return 0;

  TInfo info;
  info.SerNo    = (char*)malloc(13);
  info.Curr    = (char*)malloc(4);
  info.Currs    = (char*)malloc(24);
  info.Opers    = (char*)malloc(64);

  funcGetData(&info);

  free(info.SerNo);
  free(info.Curr);
  free(info.Currs);
  free(info.Opers);

  Func func = (Func)GetProcAddress(hLib, "Func");
  if (!func) return 0;

  TParam p;
  p.Code    = 0x2A;
  p.Summa    = (char*)malloc(13);
  p.Currency    = (char*)malloc(4);
  p.Track2    = (char*)malloc(48);
  p.AddInfo    = (char*)malloc(184);
  strcpy(p.Summa, "100");
  strcpy(p.Currency, "");
  strcpy(p.Track2, "");
  strcpy(p.AddInfo, "");

  TResult r;
  r.Summa    = (char*)malloc(13);
  r.Card    = (char*)malloc(48);
  r.Currency    = (char*)malloc(4);
  r.RefNo    = (char*)malloc(13);
  r.DateTime    = (char*)malloc(20);
  r.TerminalId    = (char*)malloc(9);
  r.CheckNo    = (char*)malloc(6);
  r.AutCode    = (char*)malloc(7);
  r.HostCode    = (char*)malloc(3);
  r.HostText    = (char*)malloc(33);
  r.ExparyDate    = (char*)malloc(5);
  r.TLV_Block    = (char*)malloc(130);

  func(4, p, &r);

  ...

  FreeLibrary(hLib);

  return 0;
}


Вызов Функции func по прежнему не проходит.
Но вызов функции GetData происходит корректно. Вот ее паскалевское описание:

FUNCTION NAME: GetData 

type TInfo = record 
  Open   : Boolean;
  SerNo  : PChar;  {12+1 байт} 
  Curr   : PChar;  {3+1 байт} 
  Currs  : PChar;  {max 24 байт} 
  Opers  : PChar;  {max 64 байт} 
end; 

Function GetData (var Info:TInfo):Byte;stdcall;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.