来个难点的问题,考考大伙的水平(关于ActiveX)(100分)

  • 主题发起人 一个过客
  • 开始时间

一个过客

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样在得到一个ocx文件的情况下,用程序:
1.动态Regiter这个ocx控件
2.将这个ocx控件添加到自己的程序里面?

实现的效果就类似于plugins。

比如说我有一个程序,支持第三方开发ocx形式的插件,当然,该插件的接口函数我
都规定好了。现在如果用户得到一个这样的ocx插件,要求我的程序能够自己注册
这个ocx文件,并且象delphi自带的TWebBrowser那样把它的GUI界面添加到程序的
某个面板上(面板由程序提供,可能是个TPanel,或者其他容器)。

有个问题始终闹不明白:
我们用的TWebbrowser之所以能够象VCL一样放置在form上,是因为我们Import的
时候对他进行了包装,可是如何动态做这一步呢? 如果是VB,根本连包装都不需要
就可以直接使用。


 
A

amsea

Unregistered / Unconfirmed
GUEST, unregistred user!
确实很难,也许可以想办法得到一个叫什么id的东西,类似于{09092-******...
之类的,然后在...
 

一个过客

Unregistered / Unconfirmed
GUEST, unregistred user!
>>想办法得到一个叫什么id的东西
这个应该不难吧,这个id是ocx自己带的,regsvr32 xxx.ocx 之后生成的那个号码
应该就是它。我可以要求第三方提供给程序,关键是是到这个号码之后。。。。
 
W

wolf1860

Unregistered / Unconfirmed
GUEST, unregistred user!
如果是microsoft自带的ocx控件,delphi中添加进来就可以用了,而且打包的时候也不需要再
把相应的.dll 文件打进去,比如twebbrowser就是这样,不打进去的话也有版本不同的毛病,
可能会丢掉一些功能,以前用webbrowser做电子书的时候遇到过这种问题.如果打进去在安装时
重新注册则会把浏览器搞坏.
但如果是自己写的OCX控件就可以在打包的时候定义为自注册那样一般不会出毛病俄的解决办法是
在第一次启动程序的时候完成注册,一般不在打包时进行定义那样比较安全,方法是先去检查注册表
尔后完成注册,具体操作查看一下trigister,俄就不罗嗦了.
 
W

wangxd

Unregistered / Unconfirmed
GUEST, unregistred user!
>>1.动态Regiter这个ocx控件
用loadlibrary载入这个ocx,然后调用其中的dllregisterserver这个函数来注册。
调用undllregisterserver可以解除注册
>>2.将这个ocx控件添加到自己的程序里面?
问问别人吧,可能要用到ole的
 

荷塘新月

Unregistered / Unconfirmed
GUEST, unregistred user!
参观学习。
 
F

f950436

Unregistered / Unconfirmed
GUEST, unregistred user!
这就时BORLAND的高明
 
Y

yzhshi

Unregistered / Unconfirmed
GUEST, unregistred user!
看这个目录,有一个例子:
?:/Program Files/Borland/Delphi5/Demos/Activex/Tregsvr
 

完颜康

Unregistered / Unconfirmed
GUEST, unregistred user!
我们老大好几天都没来了,
一来就教导我们看例子多好(这个马P拍的极响)
 
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
IMPORT以后是对其接口(IDISPATCH的继承类)进行编程,使用的是编译时连接;vb这样的话是通过自动化进行
编程,使用的是运行时连接(都用VARIANT),效率要低一些。
 
Z

zhumoo

Unregistered / Unconfirmed
GUEST, unregistred user!
难,俺不知道
 

一个过客

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi不能实现类似VB的功能吗? 我觉得应该可以
 
B

BlackDragon

Unregistered / Unconfirmed
GUEST, unregistred user!
可以用代码在程序中实现COM的注册. 举例如下:
(假设需要注册的文件为test.ocx)
uses OLEctl,....
var
OCXHand: THandle;
RegFunc: TDllRegisterServer;
begin
OCXHand:= LoadLibrary('c:/windows/system/test.ocx');
RegFunc:= GetProcAddress(OCXHand, 'DllRegisterServer')

if RegFunc <> 0 then ShowMessage('Error!');
FreeLibrary(OCXHand);
end;


olectl.pas在/source/rtl/win下.
///////////////////////
在用DELPHI编写程序时,充分利用他人的成果无疑是一条捷径。我们用的控件有的是带源码的PAS文件,有的是DCU/OBJ文件;而OLE/COM控件也是不可缺少的,由于OLE/COM控件不仅可以由DELPHI开发,还可由VB、VC、PB等其它编程语言开发,因而它可以使我们的DELPHI应用程序功能更为强大,例如用一个MP3播放控件我们就可以编写自己的MP3播放程序,

用ADO对象我们的数据库程序就可能不再依赖BDE。

  不过OLE/COM控件是需要首先注册才能使用的。通常使用OLE/COM控件,首先需要用WINDOWS自己提供的注册程序RegSvr32.EXE来注册或卸载,如“RegSvr32.EXE Mp3Play.OCX”或

“RegSvr32.EXE Mp3Play.OCX /u”。不过如果要求我们的软件用户自己来注册OLE/COM控件,那可不是一个好主意,因为我们完全可以自己在程序中注册OLE/COM控件的。下面将讨论如何在DELPHI程序中注册最为常见的DLL/OCX类型的OLE/COM控件。


一、注册OLE/COM控件的原理

  在标准OLE/COM控件中,有两个函数DllRegisterServer、DllUnregisterServer可调用,其中

DllRegisterServer函数用于注册OLE/COM控件,DllUnregisterServer用于卸载OLE/COM控件,两个函数的原型均为:function : HResult。我们可用LoadLibrary装载DLL/OCX文件,用GetProcAddress获取DllRegisterServer和DllUnregisterServer两个函数的指针,然后再直接运行这两个函数即可实现注册和卸载OLE/COM控件的操作,从而代替WINDOWS系统的RegSvr32.exe实现OLE/COM控件的注册和卸载。


二、实现过程

  上面的原理很简单,实现起来也就不难了,前提是必须熟悉动态加载DLL函数的过程。具体的实现

过程我们可以通过下面的程序代码及注释来理解。

{ 注册一个DLL形式或OCX形式的OLE/COM控件

参数strOleFileName为一个DLL或OCX文件名,

参数OleAction表示注册操作类型,1表示注册,0表示卸载

返回值True表示操作执行成功,False表示操作执行失败

}

function RegisterOleFile (strOleFileName : STRING
OleAction : Byte ) : BOOLEAN;

const

RegisterOle = 1;//注册

UnRegisterOle = 0;//卸载

type

TOleRegisterFunction = function : HResult;//注册或卸载函数的原型

var

hLibraryHandle : THandle;//由LoadLibrary返回的DLL或OCX句柄

hFunctionAddress: TFarProc;//DLL或OCX中的函数句柄,由GetProcAddress返回

RegFunction : TOleRegisterFunction;//注册或卸载函数指针

begin

Result := FALSE;

//打开OLE/DCOM文件,返回的DLL或OCX句柄

hLibraryHandle := LoadLibrary(PCHAR(strOleFileName));

if (hLibraryHandle > 0) then//DLL或OCX句柄正确

try

//返回注册或卸载函数的指针

if (OleAction = RegisterOle) then//返回注册函数的指针

hFunctionAddress := GetProcAddress(hLibraryHandle, pchar('DllRegisterServer'))

else//返回卸载函数的指针

hFunctionAddress := GetProcAddress(hLibraryHandle, pchar('DllUnregisterServer'));

if (hFunctionAddress <> NIL) then//注册或卸载函数存在

begin

RegFunction := TOleRegisterFunction(hFunctionAddress);//获取操作函数的指针

if RegFunction >= 0 then //执行注册或卸载操作,返回值>=0表示执行成功

result := true;

end;

finally

FreeLibrary(hLibraryHandle);//关闭已打开的OLE/DCOM文件

end;

end;

 

一个过客

Unregistered / Unconfirmed
GUEST, unregistred user!
上面的,别捡软柿子捏啊。
注册ocx不是关键,因为我用命令行regsvr32就可以,关键是注册了之后怎样
把ocx的GUI界面放置到我的窗体上
 
B

BlackDragon

Unregistered / Unconfirmed
GUEST, unregistred user!
这就更简单了,注册后在delphi里看到project菜单了?看到下面的import type library
肯定会查找到你注册的*.ocx好了,install吧,到到delphi面板的activex页去吧.把他
拖到窗体上试试跟vcl一样啊。
 
D

DickWu

Unregistered / Unconfirmed
GUEST, unregistred user!
别人问的是动态装载(程序运行的时候,估计程序编译的时候也许还不知道该OCX的存在)
,哎,怎么都回答的文不对题啊

强烈关注
不知道有没有高手,还是一些菜鸟题目都没看就跳出来乱答
 
P

proman

Unregistered / Unconfirmed
GUEST, unregistred user!
我来学习,总的感觉Delphi对ActiveX支持不好.
 
Y

yidaoh

Unregistered / Unconfirmed
GUEST, unregistred user!
1、主程序找到插件文件(如 遍历目录./plugin/)
2、装入并注册该插件,可能需要通过某种约定方法检查其合法性,如是否实现了约定
的接口。
3、主程序将自己的某个对象如某个面板作为参数,传递给插件实现的某个函数,并执行
之。
4、插件执行该函数,如将自己的GUI显示在该面板中。

其中:3、4可以在插件的生命周期(装入前、装入后、初始化后、卸载前、卸载后等)
中多次进行。
对插件而言,可以看成是多个不同的事件(注意定义好参数)
插件实现时通过实现响应这几个事件的代码,对主程序的对象进行操作,完成相应的功


 
顶部