(如果回答详细,我将用最少500分酬谢!)用ActiveX(RealProducer Plus)写了一个外壳小程序,但是在其它的计算机上运行不了,请问如何在其它

  • 主题发起人 主题发起人 zhongwanglong
  • 开始时间 开始时间
Z

zhongwanglong

Unregistered / Unconfirmed
GUEST, unregistred user!
(如果回答详细,我将用最少500分酬谢!)用ActiveX(RealProducer Plus)写了一个外壳小程序,但是在其它的计算机上运行不了,请问如何在其它的计算机上通过我的程序进行组件PRCT3260.OCX(RealProducer Plus)的注册?(200分)<br />(如果回答详细,我将用最少500分酬谢!)用ActiveX(RealProducer Plus)写了一个
外壳小程序,但是在其它的计算机上运行不了,请问如何在其它的计算机上通过我的
程序进行组件PRCT3260.OCX(RealProducer Plus)的注册?
 
可以用代码在程序中实现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;
 
多谢yangxiao_jiang你的回复,我会给你高分的,但是,我用过regsvr32 进行注册,可是提示我
“LoadLibrary("C:/prct3260.ocx")failed.
GetLastError retures 0x00000485.该怎么办呢?
 
库不能被加载啊, 首先文件路径对不对? 其次检查文件是不是好的。
 
我检查过了,在我开发的计算机上注册没有问题,可是在别的计算机上就有问题,为什么?
 
错误0x00000485的意思是:
One of the library files needed to run this application cannot be found.
这下知道为什么了吧? 缺文件了。
 
注册成功了(我用的是regsvr32进行注册的),但是我在Delphi里面把此控件拖放到窗体上时出现如下错误:
RealProducer not installed.You must have RealProducer 8.5 installed in order to use this control.
点击确定后,接着出现错误:“存储器不足,无法完成此操作”。
我的操作步骤是:
一、安装RealProducer Plus 8.5
二、备份RealProducer Plus 8.5 目录及子目录的所有文件。
三、卸载RealProducer Plus 8.5
四、注册控件regsvr32 H:/RealProducerPlus/Tools/prct3260.ocx(安装目录是默认目录,操作系统W2k)
五、打开Delphi 5 把Producercontrol控件拖放到窗体上出现上面的错误提示!

请各位高手指点!不胜感激!
如果那位高人可以帮我解决此问题!我愿把我所有的分数全部送上!谢谢!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部