求教各位高手:如何编码实现注册?很着急,请各位帮忙!

hjunzi 2003-05-14 09:49:12
我编了一个DCOM服务器用于读写服务器端的本地数据。然后编了一个ACTIVEX控件,想实现B/S方式,用户只需浏览器下载ACTIVEX控件就可以调用远程的DCOM服务器端接口,而避免DCOM的代理/桩手动拷到客户机端并注册为NT服务。意思就是我希望在ACTIVEX控件里硬编码实现DCOM代理/桩的注册和把其注册为NT服务。

...全文
91 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjunzi 2003-05-15
  • 打赏
  • 举报
回复
我已经编写了一个可以调用服务器端接口的ACTIVEX控件,而且把该控件放在了网页中,客户端浏览该网页时,控件自动下载,并注册。
但是调用DCOM服务器端接口的ACTIVEX控件里需要调用DCOM代理和桩(位于服务器端),如果不手动把代理和桩拷贝到客户端的话,我怎么才能使客户端拥有代理/桩。以及我怎么才能使服务器DCOM程序*.EXE不手动而到达客户端,并注册为NT服务。这才是我所要问的问题。
ayqlj 2003-05-15
  • 打赏
  • 举报
回复
你可以编写一个ActiveX控件,这样将控件打包成.cab文件,然后将ActiveX控件的定义嵌入HTM文件就可以了(VB和VC会生成有关的定义代码)
这个方法是抄来的,是一个高手给的,但没试过,你试试,成功了,说一下
firela 2003-05-15
  • 打赏
  • 举报
回复
做成CAB试试

1、如果需要创建cab文件,首先需要Cabarc或者Makecab,它们随着Cabinet SDK的安装就有了,Cabinet SDK的下载地址是http://msdn.microsoft.com/workshop/management/cab/cabdl.asp。
Cabarc可以创建、查看或者解出cab里面的文件,而Makecab则只可以用来创建cab文件。
2、制作cab文件时需要将所有的相关文件都包含进去,可以通过Depends(VC自带的)检查需要的文件。使用inf文件将这些东西都写进去。
3、inf搞法:inf文件描述cab中所有的ocx及dll文件,inf通过一些命名区域来提供需要的信息。

怎么写inf
最开始一般是[Version]区:
eg: [Version]
signature="$XXXX$"
AdvancedINF=2.0
接下来就是最重要的[Add.Code]区:
eg: [Add.Code]
Ctrl1.dll=C1Section
Ctrl2.dll=Ctrl2.dll
前面是要下载的文件名,后面是对应这个文件的区域名,可以是任何名字,不过一般都是和文件的名字相同,这样方便维护。还有需要注意是在[Add.Code]区出现的文件要根据依赖性进行排序,例如前面说的ctrl1.dll要依赖于ctrl2.dll,则ctrl2.dll要出现在ctrl1.dll的前面。因为安装时是按照相反的顺序进行的,也就是说先安装ctrl2.dll,然后才是ctrl1.dll,哧哧,记清楚了,不要搞反了。
再接下来是各个文件的区域了
[Ctrl1.dll]
file-win32-x86=thiscab
RegisterServer=yes
clsid={.....}
DestDir=
FileVersion=1,0,0,0
[Ctrl1.dll]区域中的第一个file值告诉ie到哪里去得到这个dll,file一共包括三个部分,第一部分是file,这个永远都是这样的(至少目前来说);第二部分告诉声明支持的OS,win32表示windows,mac就是苹果MAC OX了;第三部分是CPU类型,比如说x86、 ppc (Power PC)、 mips或者alpha了。
file的值可以取三个一个URL、ignore和thiscab,如果是URL则说明到URL所在的位置去下;如果是ignore说明对于这种OS和CPU,不需要下载这个文件(ctrl1.dll);如果是thiscab很明显就在当前的cab文件中了。
接下来是RegisterServer,可以取两个值yes和no,如果为yes则说明ie要注册该dll,如果是no就不必了;
再下来是DestDir,它的值是dll将要存到本地硬盘的位置,如果它的值是10,则将dll放到\Windows或者\WinNT下;如果是11,则放到\Windows\System或者
\WinNT\System32下;如果是空(就是没有值)则会放到\Windows或者\WinNT下的Downloaded Program Files目录下;
最后是FileVersion,这个就比较明显了,说明了ctrl1.dll的版本号。
有时候我们使用VB来开发控件的时候,需要将VB的虚拟机装上去,它需要一些其它的说明的,简单地讲一下吧:
在[Add.Code]中增加一项MSVBVM60.DLL=MSVBVM60.DLL(以VB6为例)下面是
MSVBVM60.DLL区域:
[MSVBVM60.DLL]
hook=MSVBVM60.cab_Installer
FileVersion=6,0,81,76
FileVersion很明显,是版本号,就不再说发,就说说hook吧。
hook区域是在安装的时候需要执行的区域,它分为两种,一种是有条件的,另外一种是无条件的,无条件的hook区域是必须执行的,反之则根据条件判断是否执行。以[Setup Hooks]标记的区域是无条件区域,如下所示
[Setup Hooks]
hookname=section-name

[section-name]
run=%EXTRACT_DIR%\setup.exe
无条件区域常用来通过一个inf文件执行一个安装程序,这就是我们在资源管理器右键点击一个inf文件时在执行安装这样的菜单的原因了
当ie下载了一个cab文件,如果文件中没有[Add.Code],则处理[Setup Hooks]区域,运行run所指定程序,哧哧,上面就是setup.exe;
条件区域则为在一定条件下执行,前面为MSVBVM60.DLL指定的hook区域就是一个条件区域,如果在MSVBVM60.DLL指定的CLSID或者version不能满足需要而且没有file这个命名值,则执行hook所指定的区域。
[MSVBVM60.cab_Installer]
file-win32-x86=http://activex.microsoft.com/controls/vb6/VBRun60.cab
run=%EXTRACT_DIR%\VBRun60.exe
上面[MSVBVM60.cab_Installer]是一个hook区域,它也包含了一个file值,指定一个URL,表示MSVBVM60.DLL可以从这个URL下载得到;run则说明了执行哪一个文件
这里有必要说明一下的是,MS对一些常用的Redistributable Microsoft DLLs
可以通过指定CODEBASE属性为http://activex.microsoft.com/controls,这样在cab文件中就中需要包含这些文件,在计算机上有一个文件redist.txt上面的dll就是Redistributable Microsoft DLLs


创建一个cab文件:
cabarc N ctrl1.cab ctrl1.inf ctrl1.dll
N表示要创建一个新的文件,ctrl1.cab是创建的文件名,ctrl1.inf是cab的inf,后而是需要加到cab里的文件,可以使用通配符。
然后就可以将cab文件放到网页上了
<OBJECT ID="Ctrl1Obj"
CLASSID="clsid:....................................."
CODEBASE="http://server.com/ctrl1.cab#version=8,0,0,5007">
</OBJECT>
这里也在一个version,不过这里的version是指控件的version,而inf里的是文件的version。


制作电子签名:
首先从下面的网址下载制作签名的工具SignCode,地址是
http://msdn.microsoft.com/workshop/gallery/tools/authenticode/authcode.asp
从签名授权中心如VeriSign或者你的局域网上运行的Microsoft Certificate
Server授权服务器得到一个certificate,在申请授权的过程你会得到一个私钥。
也可以使用MakeCert.exe和Cert2Spc.exe创建的私钥进行测试,方法是首先使用MakeCert创建一个X.509的certificate(.cer文件)
MakeCert -sv MyKey.pvk n "CN=My Software Company" MyCert.cer
然后利用Cert2Spc将.cer文件转换成为PKCS #7软件发布Certificate(.spc文件),
Cert2Spc MyCert.cer MyCert.spc
利用你下载的SignCode对你的cab文件进行电子签名
SignCode -spc MyCert.spc -v MyKey.pvk -t http://
timestamp.verisign.com/scripts/timstamp.dll ctrl1.cab
SignCode还可以指定一些其它的参数,就不说了,太长了,哧哧。
虽然可以利用测试的.cer和.spc文件,但是在发布的时候,必须申请。

其实东西在SDK中都有说明,不过都是E文的,慢慢看就没有什么发
tigerVC 2003-05-15
  • 打赏
  • 举报
回复
我也有这样的需求,如果我们安装的软件像microsoft那样,只要我安装了软件,所有组件都自动注册到注册表中,那是一件多么好的事,客户只要用该组件,就自动注册,上面的方法行不行,我觉得好像也可以,不太清楚,有点糊了。
hjunzi 2003-05-15
  • 打赏
  • 举报
回复
一个多么有价值的问题!多么希望能够得到解决。
firela 2003-05-14
  • 打赏
  • 举报
回复
up
hjunzi 2003-05-14
  • 打赏
  • 举报
回复
谢谢Skt32(Skt32) ,不过我的问题不是ACTIVEX控件如何注册,而是如何用编码的方法使远程的代理/桩(DLL)能下载到客户端并注册,并使DCOM服务器端的EXE程序在客户端成为NT服务。实际上就是完成以下两步操作:
HelloServ /Service
regsvr32 HelloServps.dll
其中,HelloServ 是远程DCOM服务器端程序,HelloServps.dll 是远程DCOM的代理/桩。现在的问题就是HelloServ(HelloServ.exe)和HelloServps.dll 都在远程服务器端而不是在客户端。
至于ACTIVEX控件如何注册,只要用户浏览有带有该控件的网页,控件就自动注册!
Skt32 2003-05-14
  • 打赏
  • 举报
回复
Windows中ActiveX控件的注册
2000-03-21 00:00:00· 陈再·stu93j
自从Microsoft公司于1996年推出ActiveX技术以来,ActiveX技术已得到了许多软件公司的支持和响应,并纷纷在其产品中融入ActiveX技术。而作为ActiveX技术之一的ActiveX控件也得到了迅猛的发展,不但各大软件公司推出了不少ActiveX 控件,ActiveX控件更是得到一般开发者的喜爱。那么,什么是ActiveX控件呢?ActiveX控件是一个动态链接库,是作为基于COM服务器进行操作的,并且可以嵌入在包容器宿主应用程序中,ActiveX控件的前身就是OLE控件。由于ActiveX控件与开发平台无关,因此,在一种编程语言上开发的ActiveX控件可以无须任何修改,即可在另一种编程语言中使用,其效果如同使用Windows通用控件一样。如:在VC++中开发的ActiveX控件,不作任何修改即可应用于VB中。由此可见,通过使用ActiveX控件即可实现快速小型的组件重用、实现代码共享,从而提高编程效率。从上面亦可看出为何ActiveX控件如此广泛地受到开发者的欢迎。
   因为ActiveX控件的可重用性,加上Internet的普及,ActiveX控件得到了极大的发展,目前,从Internet上可以得到相当多的ActiveX控件,而且品种繁多,所完成的任务几乎无所不包。对普通开发者来说,只要有耐心,都能从Internet上找到符合自己要求的ActiveX控件。
   从Internet下载的ActiveX控件,或从其他途径得到的ActiveX控件,用户应该怎样做才能正确使用ActiveX控件或将其应用于自己的程序中呢?一般来说,一个外来ActiveX控件要在Windows中被正确使用,首先必须将控件文件(*.OCX)复制到硬盘中,然后将其在Windows中注册,未在Windows中注册过的ActiveX控件是不能使用的。注册ActiveX控件一般来说有三种途径:
   1. 使用Regsvr32.exe程序对ActiveX控件进行注册;
   2. 使用安装程序制作软件:InstallShield;
   3. 在应用程序中加入注册代码。
   上述方法适用范围不同,各有各的优点,下面分别讨论。
   一、 使用Regsvr32.exe程序对ActiveX控件进行注册
   对于未注册过的ActiveX控件可使用此软件对其进行注册,外来ActiveX控件要应用到自己的程序中也必须进行注册。该文件位于Windows目录的system子目录下。使用方法如下:点击“开始”→“运行”;在运行对话框中输入以下命令:
regsvr32 $#@60; 文件名 $#@62; 注册一个ActiveX控件
regsvr32 /u $#@60; 文件名 $#@62; 解除某ActiveX控件的注册
   我们使用一些带A veX控件的应用程序时,有时会出现不能运行的情况,这有可能是其自带ActiveX控件未注册所至,这时不妨使用上述命令一试。另外,VC++使用者若对regsvr32.exe的编码感兴趣的话,可在VC++的联机帮助中找到其源代码。若使用VC++ 6.0,则在MSDN光盘的\sample\VC98\MFC\controls\regsvr中。
   二、 使用安装程序制作软件:InstallShield
   使用regsvr32.exe来注册ActiveX控件虽然简单,但需要用户手工注册,在不用时还得手工解除注册,因此,这对一个应用程序来说并非好的解决方案。大型应用软件一般都有一个安装程序,在安装程序中解决ActiveX控件注册是较为理想的一种方案。使用InstallShield可以制作出专业级的Setup,还可注册其中的ActiveX控件;而且,在以后携载软件时,自动注销掉以前注册的ActiveX控件。方法如下:
   1. 启动InstallShield,使用Project Wizard建立一个新的项目;
   2. 新建一个“File Group”,将需要注册的ActiveX控件文件放入此“File Group”中;
   3. 将上述“File Group”的“Self-Registered”属性设置成“Yes”。
   上述步骤仅为制作Setup中设置自动注册ActiveX控件几步,至于使用InstallShield怎样制作一个完整的Setup不在本文讨论范围之中,请读者自己参看有关书籍。
   三、 在应用程序中加入注册代码
   对于小型程序不宜采取第二种方法,较好的方法是在程序中嵌入注册代码,实现应用程序自注册。其编程方法是:
   1. 使用Windows API函数LoadLibrary载入ActiveX控件;
   2. 使用GetProcAddress函数获取ActiveX控件中注册函数DllRegisterServer(注销函数为DllUnregisterServer)指针;
   3. 调用注册函数DllRegisterServer(或注销函数DllUnregisterServer)。
   下面以VC++ 6.0编写的RegActivex程序为例,介绍怎样在程序中自动注册(注销)ActiveX控件。RegActivex的主体框架由VC++ 6.0的AppWizard自动产生,在其基础上增加两个菜单项:“注册ActiveX控件”、“注销ActiveX控件”。当选择“注册ActiveX控件”菜单时,将对控件toweratl.ocx(一个汉诺游戏)进行注册;当选择“注销ActiveX控件”菜单时,将解除控件toweratl.ocx的注册。
   1. 使用VC++ 6.0建立一个单文档的应用程序RegActivex,其他项目接受默认设置;
   2. 给应用程序增加两个菜单项:“注册ActiveX控件”、“注销ActiveX控件”,步骤如下:
   ① 单击VC++ 6.0左边窗口的“ResoureView”,双击MENU项目下的IDR_MAINFRAME以打开菜单编辑器;
   ② 在菜单编辑器中,加入一个主菜单“注册”,在“注册”主菜单下加入两个菜单项:“注册ActiveX控件”、“注销ActiveX控件”;
   3. 给新建的菜单项 “注册ActiveX控件” 和“注销ActiveX控件”增加响应函数:
   ① 在资源编辑其中,双击MENU中的IDR_MAINFRAME打开菜单编辑器,单击“注册ActiveX控件”,按Ctrl+W打开MFC Class Wizard;
   ② 双击Messages框中的COMMAND,给“注册ActiveX控件”菜单项增加响应函数OnRegisterReg(),单击右边“Edit”按钮给OnRegisterReg()函数增加如下代码:
void CMainFrame::OnRegisterReg()
{
//ActiveX控件的路径及文件名
LPCTSTR pszDllName="toweratl.ocx";
//装载ActiveX控件
HINSTANCE hLib = LoadLibrary(pszDllName);
if (hLib $#@60; (HINSTANCE)HINSTANCE_ERROR)
{
MessageBox("不能载入Dll文件!","结果",MB_OK);
return;
}
//获取注册函数DllRegisterServer地址
FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress
(hLib,_T("DllRegisterServer"));
//调用注册函数DllRegisterServer
if(lpDllEntryPoint!=NULL)
{
if(FAILED((*lpDllEntryPoint)()))
{
MessageBox("调用DllRegisterServer
失败!","结果",MB_OK);
FreeLibrary(hLib);
return;
};
MessageBox("注册成功","结果",MB_OK);
}
else
MessageBox("调用DllRegisterServer失败!"
,"结果",MB_OK);
}
   ③ “注销ActiveX控件”菜单项响应函数的编写方法同上,代码也相似,只是将
“lpDllEntryPoint=GetProcAddress
(hLib,_T("DllRegisterServer"));”改成:
lpDllEntryPoint = GetProcAddress
(hLib,_T("DllUnregisterServer"))。
   4. 编译联接上述程序,即可得一个可执行文件。另需注意的是:应将ActiveX控件文件toweratl.ocx复制到Windows的system目录下。控件文件toweratl.ocx在微软出版的《Visual C++ 6.0程序员指南》所附光盘中可以找到。
   5. 测试上述程序:运行《Visual C++ 6.0程序员指南》所附光盘中的game2程序,若使用RegActivex注册了toweratl.ocx控件,则该程序可以正常运行;若使用RegActivex注销了toweratl.ocx控件则game2不能运行。

hjunzi 2003-05-14
  • 打赏
  • 举报
回复
我有一个想法,在控件里创建一个进程,进程里的参数有命令行,该命令行创建一个.EXE文件,并在该命令行里把该EXE文件注册为NT服务,不知这个想法是否可行,如果可行,请大家告诉我用命令行创建文件的命令是什么?
十分感谢!!若成功在加分!

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧