想请教一个问题:我在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;

解决方案 »

  1.   

    struct tstud
    {
      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;
      

  2.   

    struct tstud
    {
      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 函数, 会产生内存地址越界的隐患!!!