Dll的制作问题(0分)

  • 主题发起人 主题发起人 xiaoguoch
  • 开始时间 开始时间
X

xiaoguoch

Unregistered / Unconfirmed
GUEST, unregistred user!
是否可以用Dll导出类,并且可以创建实例象普通的类那样操作?我看到一些可以制作导出类的DLL的方式,但是都不合要求,根本无法象普通的类那样操作!
 
可以用interface来实现,在dll的导出类中返回创建这个引用类接口的Pointer,就可以正常的使用了。前提是你必须在引用dll文件的project中uses 这个interface的结构声明。
 
我也在一些资料上看到的方法跟楼上的说的差不多!
但是现在我要导出的类在创建时需要根据外界传入的参数来创建,还有在类定义的时候声明了它的一些property.不知可以实现否.我根据前面的方式尝试了一下,但是没有成功!
如果楼上的大侠认为可以实现的话,可否告知如何实现,如果有Demo就更好!
 
这是我以前写的一个MSN插件类,实现dll导出类的功能。你看一下
我去掉了不必要的代码只留下一个框架。
unit Plug_In;

interface
uses
SysUtils,Classes,Contnrs,
Windows;

type
PPlug_Info=^TPlug_Info;
TPlug_Info=packed record
Author:PChar;
PlugVer:PChar;
Other:PChar;
KeyWord:PChar;//;
PlugName:PChar;
OtherProc:PChar;
ServerType:PChar;
end;


IMsnPlug=interface
procedure ShowAbout;
function GetPlugInfo:PPlug_Info;
function GetContents(KeyWord:PChar):PChar;
end;


TGetPlug=function:IMsnPlug;stdcall;
TAnothermethod=procedure(FOwner:HWND);stdcall;

TPlugManager=class
Private
FPlugList:TObjectList;
FPlugName:TStrings;
FGetPlug:TGetPlug;
procedure GetPlugName;
Protected

Public
function PlugInfo(PlugNo:Integer):TPlug_Info;
function Plug(PlugNo:Integer):IMsnPlug;
procedure LoadPlug(const Plug_Dir:string);
property PlugList:TObjectList Read FPlugList Write FPlugList;
procedure PlugProc(const PlugNo:Integer;const ProcName:PChar;H:HWND);
property PlugName:TStrings read FPlugName write FPlugName;
constructor Create;
destructor Destroy;
Override;
end;


implementation

{ PlugManager }

constructor TPlugManager.Create;
begin

FPlugList:=TObjectList.Create(False);
FPlugName:=TStringList.Create;
end;


destructor TPlugManager.Destroy;
var
i:Integer;
begin

if FPlugList.Count<>0 then

for i:=0 to FPlugList.Count-1do

FreeLibrary(Cardinal(FPlugList));
FreeAndNil(FPlugList);
FreeAndNil(FPlugName);
inherited Destroy;
end;


procedure TPlugManager.GetPlugName;
var
i,j:Integer;
begin

FPlugName.Clear;
i:=FPlugList.Count;
if i<>0 then

begin

Dec(i);
for j:=0 to ido

begin

FPlugName.Add(PlugInfo(j).PlugName);
end;

end;

end;


procedure TPlugManager.LoadPlug(const Plug_Dir:string);
var
FRec:TSearchRec;
Rec:Integer;
PN:string;
begin

FPlugList.Clear;
Rec:=FindFirst(Plug_Dir+'/*.pus',faAnyFile,FRec);
while not Boolean(Rec)do

begin

PN:=Plug_Dir+'/'+FRec.Name;
FPlugList.Add(TObject(LoadLibrary(PChar(PN))));
Rec:=FindNext(FRec);
end;

GetPlugName;

end;


//这个fun导出就可实现导出类 <-请看这里
function TPlugManager.Plug(PlugNo:Integer):IMsnPlug;
begin

Result:=TGetPlug(GetProcAddress(Cardinal(FPlugList[PlugNo]),'GetPlug'));
end;


function TPlugManager.PlugInfo(PlugNo:Integer):TPlug_Info;
begin

try
Result:=TGetPlug(GetProcAddress(Cardinal(FPlugList[PlugNo]),'GetPlug')).GetPlugInfo^;
except
//
end;

end;


procedure TPlugManager.PlugProc(const PlugNo:Integer;const ProcName:PChar;H:HWND);
begin

try
TAnothermethod(GetProcAddress(Cardinal(FPlugList[PlugNo]),ProcName))(H);
except
//
end;

end;


end.
 
to Rainstorey:
非常感谢!
我研究一下先!是否方便留一个联系方式,便于以后向你请教?
 
还是不怎么明白:
//这个fun导出就可实现导出类 <-请看这里
function TPlugManager.Plug(PlugNo:Integer):IMsnPlug;
begin

Result:=TGetPlug(GetProcAddress(Cardinal(FPlugList[PlugNo]),'GetPlug'));
end;

问题1: GetProcAddress(Cardinal(FPlugList[PlugNo]),'GetPlug')得到的是名为GetPlug
过程的地址指针,然后强制转换为接口类,综合
procedure(TPlugManager.LoadPlug(const Plug_Dir:string);问:把什么类转换
为导出类接口?好像不是TPlugManager这个类吧?
问题2: 调用dll后生成的类的实例是否可以使用此类的方法?
 
当然可以导出类
 
to zhankaien:
可否说说实现方法?
 
还是无法从dll中导出类!哪位大侠帮帮忙.........help me!!!!!!!!!!!!
注: 不仅要可以根据导出的类创建实例,对类的属性赋值, 还要可以使用类的方法!
究竟能不能实现???
 
导出类用COM
 
接受答案了.
 
后退
顶部