Um auf Deine
DLL Frage zurückzukommen:
In eine
DLL Schnitstelle gehören nur einfache Typen,
also z.B
Integer,
Word,
Double,
Single,
PWideChar,
PAnsiChar etc..
Auf keinen Fall normale Strings.
Records auch nur aus diesen Typen
Das hat den Vorteil das man Compilerunabhängig ist.
Wir benutzen das heftig in mixed Projekten (Delphi, VCC, und sogar noch Fortran)
Für Records (Structs) gilt dasselbe
also
z.B Delphi :
Delphi-Quellcode:
const
cwmaxnamesize = 30;
type
tApi_Materialrec = packed record
Name: array [0 .. cwmaxnamesize - 1] of Ansichar;
Group: array [0 .. cwmaxnamesize - 1] of Ansichar;
MatCode: array [0 .. cwmaxnamesize - 1] of Ansichar;
Mate1, mate2, mate3, matg1, matg2, matgew: single; // Materialgewicht
Mattyp: integer;
list_matbez,
mat_photoflag,
mat_photo1,
mat_photo2: integer;
end;
//C++
Code:
// Ausrichtung an Byte-Grenzen wegen Delphi
#pragma pack(push,1)
struct CHA_API_API Api_mat
{
char name[30], Group[30], MatCode[30];
float mate1,mate2,mate3, matg1,matg2,matgew;
int mattyp;
int list_matbez;
int photoflag, Photo1, Photo2;
};
Wenn Wir Interfaces benutzen gilt dasselbe.
einziger Unterschied ist das wir in Interface auch schon mal WideString benutzen,
da dort das Speichermanagement von Windows grift.
Funktionen geben niemals Records zurück sondern sind bei uns immer aufgebaut nach dem Schema:
function getMatDataforId(aid : Integer; var matrec : tApi_Materialrec) : Bool;
Das funktioniert bei uns soweit problemlos.