DLL 处理问题,特难的!!!(30分)

  • 主题发起人 主题发起人 netwinds
  • 开始时间 开始时间
N

netwinds

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好!
我是一外DELPHI的入门者,现碰到一个问题,想请大家帮个忙。
我以前是学VB的,学得还不错。后来转到DELPHI来,现在在学做DLL文件,但碰到一些问题:
1、为什么DELPHI中的DLL文件,不能象VB中那样,只要声明一下一个实例,然后它的所有方法、函数、过程、属性等就都会自动列出来了。我在VB中在类实例。...中,一个点下去,所有的东东都出来了,而DELPHI中行不行啊,总不能每一个过程与函数都要声明吧。
2、由上引出一个问题:如果有一个不是自己开发的DLL库,又没有提供里面的函数、过程等的参数定义方式,我要怎么样才能知道里面那些资源的结构等的。有什么工具可以查看里面的函数等的参数行式吗?要不然在工程是要声明时怎么能够呢?
3、DELPHI中做的DLL可以在VB或其它中调用,但在VB中一样要声明。能不能象VB中做的DLL那样,可以直接从“引用”中引入就象MICROSFT的许多DLL就可以引入,这样这个DLL中的所有资源都看得到了,第二个问题也就解决了。只要按F2就可以查看一个DLL中的所有东东了。调用也快。另,能不能解说一下VB中的DLL与DELPHI中的DLL的结构或其它的有什么不一样呢?
4、我看了一些资料,里面有一个说到可以将DLL中的类引出,那要怎么个引出法呢?那个资料中没有例子。引出了类后,是不是可以象VB中那样直接定义引用,不用再声明了呢?
我的意思是只要声明了类后,其类的成员就可以用了。
5、我将一此窗口放在DLL中,比如ABOUT等共用的窗口,但我在处理时碰到一个问题。我在DLL中的一个窗体中放一个COMBOBOX控件,用一个函数引入一个TSTRINGS类型的参数进来给它,然后用 AA.Items:=BB.Items ,AA表DLL中的COMBOBOX,BB.Items 表引入的TStrings 类型的参数变量,但为什么老是提示出错呢?后来我直接用PCHAR再加上特珠的格式传入一引字符串,然后再分解,并用ADD直接新增就可以了。为什么呢?我的目的是想动态装载COMBOBOX中下拉列表的内容。
6、在DELPHI中能不能象VB中那样把多个控件绑在一起,生成一个OCX控件,这样我可以把一些常用的窗口, 比如说ABOUT等做成OCX控件,然后直接调用就可以了。
7、DELPHI中能不能象VB中那样定义控件数组呢?这样我多个控件事件可以共用一组代码,只要了解一下不同的索引值,就可以很方便的进行处理了。而且可以动态加载控件。我现在就用VB做了一个OCX,这个OCX可以自动根据传入的SQL语句,去查找想要的SQL数据库结构,并自动生成LABEL、TEXTBOX等,排列得很整齐,成为一个数据输入窗,并且我也将如”新增“、”保存“等都集中在里面进行处理了。这样我要生成一个新的数据录入窗口,只要放上一个这个OCX控件,再把引出的事件里面加入一些必要的处理,整个窗体模块都不用50行的代码,就完全搞定了,而且可以重复使用。我想明白一下在DELPHI能不能实现这个功能呢?要怎么个做法?与VB中比起来各有什么不同呢?
8、我对DLL很感兴趣,但同时也碰到很多问题,能不能请谁帮我解答一下,并介绍一些这一方面的资料给我,非常感谢。
问题问得这么多,还望不要介意
帮个忙,高分奉送哦!!!
 
一个基本常识错误:
VB的DLL是 ActiveX DLL,也就是COM组件
Delphi一般所谓的DLL就是标准的Win32 DLL。 当然,Delphi也支持Activex DLL:
project|import type libaray
 
那这两者有什么不同吗?应该怎么处理,让它通用呢?如上问题!!!
 
TO 一个过客:
嗯,有点看头。
 
怎么没有人来回答哪,快快帮忙啊!!!!!!!
 
怎么没有人来回答哪,快快帮忙啊!!!!!!!
 
red]怎么没有人来帮忙啊?????[[/red]
 
不会吧,所有的富翁都哪去了,去赌博了吗?怎么没有人来呢???
还是大家都不懂???不可能吧!!!
 
天啊,难产了,没有人会吗?看来这个论坛也是虚有其名了。
 
1、你在VB中做的是COM,而在Delphi中做的是DLL,当然不会点了出来,如果你在Delphi中写
COM也可以自动列出来(包括写类声明,Delphi可以自动写代码)
2、3:如“一个过客”所说,使用project|import type libaray并Install,可以象使用控件
似的使用这个COM
4:使用上面的方法后,Delphi会自动生成一个声明文件,所有声明均在其中。
5:在COM或DLL中最好不要直接使用String做函数或返回值,因为微软标准的字串类型为PChar
或者你使用指针
6:不用写成OCX,直接用DLL就可以
7:当然可以,所有控件都是从TComponent继承下来的
8:你可以看看《Delphi5高级开发指南》
 
2、3:但即然如你所说,DELPHI中是标准DLL的话,那在DELPHI中用Project|import tyle library 并不能实现,因为在里面找不到我自己做的DLL文件,怎么install呢?
6:我说是是比如OCX一样,可以将部份控件集在一起,比如一个数据采集窗口,然后在新的工程中可以拿来用,就比如我们拿Button来用一样,我还可以对其属性与方法等进行控制处理的.这样才好用嘛!
7:这个我还是不明白,怎么处理才能将多个按钮(比如)的单击事件全部写在一个过程中,然后用判断索引值去采取不同的击活运作过程。
谢谢 浦欣 的帮助,再请高手指点迷津。
 
To netwinds:
2、3:既然是标准DLL,那就不是COM对象或者叫组件对象,是外部DLL,那你可以通过external这个DLL
来调用它里面的方法。或者用WINDOWS API函数LoadLibrary来动态导入。
6、你这样最简单就是做成模版嘛。
7、DELPHI当然可以实现,而且要比VB做得好,你要知道DELPHI比VB的功能要强得多。
 
您好!DLL中使用string不是不可以,而是在Uses里面要声明一个单元,而且这个单元要放到第一个。
这个单元是shareMem.提供如下资料:
对象TDllNumber在objdll.dll中定义:
objdll.dll输出一个函数:CreateObject

type
TDllNumber=class
public
function GetOk:string;virtual;abstract;
end;
TDllNumber1=class(TDllNumber)
public
constructor create;
function GetOk:string;override;
end;
function CreateObject:TDllNumber;export;
implementation
constructor TDllNumber1.create;
begin
inherited create;
end;

function TDllNumber1.GetOk: string;
begin
result:='ok';
end;
function CreateObject:TDllNumber;
begin
Result:=TDllNumber1.Create;
end;

在程序中调用对象:
type
TDllNumber=class
public
function GetOk:string;virtual;abstract;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
function CreateObject:TDllNumber;stdcall;external 'objdll.dll';
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
Ok:string;
TestObj:TDllNumber;
begin
TestObj:=CreateObject;
Ok:=TestObj.GetOk;
ShowMessage(ok);
TestObj.Free;
end;

当程序运行到button1click最后是包错:
Invalid pointer Operation!!!
但是为integer,pchar不报错!!!!


总结:
1。 在dll中定义返回string字符串的函数时,如果没有特殊处理调用该函数
在退出调用该函数的过程(函数/事件)时,会出现以下错误:
Invalid Pointer Operator!
2。当在单元中添加ShareMem时,在退出程序的时候会出现同样的错误
3。当在调用dll的项目文件中(不是在单元文件)添加ShareMem时,能够正常
运行.
4. String类型是Borland自定的特殊类型,使用起来真是无比方便,
但是,它需要borladmm.dll的支持,在动态链接库中想使用STRING类型
要经过特殊的手段,因此还是使用PCHAR类型吧。PCHAR也挺方便的。
另外如果没有特殊处理的话: WideString-可以
AnsiString-不可以
 
To netwinds:
同意 Cash_HYJ,joysun
2、3:如果你调用的是标准的DLL,当然不能从DELPHI中用Project|import tyle library 实现,
只能用表态调用或动态调用的方法(也就是Cash_HYJ说的方法)
DELPHI那个菜单的功能是用于调用OCX及COM用的,与VB中菜单的那个方法类似,而且这些OCX,
COM是要注册过的,不然菜单中不会显示(不过你可以通过ADD按钮添加)
实际上你一直在说的是COM,只不过COM也可以以DLL的方式存储,COM是语言无关的,微软的那些
DLL实际上绝大部分是COM.
6:例:一个窗体上有10个Button,分别为Btn1,Btn2 ... Btn10
for I := 0 to ComponentCount-1do
// Iterate
begin
if Components.ClassName='TButton' then
begin
case Components.Tag of //
0: //do something;
1: //do something;
2: //do something;
3: //do something;
end;
// case
end;
end;
// for

 
关于DLL中引出对象的问题:
我们是可以访问DLL中封装的对象及其方法的。不过,有一些特殊的规则。
(1)应用程序只能访问对象中的虚拟方法;
(2)只能在DLL内存中创建对象;
(3)应用程序和DLL都必须声明对象及其方法,方法的顺序要一致;
(4)DLL中的对象不能被继承。
我这儿有个例子,需要的话可以发给你!
 
TO ALL:
先谢谢大家的帮忙,十分感谢!!!
TO joysun:
如果可以的话,请给我发一下你的那个例子,让我学一学,谢谢。
另,想再问一下,我想把已经有的一个DELPHI中的组件集到DLL中,要怎么做呢?当
然,我有这个组件的所有源代码,而且这个组件里面本身有窗体存在的。这与你所说的对
象是不是一个样呢?
还有类?在DELPHI中封装进组件、类、对象是不是其实就一个样,还是有什么区别
呢?
我们在DELPHI中做组件时,能够直接访问组件中的方法与过程等,集进DLL中后还能
不能保持这一种样式。(如果可以的话,不就跟VB中的COM一样了吗?)
谢谢您的帮助,再请您费点心,帮我指导一下,谢谢!!!
我的 Email 是: netwinds@163.com 谢谢!
 
TO ALL:
最好能给我一个将组件集进DLL中的实例,谢谢
 
程序已经发过去!
您所说的组件是不是指的控件,还是控件的集合?
对象是类的实例,类是概括了一组对象共同性质的的方法和数据。例如我们程序中加入
一个Button,它是一个对象,而他是由TButton类创建的。
您所谓的访问是指在编译环境下"."访问,还是程序中?如果是程序中是可以的,我给你的
例子里就是一个代表!
 
推荐《Delphi 5.0程序指南》一书,我的例子就是上面的!书上有关于DLL处理的一整章!
 
后退
顶部