想请教一个问题:我在C中定义一个函数,返回一个结构体,
现在把它封装成DLL,让DELPHI调用,程序虽然可以正确运行,但结果不对,
但在C中调用是正确的,
不知道哪位高手能否详细指点?DLL结构体和例程如下:struct tstud
{
char code[8];
char name[12];
int age ;
};extern __stdcall __declspec(dllexport)
struct tstud *person(char *acode, char *aname,int aage)
{
struct tstud *tmpstud;
tmpstud = (struct tstud *)malloc(sizeof(struct tstud));
strcpy(tmpstud->code,acode);
strcpy(tmpstud->name,aname);
tmpstud->age = aage;
return tmpstud;
}
DELPHI调用如下:
type
//在DELPHI中声明与DLL中相同的结构体;
pstud = ^tstud;
tstud =record
code: string[8];
name: string[12];
age:integer;
end; tperson = function (acode,aname:string; age:integer): pstud; stdcall;
...
...
...procedure TForm1.Button1Click(Sender: TObject);
var
h: thandle;
code,name: pchar;
age: integer;
person: tperson;
mystud: pstud;
begin
code := '005';
name := 'xbdfe';
age := 100; h := loadlibrary('mydll.dll');
@person := getprocaddress(h,'person');
mystud := person(pchar(code),pchar(name),age); edit1.Text := mystud.code ; //运行后结果为"05"
edit2.Text := mystud.name ; //运行后结果为"dfe"
edit3.Text := inttostr(mystud.age) ;//运行后结果为 -1414812757
freelibrary(h);
end;
现在把它封装成DLL,让DELPHI调用,程序虽然可以正确运行,但结果不对,
但在C中调用是正确的,
不知道哪位高手能否详细指点?DLL结构体和例程如下:struct tstud
{
char code[8];
char name[12];
int age ;
};extern __stdcall __declspec(dllexport)
struct tstud *person(char *acode, char *aname,int aage)
{
struct tstud *tmpstud;
tmpstud = (struct tstud *)malloc(sizeof(struct tstud));
strcpy(tmpstud->code,acode);
strcpy(tmpstud->name,aname);
tmpstud->age = aage;
return tmpstud;
}
DELPHI调用如下:
type
//在DELPHI中声明与DLL中相同的结构体;
pstud = ^tstud;
tstud =record
code: string[8];
name: string[12];
age:integer;
end; tperson = function (acode,aname:string; age:integer): pstud; stdcall;
...
...
...procedure TForm1.Button1Click(Sender: TObject);
var
h: thandle;
code,name: pchar;
age: integer;
person: tperson;
mystud: pstud;
begin
code := '005';
name := 'xbdfe';
age := 100; h := loadlibrary('mydll.dll');
@person := getprocaddress(h,'person');
mystud := person(pchar(code),pchar(name),age); edit1.Text := mystud.code ; //运行后结果为"05"
edit2.Text := mystud.name ; //运行后结果为"dfe"
edit3.Text := inttostr(mystud.age) ;//运行后结果为 -1414812757
freelibrary(h);
end;
{
char code[8];
char name[12];
int age ;
}; //在DELPHI中声明与DLL中相同的结构体;
pstud = ^tstud;
tstud =record
code: string[8];//將其換成code : array[0..8]of char;
name: string[12];//將其換成name: array[0..12] of char;
age:integer;
end;
{
char code[8];
char name[12];
int age ;
};转换成 Delphi 声明:type
PStud = ^TStud;
TStud = packed record
Code: array[0..7] of Char;
Name: array[0..11] of Char;
Age: Integer;
end; TFuncPerson = function(ACode, AName: PChar; Age: Integer): PStud; stdcall;注:
C++ 的程序 person 里没有提供释放内存的函数, 会产生内存泄漏;
而且程序直接使用 strcpy 函数, 会产生内存地址越界的隐患!!!