Вот что получилось:
#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;