一、背景

  想必桌面程序开放人员对OCX并不陌生,尤其是.NET开发人员、COM开发人员。大家是否遇到过这类事情:

  1. 系统中不同程序需要使用到OCX的不同版本,如A程序使用V1.OCX,B程序又必须要用V2.OCX
  2. 由于某些原因,不能注册OCX

二、不注册OCX完成调用

2.1 Aximp 生成代理dll

aximp file.ocx

  如下:

**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.14
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************

C:\Windows\System32>aximp "C:\Users\Administrator\Desktop\Flash.ocx"
生成的程序集: C:\Windows\System32\ShockwaveFlashObjects.dll
生成的程序集: C:\Windows\System32\AxShockwaveFlashObjects.dll

C:\Windows\System32>

  此工具会自动随 Visual Studio 一起安装。 若要运行此工具,请使用 Visual Studio 开发人员命令提示(或 Windows 7 中的 Visual Studio 命令提示)。

2.2 mt 生成清单文件

C:\Windows\System32>mt -tlb:"C:\Users\Administrator\Desktop\Flash.ocx" -dll:"-tlb:"C:\Users\Administrator\Desktop\Flash.ocx"" -out:"C:\Users\Administrator\Desktop\Flash.manifest"

  将生成如下类似内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="-tlb:C:\Users\Administrator\Desktop\Flash.ocx" hashalg="SHA1"><comClass clsid="{D27CDB6E-AE6D-11CF-96B8-444553540000}" tlbid="{D27CDB6B-AE6D-11CF-96B8-444553540000}" description="Shockwave Flash"></comClass><comClass clsid="{D27CDB71-AE6D-11CF-96B8-444553540000}" tlbid="{D27CDB6B-AE6D-11CF-96B8-444553540000}" description="IFlashObjectInterface Interface"></comClass><comClass clsid="{E0920E11-6B65-4D5D-9C58-B1FC5C07DC43}" tlbid="{D27CDB6B-AE6D-11CF-96B8-444553540000}" description="FlashObject Class"></comClass><typelib tlbid="{57A0E746-3863-4D20-A811-950C84F1DB9B}" resourceid="2" version="1.1" helpdir="" flags="HASDISKIMAGE"></typelib></file><comInterfaceExternalProxyStub name="IShockwaveFlash" iid="{D27CDB6C-AE6D-11CF-96B8-444553540000}" tlbid="{57A0E746-3863-4D20-A811-950C84F1DB9B}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub></assembly>

  此工具同样自动随 Visual Studio 一起安装。

2.3 加载调用

  1. .NET项目引用Aximp生成的两个dll,可以直接使用其包含类型定义。
  2. .NET项目右键-添加项-应用程序清单文件,将生成app.manifest文件。
  3. 复制mt生成的清单内容 <file>节点到</assembly>结尾的内容替换app.manifest文件末尾的</assembly>
  4. 将OCX文件及相关引用一起放到程序相对目录下,并将<file>节点下的name属性修改为相对路径。
文章目录