ActiveX 控 件 注 册 的几 种 方 法
# K1 I8 h# n2 } |- K! {" R
-ActiveX 控 件 是 一 个 动 态 链 接 库, 是 作 为 基 于COM 服 务 器 进
, L3 Q0 h- D' k4 {行 操 作 的, 并 且 可 以 嵌 入 在 包 容 器 宿 主 应 用 程 序 中,
, E9 H5 c% U; V, p& ~# FActiveX 控 件 的 前 身 就 是OLE 控 件。 由 于ActiveX 控 件 与 开 发 平
' A. [$ M& [" F+ j @台 无 关, 因 此, 在 一 种 编 程 语 言 上 开 发 的ActiveX 控 件 可
! W0 ]; C3 W) n: }/ i以 无 须 作 任 何 修 改, 即 可 在 另 一 种 编 程 语 言 中 使 用, 其
效 果 如 同 使 用 Windows 通 用 控 件 一 样。 如: 在VC + + 中 开
# e1 J8 ^+ I, T发 的ActiveX 控 件, 不 作 任 何 修 改 即 可 应 用 于VB 中。 由 此 可
见, 通 过 使 用ActiveX 控 件 即 可 实 现 快 速 小 型 的 组 件 重 用
) j L" a8 k y: L、 代 码 共 享, 从 而 提 高 编 程 效 率。
----从Internet 下 载 的ActiveX 控 件, 或 从 其 他 途 径 得 到 的
/ K- l) F( a' q: L( rActiveX 控 件, 用 户 应 该 怎 样 做 才 能 正 确 使 用 呢 ? 一 般 来
1 o$ w" i. G2 e/ Q& e3 P7 K说, 一 个 外 来ActiveX 控 件 要 在Windows 中 被 正 确 使 用, 首 先
2 `( r# U2 E7 O8 I: F, B& {8 ~/ y6 t必 须 将 控 件 文 件( *.OCX) 复 制 到 硬 盘 中, 然 后 将 其 在
( u. Q8 _. U; I; K- ]Windows 中 注 册, 未 在 Windows 中 注 册 过 的ActiveX 控 件 是 不 能
使 用 的。 注 册ActiveX 控 件 一 般 来 说 有 三 种 途 径, 适 用 范
1 D0 o: L! J5 \围 不 同, 各 有 各 的 优 点, 下 面 分 别 讨 论。
; H8 U( h! |( K8 a! M/ |6 g. M/ C9 D
一、 使 用Regsvr32.exe 程 序
% p z6 X) m! l0 j对ActiveX 控 件 进 行 注 册
----对 于 未 注 册 过 的ActiveX 控 件 可 使 用 此 软 件 对 其 进 行 注
" p- N/ t# ^+ s. ?( Q; z! u* w册, 外 来ActiveX 控 件 要 应 用 到 自 己 的 程 序 中 也 必 须 进 行
+ D8 O' q1 f1 ?5 ~ N( O注 册。 该 文 件 位 于Windows 目 录 的system 子 目 录 下。 使 用 方
法 如 下: 点 击“ 开 始” →“ 运 行”; 在 运 行 对 话 框 中 输 入
以 下 命 令:
$ a& e- p8 M+ H' f. b' w0 Wregsvr32 < 文 件 名 > 注 册 一 个ActiveX 控 件
* r q1 C$ f* l# V5 Q3 d! o3 uregsvr32 /u< 文 件 名 > 解 除 某ActiveX 控 件 的 注 册
----我 们 使 用 一 些 带ActiveX 控 件 的 应 用 程 序 时, 有 时 会 出
现 不 能 运 行 的 情 况, 这 有 可 能 是 其 自 带ActiveX 控 件 未 注
册 所 至, 这 时 不 妨 使 用 上 述 命 令 一 试。 另 外,VC + + 使
" f- x4 u7 f1 Z/ b4 @用 者 若 对regsvr32.exe 的 编 码 感 兴 趣 的 话, 可 在VC + + 的 联
机 帮 助 中 找 到 其 源 代 码。 若 使 用VC + + 6.0, 则 在MSDN 光
盘 的 \sample\VC98\MFC\controls\regsvr 中。
二、 使 用 安 装 程 序
& _: c+ n, D+ r制 作 软 件:InstallShield
----使 用regsvr32.exe 来 注 册ActiveX 控 件 虽 然 简 单, 但 需 要 用
+ F: `( X7 B% w. ^% K户 手 工 注 册, 在 不 用 时 还 得 手 工 解 除 注 册, 因 此, 这 对
) h8 w7 _9 G* o6 y i一 个 应 用 程 序 来 说 并 非 好 的 解 决 方 案。 大 型 应 用 软 件
0 h C6 M/ [& [% T一 般 都 有 一 个 安 装 程 序, 在 安 装 程 序 中 解 决ActiveX 控 件
5 ?$ J+ B% i% r& I2 ^2 a6 ^注 册 是 较 为 理 想 的 一 种 方 案。 使 用InstallShield 可 以 制 作
' R9 O! s# |4 z6 J出 专 业 级 的Setup, 还 可 注 册 其 中 的ActiveX 控 件; 而 且, 在
以 后 携 载 软 件 时, 自 动 注 销 掉 以 前 注 册 的ActiveX 控 件。 方
2 O" O$ R* C6 i4 K/ P0 g( ]( Q法 如 下:
启 动InstallShield, 使 用Project Wizard 建 立 一 个 新 的 项 目;
新 建 一 个“File Group”, 将 需 要 注 册 的ActiveX 控 件 文 件 放 入
此“File Group” 中;
将 上 述“File Group” 的“Self -Registered” 属 性 设 置 成“Yes”。
6 U! [2 Q$ D. A( r0 K% U) ^; j& Z; O) A/ @) a
----上 述 步 骤 仅 为 制 作Setup 中 设 置 自 动 注 册 ActiveX 控 件 几
步, 至 于 使 用InstallShield 怎 样 制 作 一 个 完 整 的Setup 不 在
本 文 讨 论 范 围 之 中, 请 读 者 自 己 参 看 有 关 书 籍。
2 ^2 ?: B7 l8 ?
三、 在 应 用 程 序 中
加 入 注 册 代 码
3 U, m4 Y& B9 ?" k) s" o4 W) R7 w
----对 于 小 型 程 序 不 宜 采 取 第 二 种 方 法, 较 好 的 方 法 是
# z5 A& g3 @' u1 i8 H- v p6 u在 程 序 中 嵌 入 注 册 代 码, 实 现 应 用 程 序 自 注 册。 其 编 程
方 法 是:
使 用Windows API 函 数LoadLibrary 载 入ActiveX 控 件;
使 用GetProcAddress 函 数 获 取ActiveX 控 件 中 注 册 函 数
% N- D$ Z7 j- {DllRegisterServer ( 注 销 函 数 为DllUnregisterServer) 指 针;
调 用 注 册 函 数DllRegisterServer( 或 注 销 函 数
) _1 |& h& Q! a! Q7 xDllUnregisterServer)。
4 ? u. E) O- L! A; S+ o+ b) _" n----下 面 以VC + + 6.0 编 写 的RegActivex 程 序 为 例, 介 绍 怎 样
P0 s, L+ \8 r& W: s3 C在 程 序 中 自 动 注 册( 注 销)ActiveX 控 件。RegActivex 的 主 体
框 架 由VC + + 6.0 的AppWizard 自 动 产 生, 在 其 基 础 上 增 加 两
& }. r; Q2 Z, B: l# f' c个 菜 单 项:“ 注 册ActiveX 控 件”、“ 注 销ActiveX 控 件”。 当 选
9 R. }& n+ `2 T1 } \; Y, y2 H择“ 注 册 ActiveX 控 件” 菜 单 时, 将 对 控 件toweratl.ocx( 一 个
汉 诺 游 戏) 进 行 注 册; 当 选 择“ 注 销ActiveX 控 件” 菜 单 时
, 将 解 除 控 件toweratl.ocx 的 注 册。
1 Y1 R9 N1 @) q6 I% R: P
使 用VC + + 6.0 建 立 一 个 单 文 档 的 应 用 程 序RegActivex, 其
他 项 目 接 受 默 认 设 置;
3 ~7 m, E L, ]! `! H& N3 ?% [给 应 用 程 序 增 加 两 个 菜 单 项:“ 注 册ActiveX 控 件”、“ 注 销
ActiveX 控 件”, 步 骤 如 下:
单 击VC + + 6.0 左 边 窗 口 的“ResoureView”, 双 击MENU 项 目 下
& u5 [5 L7 y L# L! m/ M, c/ c的IDR_MAINFRAME 以 打 开 菜 单 编 辑 器;
在 菜 单 编 辑 器 中, 加 入 一 个 主 菜 单“ 注 册”, 在“ 注 册”
主 菜 单 下 加 入 两 个 菜 单 项:“ 注 册ActiveX 控 件”、“ 注 销
ActiveX 控 件”;
- l" z Y. X" s1 F; Y给 新 建 的 菜 单 项 “ 注 册ActiveX 控 件” 和“ 注 销ActiveX 控 件”
% L5 w3 p7 ~) A3 L6 K; l增 加 响 应 函 数:
" p% M2 K0 P' E8 X在 资 源 编 辑 器 中, 双 击MENU 中 的IDR_MAINFRAME 打 开 菜 单 编 辑
器, 单 击“ 注 册ActiveX 控 件”, 按Ctrl +W 打 开MFC Class Wizard;
双 击Messages 框 中 的COMMAND, 给“ 注 册ActiveX 控 件” 菜 单 项 增
7 B" p5 I, j) b加 响 应 函 数OnRegisterReg(), 单 击 右 边“Edit” 按 钮, 给
, n s: S" V1 T% W7 _- V' L! lOnRegisterReg() 函 数 增 加 如 下 代 码:
% A; Q* U8 @/ {+ T9 ~void CMainFrame::OnRegisterReg()
' z7 m* u" V! `0 x/ q. m{
//ActiveX 控 件 的 路 径 及 文 件 名
LPCTSTR pszDllName=“toweratl.ocx";
// 装 载ActiveX 控 件
: @$ b; {$ C, P1 e$ EHINSTANCE hLib = LoadLibrary(pszDllName);
5 b+ H3 n# Q: b2 E& m% ^, U8 a1 Nif (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
0 O2 ~+ D% c' V9 y pMessageBox(“ 不 能 载 入Dll 文 件!",
& V! K9 z, ~: W9 t0 ]$ q) A$ X& ^2 f“ 结 果",MB_OK);
return;
$ H/ b( ?% l. |) R0 m}
+ _( s" ^( G0 z- I! O7 @1 J0 R4 v2 V' h/ f
// 获 取 注 册 函 数DllRegisterServer 地 址
FARPROC lpDllEntryPoint;
. }' h0 _4 W0 B7 P- i, glpDllEntryPoint = GetProcAddress
(hLib,_T(“DllRegisterServer"));
// 调 用 注 册 函 数DllRegisterServer
if(lpDllEntryPoint!=NULL)
1 u i0 l; }1 c{
if(FAILED(( *lpDllEntryPoint)()))
. }2 X# A |/ d, U# r; x+ X{
) ~, d, n8 s. ~0 y4 Y+ NMessageBox(“ 调 用DllRegisterServer 失 败 !",
+ l5 W9 \3 G' w$ Z8 ?8 A( R“ 结 果",MB_OK);
FreeLibrary(hLib);
return;
' ^, R+ c( X- N5 d};
MessageBox(“ 注 册 成 功",“ 结 果",MB_OK);
}
else
* E6 I7 Q, R4 M, D) n* wMessageBox(“ 调 用DllRegisterServer 失 败 !",
# a6 e3 ?; T" M# w“ 结 果",MB_OK);
; O1 d6 N( u$ Y. \% u5 {}
" H% y1 e) M# N4 P8 @+ G6 J* A$ V5 C# h* G
“ 注 销ActiveX 控 件” 菜 单 项 响 应 函 数 的 编 写 方 法 同 上, 代
码 也 相 似, 只 是 将 “lpDllEntryPoint=GetProcAddress(hLib,_T(“
DllRegisterServer"));” 改 成:
lpDllEntryPoint = GetProcAddress(hLib,_T
(“DllUnregisterServer"))。
' c3 y7 _; j% |4 W$ n
编 译 联 接 上 述 程 序, 即 可 得 一 个 可 执 行 文 件。 另 需 注 意
# P/ v1 y U$ q& x的 是: 应 将ActiveX 控 件 文 件toweratl.ocx 复 制 到Windows 的system
" {$ ^5 d& F; w8 y9 ?2 g目 录 下。 控 件 文 件toweratl.ocx 在 微 软 出 版 的《Visual C + +
6.0 程 序 员 指 南》 所 附 光 盘 中 可 以 找 到。
测 试 上 述 程 序: 运 行《Visual C + + 6.0 程 序 员 指 南》 所 附
光 盘 中 的game2 程 序, 若 使 用RegActivex 注 册 了toweratl.ocx 控 件
, 则 该 程 序 可 以 正 常 运 行; 若 使 用RegActivex 注 销 了
toweratl.ocx 控 件 则game2 不 能 运 行。
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |