我把一个过程写到dll。delphi调用了 无效果,求教,那里错了1动态链接库文件
library tbzsjdll;
{$DEFINE tbzsjdll}
uses
  SysUtils,
  Classes,
 tbzsjint in 'tbzsjint.pas';  procedure proc_tbzsj(j:TDateTime;m:Integer;o:Integer); StdCall;
   var
   bzsj,tbzsj ,bz:tdatetime;
   t:integer;
         begin
             bzsj:=j+m/24/60;
           tbzsj:=j+m/24/60+o/24/60;
            bz:=j+o/24/60;
          end;
      end;{ Export the function by name }
exports
 proc_tbzsj;
end.2接口文件
unit tbzsjint;
interface
type  Ttbzsj= record
   bzsj,tbzsj ,bz:tdatetime;
   t:integer;
     end;
     {$IFNDEF PENNIESLIB}
{ Declare function with export keyword }  procedure  proc_tbzsj(j:TDateTime;m:Integer;o:Integer); StdCall;
{$ENDIF}implementation{$IFNDEF PENNIESLIB}
{ Define the imported function }
procedure  proc_tbzsj; external 'tbzsjdll.DLL'  name 'proc_tbzsj';
{$ENDIF}end.3主程序(调用dll)
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
   implementation{$R *.dfm}
 uses  tbzsjint;
procedure TForm1.Button1Click(Sender: TObject);
varr:Ttbzsj;
begin proc_tbzsj(now,20,5);
Label1.caption:=formatdatetime('yyyy-mm-dd hh:mm:ss',r.tbzsj);end;end.

解决方案 »

  1.   

    代码语法没有什么错误,只能说是能够编译,可是你的DLL只是在内部算了一下,结果没有返回到接口文件中变量啊,有什么意义,活着要做有意义的事儿啊
      

  2.   

    顺便说两句:
    1、这么简单的函数有没有必要用到一个接口文件,当然除非你确实需要返回一个自定义的类
    2、如果调用不频繁的话,最好改为动态调用DLL
      

  3.   

    DLL:library tbzsjdll;uses
      SysUtils,
      Classes,
      tbzsjint in 'tbzsjint.pas';{$R *.res}function proc_tbzsj(j: tdatetime; m: integer; o: integer): Ttbzsj; StdCall;
    var
      r: Ttbzsj;
      t: integer;
    begin
      r.bzsj := j + m / 24 / 60;
      r.tbzsj := j + m / 24 / 60 + o / 24 / 60;
      r.bz := j + o / 24 / 60;
      Result := r;
    end;exports
      proc_tbzsj;end.Interfaceunit tbzsjint;interfacetype  Ttbzsj = record
        bzsj, tbzsj, bz: tdatetime;
        t: integer;
      end;
    function proc_tbzsj(j: tdatetime; m: integer; o: integer): Ttbzsj; StdCall;
    implementation{$IFNDEF PENNIESLIB}
    { Define the imported function }
    function proc_tbzsj; external 'tbzsjdll.DLL' name 'proc_tbzsj';
    {$ENDIF}end.Main program:uses tbzsjint;procedure TForm1.Button1Click(Sender: TObject);
    var
      r: Ttbzsj;
    begin
      r := proc_tbzsj(now, 20, 5);
      Label1.caption := formatdatetime('yyyy-mm-dd hh:mm:ss', r.tbzsj);
    end;
      

  4.   

    概念性错误,过程没有返回值,相当于C++返回void一样
    但可以在过程参数中定义,比如你的例子中可以定义为:
    procedure proc_tbzsj(j: tdatetime; m: integer; o: integer; var r Ttbzsj);
    不知我解释清楚了没有?
    另外用过程这种方式可以输出多个结果,不像function只能有一个返回值,function若想返回多个值就要定义类或者返回数组。
    希望我的回复可以帮到你。
      

  5.   

    procedure proc_tbzsj(j: tdatetime; m: integer; o: integer; var r: Ttbzsj);
    少打了冒号,呵呵
      

  6.   

    呵呵,你的过程好像没有改变什么,就算调用正确了,你也不知道。最好成功给个信号如showMessage,或者做成功能function吧,弄个返回值。