这样做:
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、按照正常的写法完成你的类;
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的短消息于我联系!!!
调用的程序,引用此接口,这样条理就清晰多了.
建立一个接口单元
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了!记者一起分发!