这样做:
1、按照正常的写法完成你的类;
2、对于类中的所有的公有函数和过程都要使用虚方法;
3、类的初始化只能在DLL中实现;
4、由于Delphi的字符串与Windows的字符串之间的不兼容情况,类中公有的函数返回值尽量不要使用String类型,可以使用短字符串代替。
5、为了防止从DLL以外初始化类,建议使用预处理命令进行保护。你的程序应该这样:
function Init: TFHBL;stdcall; external 'project1.dll';DLL:library Project1;uses
  SysUtils,
  Classes,
  Unit2 in '..\Cls_Test\Unit2.pas',{$R *.res}exports
  Init;end.unit Unit2;interfaceType TABC = Class
  public
    function Save: Boolean; virtual; Stdcall; //*****
end;var
  ABC: TABC;function Init: TABC; stdcall;implementationfunction Init: TABC;
begin
  Result := TABC.Create;
end;
你的程序的另一个错误是,在调用程序中要:Uses Unit2;
另外还要声明:function Init: TABC; stdcall; External "Project1.DLL"如果还有问题,可以通过CSDN的短消息于我联系!!!

解决方案 »

  1.   

    gz and study  引用的时候首先要有类声明才行,或者就像楼上所说uses unit2,不过这样似乎....呵呵.建议,写一个接口,单独放在一个单元中. dll中的类实现接口.
    调用的程序,引用此接口,这样条理就清晰多了.
      

  2.   

    这样:
    建立一个接口单元
    Unit ABCIntf;
    定义
      //当然也可以使用接口
      TABCBase=Class
        //定义的细节略 
        //在DLL中实现的方法定义为纯虚的virtual; abstract;
        ....
      public 
        function Save: Boolean;virtual; abstract;
      end;在DLL工程中:library Project1;uses
      SysUtils,
      Classes,
      Unit2 in '..\Cls_Test\Unit2.pas',{$R *.res}exports
      Init;end.unit Unit2;
    uses ABCIntf
    interfaceType TABC = Class(TABCBase)
      public
        function Save: Boolean;override; //*****
    end;var
      ABC: TABC;function Init: TABCBase; stdcall;implementationfunction Init: TABC;
    begin
      Result := TABC.Create;
    end;
    使用
    uses ABCIntf;
    function Init:TABCBase;external 'Project1.dll';特别注意:
       假如你的函数的返回值或参数中使用了String那么在你的DLL和应用工程中的第一个引用单元一定要包含ShareMem。甚至你的类中使用了string也是如此。
       这样,你的工程就依赖于BorlandMM.dll了!记者一起分发!