永利平台娱乐首先是到其ocx所在的目录去找这个

2020-01-05 19:23 来源:未知

vc下调试activex控件

方法一:在dos或Windows命令行下运行:regsvr32 ocxname.ocx 注册

VC++编写ActiveX控件

OCX和DLL的区别,OCXDLL区别

 

转自:   

OCX和DLL的区别

一、关于DLL的介绍 
 
    DLL,动态链接库,Dynamic Link Library的缩写,是一个包含函数和数据的模块集合,可以被其它应用程序共享的程序模块。DLL作为共享函数库的可执行文件,封装了一个或多个已被编译、链接的函数。多个进程可以同时使用一个 DLL,在内存中共享该 DLL 的一个副本。DLL 还有助于共享数据和资源。   它和可执行文件(.EXE文件)非常类似,他们的区别在于 DLL 中虽然包含了可执行代码却不能单独执行,只能由需要使用它的应用程序来直接或间接调。[1]

    通俗的说,在Windows操作系统中,许多应用程序并不是一个完整的可执行文件,它们的正确执行需要调用一些相对独立的动态链接库,即DLL文件。一个应用程序可以调用多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享 DLL 文件。[2]DLL 文件一般被存在C:WindowsSystem 目录下,也可能放在应用程序所在的目录或是子目录中。

   提到动态链接,先说明一下静态连接。什么是静态连接呢?在程序链接的过程中,需要将编译后的二进制代码链接成目标代码,链接器从静态链接库中获得所有被引用的函数,并将这些被引用的函数同代码一起放到可执行文件中。那么关于 DLL 的静态连接则是指链接器将被引用的库函数的代码复制到调用 DLL 的可执行模块(.dll 文件或 .exe 文件)中。

  什么是动态链接呢?动态链接是系统允许可执行模块(.dll 文件或 .exe 文件)在运行程中,只需要包含在定位 DLL 函数的可执行代码所需的信息。换句话说,可执行模块(.dll 文件或 .exe 文件)在运行时加载这些模块(亦即所需的模块映射到调用进程的地址空间)。[3]

   那么动态链接和静态连接 相比,优点有哪些呢?

    (1)节省内存,减少交换操作。使用动态链接,多个进程可以同时使用一个 DLL,在内存中共享该 DLL 的一个副本。使用静态链接,每个应用程序都包含被引用的库函数的代码,那么Windows 必须在内存中为每个应用程序加载引用的库函数的代码的一个副本。 
    (2)节省磁盘空间。使用动态链接,在磁盘上仅需要 DLL 的一个副本。使用静态链接,每个应用程序都包含被引用的库函数的代码。 
    (3)更易于升级。使用动态链接,DLL 中的函数发生变化时,只要函数的参数和返回值没有更改,就不需重新编译或重新链接使用它们的应用程序。使用静态链接,在函数发生变化时,需要重新链接来生成应用程序。
    (4)支持多语言程序,只要程序遵循函数的调用约定,用不同编程语言编写的程序就可以调用相同的DLL 函数。
    (5)提供扩展 MFC 库类的机制。可以从现有 MFC 类派生类,并将它们放到 MFC 扩展 DLL 中供 MFC应用程序使用。 
    (6)支持多语言程序,并使国际版本的创建轻松完成。通过将资源放到 DLL 中,创建应用程序的国际版本变得容易得多。可将用于应用程序的每个语言版本的字符串放到单独的 DLL 资源文件中,并使不同的语言版本加载合适的资源。[4]

  DLL 中包含下面两类函数的定义: 
  导出函数:这些函数由可执行模块(.dll 文件或 .exe 文件)调用。
  内部函数:这些函数仅从定义它们的 DLL 中调用。DLL 还导出数据。不过,这些数据由相应的函数使用。

   可以通过下列方式调用 DLL 中的函数:  
    加载时动态链接:可执行模块执行显式调用以导出 DLL 函数。为 DLL 创建导入库,然后将 DLL 链接到应用程序。在加载应用程序时,导入库提供加载 DLL 和查找导出的 DLL 函数所需的信息。
    运行时动态链接:在运行时加载 DLL 时,可执行模块使用 LoadLibrary 函数或 LoadLibraryEx 函数。可执行模块调用 GetProcAddress 函数以获取导出的 DLL 函数的地址。在链接时,Windows 搜索预安装的一组 DLL,例如性能库 (Kernel32.dll) 和安全库 (User32.dll)。然后,Windows 按以下顺序搜索DLL: 
1.当前进程的可执行程序所在的目录。
2.当前目录。
3.Windows 系统目录。(GetSystemDirectory 函数获取 Windows 系统目录的路径。)
4.Windows 目录。(GetWindowsDirectory 函数获取 Windows 目录的路径。)
5.PATH 环境变量中列出的目录。注意:LIBPATH 环境变量不用于搜索。[3]

    DLL 有一个特殊的入口点(DllMain 函数),它在附加和分离进程和线程时运行。此行为允许根据需要创建和销毁数据结构。文件扩展名为 .ocx、.cpl 和 .drv 的文件类型也是 DLL,尽管文件扩展名已改变。
    您可以通过创建 DLL 实现以下目的:
    (1)将程序划分为可按需加载的单独模块。 
    (2)存储特定于语言或特定于区域的资源。 
    (3)使您自己的应用程序能够使用核心代码库。 
    (4)生成进程内 COM 对象或 ActiveX 控件 (OCX)。 
    (5)将 OLE 对象用作进程内 DLL。这一用法可改进 OLE 链接的性能。 
    (6)使用控制面板扩展或使用某些类型的驱动程序。 [3]

二、关于以.ocx为后缀名的ActiveX控件

    刚才提到过,文件扩展名为 .ocx、.cpl 和 .drv 的文件类型也是 DLL。

    现在的ActiveX 控件等价与以前的OLE控件或OCX,一个典型的控件包括设计时和运行时的用户界面,唯一的IDispatch接口定义了控件的属性和方法,唯一的 IConnectionPoint接口定义控件可引发的事件。一个控件可以在容器中运行,所以从运行的角度看它类似与一个DLL。[5]

    尽管 ActiveX 和 OLE 都基于组建对象模型(Component Object Model,COM),它们为程序员提供的却是截然不同的服务。COM提供的是低级的对象捆绑机制,该机制支持对象之间的交互通讯。OLE使用COM来提供低级的应用服务,例如采用连接和嵌入机制,支持用户创建复合文档。与之不同,ActiveX提供更精细的结构,用以支持在网络站点上嵌入控件,以及对事件的交互反应。优化ActiveX,目的是为了提高时间和空间效率,而优化OLE,是为了便于终端用户的使用和集成台式系统的应用程序。ActiveX还为Internet技术带来了一些技术上的变革,例如,ActiveX大大减小了代码量(代码量减少了百分之五十到七十),支持更多的提交和异步连接。 [6]

   ActiveX的基础是OLE和COM,但是通过MS的各种开发工具可以屏蔽掉COM模型中许多另人费解的技术细节。ActiveX组件技术包括以下一些方面:(1)自动化服务器 (2)自动化控制器 (3)控件 (4)COM对象 (5)文档 (6)容器 。

   以.ocx为后缀名的ActiveX控件主要应用在WEB上和Window Forms程序开发上。应用程序使用ActiveX/COM组件来扩展自身的业务逻辑、事务处理和应用服务的范围。

   顺便提一下以.ocx为后缀名的ActiveX控件的注册和卸载方法,在“开始”菜单的“运行”输入以下代码完成任务:
    regsvr32 path & "xxx.ocx" '注册
    regsvr32 /u path & "xxx.ocx" '卸载

    其中path代表该xxx.ocx所以在的目录的路径。

三、OCX和DLL的区别

   以.ocx为后缀名的ActiveX控件是一种比较特殊的DLL,它的基础是OLE和COM,是有交互界面的可视化控件,定义了控件的属性和方法,定义控件可引发的事件的响应。我们通常说的.DLL为后缀名的文件是一个包含函数和数据的模块集合,可以被其它应用程序共享的程序模块。

---恢复内容结束---

转自: OCX和DLL的区别 一、关于DLL的介绍 DLL,动态链接库,Dynamic Lin...

 在vc下调试activex控件.出现了First-chance   exception   in   xxx.exe   (KERNEL32.DLL):   0xE06D7363:   Microsoft   C++   Exception.异常.

示例:
regsvr32 netshare.ocx     //注册netshare.ocx控件
regsvr32 /u netshare.ocx //解除netshare.ocx控件的注册

作者:一点一滴的Beer

实际上在vc下一般利用TSTCON32.EXE调试控件.目前我的程序底层封装成dll.留接口给ocx调用.这里在你按F5调式ocx的时候,一般会选择调试方式.选择TSTCON32.EXE去调试控件.

如果netshare.ocx文件不在system目录时,还必须在文件名前加上完整的路径。除了regsvr32应用程序之外,Microsoft在它 的 web 站点上还提供了一个称为regclean.exe 的程序,可以检查注册表并去掉丢失的组件在注册表中的条目。regclean.exe 除了可以删除 “悬挂” 的条目,它还提供一个“undo” 文件帮助恢复错误的删除。

 

出现问题最终解决了,是我没有把动态库和ocx放在同一个目录下.导致ocx不能创建成功.

用 regsvr32.exe 注册 activeX 控件虽然简单,但需要用户手工进行注册,在不用时还需手工解除注册。

前言:

我总以为单步调试dll应该是在和工程的路径在同一个目录下,但是实际上的调试结果让我失望.vc把调试权利给了TSTCON32.EXE,因为编译ocx的时候就已经注册过了.TSTCON32.EXE调用ocx,启动ocx的时候,首先是到其ocx所在的目录去找这个动态库

方法二:用 install shield,在里面选 “self-registered”,安装程序将自动注册;

     暑假在做一个项目的时候,本来是用C#.NET来写的一个港口进出闸的流程控制程序,里面涉及一个响应用PLC的采集信息的问题(PLC用串口和工控机相连接),然后思考如何用C#写串口通讯程序,结果师兄在一旁直接用VC++写了一个“*.ocx控件”,并在自己的电脑上进行了测试,完工后就把生成的“*.ocx”控件注册文件复制到了我们的电脑上。我们就在C#.NET程序里面将此控件拖入到主窗口中,然后就能直接利用此控件的事件来捕捉PLC的命令了,感觉好神奇。然后,我对C++的态度有了极大的转变,以前只知道C++写窗口程序是多么麻烦啊(远不如C#.NET来得快和直接),而它的所谓“比较底层,和底层操作系统的关系比C#这些高级语言要密切很多”的好处一直都没有体会到,现在才知道,正是因为C++比较底层,比较基础,所以它可以开发出很多和语言无关的公用程序块,如dll动态链接库和COM组件,原则上,只要你的Windows的系统,用VC++开发出来的这些公用程序块就能被任何语言调用(如果不用MFC框架,而用ATL框架来编写,甚至还可以脱离Windwos系统,不仅仅实现跨语言,甚至跨平台调用,这个笔者就没有仔细研究了)。

以上是个人理解,不知道有没有偏差

方法三:api 函数注册
此方法的设计思路是:先将 activeX 控件载入内存,然后验证其有效性,最后直接在内存地址中执行其注册函数(DllRegisterServer、 DllUnregisterServer)。
其编程方法是:

     本人大学本科所学本来是电子技术的工业自动化,结果中途做的几次项目都是“纯软件”,这次暑假的经历,终于让我在“硬件”和“软件”之前找到一个连接交汇点了。

 

1、使用Windows api 函数Loadlibrary 载入activeX 控件;
2、使用GetProcAddress 函数获取activeX 控件中注册函数DllRegisterServer(注销函数为 DllUnregisterServer)指针;
3、使用CallwindowProc 函数执行已载入内存的activeX 控件注册函数(DllRegisterServer、 DllUnregisterServer)。

永利平台娱乐 1

本文来自CSDN博客,转载请标明出处:

示例:

     以前做电子产品只是为了实现功能,现在发现这远远不够,按照目前的时代潮流,一个系统除了要功能完备化,还要信息化 ,信息化就涉及到数据采集、存储、分析和显示。当然如果你不是做系统的,那么你也不必去用全局的眼光去看待这个问题,但你做了电子产品后,却不能让它的功能仅仅局限于在现场完成一些自动控制,而应该开发出和设备相关的上层API,供广大的非电子专业的上层程序员进行二次开发,在PC上层平台上对数据信息进行更好的组织和处理。而提供的API最好是具有较好的移植性,以适应不同企业的不同语言的程序员。而COM组件技术很好地解决了这个问题。

如何调试和使用ActiveX控件。

typedef int (callback* myfunction)(void);
myfunction   myfunction = null;
hinstance handle = null ;
handle = LoadLibrary("trdragdroptreectrl.ocx");

    说到跨语言的模块化程序设计,在本文之前发表的一篇《VC++的DLL应用(含Demo演示)》中讲了dll的创建方法,用户可以将一些公用函数放在dll源文件中,然后编译生成一个dll文件,供程序动态加载连接并调用里面的函数,这个也可以跨语言地进行调用。但dll有自己的局限性,就是没有事件,而这个时候ActiveX控件就隆重登场了,同样能够跨语言使用,ActiveX可以提供方法,属性甚至是事件(当然对比dll也有缺点,它不是单独的文件,无法动态加载和卸载)。

  由于控件并不能单独运行,所以你必须利用另一个程序来装载控件并进行调试,VC中提供了ActiveX容器供使用,在工程/设置菜单(project/setting)中选择Debug页并选择ActiveX Container。

if( handle != null )
{
myfunction = GetProcAddress(handle, "DllRegisterServer");
if( myfunction != null )
{
myfunction();
}
}

     因为笔者现在只是学习这个技术并作为一个技术积累,而没有对这个技术进行原理上的深入研究,所以很多术语可能完全是错误的,希望高手看到后,不吝踢教和指正,也能防止本文误认“子弟”了。本文中,作者是把ActiveX,COM,OCX当作相同的概念来对待的,可能不妥,请见识,如果想细究其具体的区别,请参考文章:

  然后开始调试,进入Container时VC会提示Container中是没有调试代码的错误,不用理会并继续。

方法四:代码调用regsvr32.exe

Activex、OLE、COM、OCX、DLL之间有什么区别?

http://fykyx521.javaeye.com/blog/446275

  进入Container后首先要装载你所需要调试的控件,选择菜单Edit/Insert OLE Control...,在弹出的对话框中选择你需要插入的控件。

//vb写法

 

如果Container 成功创建了控件在屏幕中就会显示出控件,根据上节的内容我们可以看到控件中显示了一串字符,接下来我们需要测试一下控件所提供的方法是否能够正确运行。请 选择菜单Edit/Invoke Methods...,在弹出的对话框上选择你要使用的方法,但你选择了方法后,对话框上的参数输入区会显示输入参数的列表,你输入参数后按下 Invoke按钮就可以执行。

shell "regsvr32.exe 控件.ocx /s "

    其实不管你是否了解它们之前的区别,都无所谓,因为本文只是讲解如何从零开始学习并应用这门技术来解决实际问题,大家只需要知道实现步骤就OK了。

  在调试时你可以如同调试其他程序一样在代码中使用TRACE宏,也可以设置断点。

//vc写法

好,多的话不说了,下面开始介绍ActiveX这门技术的实现方式。

其实你在插入控件时会看见其他在系统中已经注册的控件,如果有兴趣可以自己试试加载几个看看效果。

::ShellExecute(NULL,NULL,"regsvr32.exe","/s D:\新建文件夹\TEST\TEST\Release\TEST.reg ",NULL,NULL);

 

如果要在VC 的工程中使用已经存在的ActiveX控件,最简单的方法就是利用VC的插入功能,在菜单中选择Project/Add To Project/Component and Control(在不同版本的VC中可能菜单位置不同),然后选择插入的控件,VC会为你生成这个控件的定义文件,当然和你最开始编写的会完全不一样,但 是没有关系。你会在定义文件看见这个控件所实现的方法和属性,这些都可以让你通过函数的方式进行调用。(所以在使用控件时如果没有该控件的说明是很难使用 的)

//添加REG文件进入注册表

 

还有一种方法就是在对话框中插入一个控件。如果该控件的定义文件没有生成VC也可以帮助你生成。

::ShellExecute(NULL,NULL,"regedit.exe","/s D:\新建文件夹\TEST\TEST\Release\TEST.reg ",NULL,NULL);

 

  在对话框中的控件是不需要手工创建的,但是如果你希望在其他地方创建窗口就需要调用控件的创建函数,其实这个函数很简单,和CWnd::Create函数定义的区别不大。定义为:

注释:/s标题不弹出消息框。

 

 class CATLSam : public CWnd{BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,                  const RECT& rect, CWnd* pParentWnd, UINT nID,                  CFile* pPersist = NULL, BOOL bStorage = FALSE,                  BSTR bstrLicKey = NULL)。

 

正文:

可以使用如下方式调用:

小小经验:
1、有时候在程序中使用ocx控件时失效,检查一下调用之间是否执行了afxoleinit()。如果使用了容器,还需要保证执行了 afxEnableControlContainer()
2、使用Activex Control Test Container 可以很方便地测试制作出来的ocx控件(从开始菜单-》程序-》Microsoft Visual Studio 6.0 -> Microsoft Visual Studio 6.0 Tools 可以看到该工具)
3、有时候控件制作的没有问题,注册方式也对,但是注册的时候确失败了,可能时dll的版本不对,使用Dependencies查看ocx控件依赖dll是否跟现在使用的dll版本一致。

永利平台娱乐,     ActiveX这门技术是通过生成“*.ocx”文件来实现的。先来了解下OCX文件,在百度百科上面对OCX是这样解释的:

Create("window text",WS_CHILD|WS_VISIBLE|WS_BORDER,CRect(0,0,200,200),this,1001);

regsvr32.exe 命令说明和参数

     “.ocx是ocx控件的扩展名,OCX 是对象类别扩充组件。如果你用过Visual Basic或者Delphi一类的可视化编程工具,那么对控件这个概念一定不会陌生,就是那些工具条上的小按钮,如EditBox,Grid,ImageBox,Timer等等。每个控件都有自己的事件、方法和属性。使用了控件的编程非常容易。首先,在程序的设计阶段可以设置一些属性,如大小,位置,标题(caption)等等;在程序运行阶段,可以更改这些属性,还可以针对不同的事件,调用不同的方法来实现对该控件的控制。控件就好像一块块的积木,程序要做的事只是将这些积木搭起来。控件的最大好处是可以重复使用,甚至可以在不同的编程语言之间使用,例如你可以在VB中嵌入用VC开发的控件。”

  由于是CWnd的派生类所以CWnd的相关功能都可以使用。在程序中创建了控件窗口后就可以调用控件的各种方法(对属性的控制也是通过函数调用来实现的,在前面的教程中我们已经认识到这点)。

“regsvr32 [/s] [/n] [/i(:cmdline)] dllname”。其中dllname为activex控件文件名,建议在安装前拷贝到system文件夹下。

     里面最后一句话比较重要,就是用VC开发的OCX控件,你可以在其它语言里面都能调用,这样很好的实现了功能化组件的良好循环使用,而且还可以实现跨语言地调用(例如,你完全可以用C#调用C++开发的OCX控件)。

  在控件创建后就可以使用控件的各种属性和方法,由于控件是你自己编写的所以调用起来应该不会有什么问题。

参数有如下意义:

     下面开始介绍,如何用VC++一步步生成你想要的“*.ocx”文件。

 

/u——反注册控件

 

 OCX 控件注册

/s——不管注册成功与否,均不显示提示框

1. 建立最简单的ocx文件并进行调试

方法一:
在DOS 或Windows命令行下运行:regsvr32 ocxname.OCX 注册。

/c——控制台输出

1.1 建立最简单的ocx文件

示例:
regsvr32 netshare.ocx     //注册netshare.ocx控件
regsvr32 /u netshare.ocx    //解除netshare.ocx控件的注册

/i——跳过控件的选项进行安装(与注册不同)

    VC->新建项目->MFC ActiveX WinZard

如 果netshare.ocx文件不在system目录时,还必须在文件名前加上完整的路径。除了regsvr32应用程序之外,Microsoft在它的 Web站点上还提供了一个称为regclean.exe的程序,可以检查注册表并去掉丢失的组件在注册表中的条目。regclean.exe除了可以删除 “悬挂”的条目,它还提供一个“undo”文件帮助恢复错误的删除。

/n——不注册控件,此选项必须与/i选项一起使用

永利平台娱乐 2

用regsvr32.exe注册ActiveX控件虽然简单,但需要 用户手工进行注册,在不用时还需手工解除注册。

执行该命令的方法:

     一路点击“确定”,直到点击“完成”。最后VC++会自动生成一些文件,这些文件就构成了ActiveX的基本模板,文件的主要结构如下:

方法二:用Install Shield,在里面选“Self-Registered”,安装程序将自动注册。

1、可以在“开始”--“运行”,调出运行的对话框,也可以使用Win+R热键,然后直接在输入栏输入即可

永利平台娱乐 3

方法三:API函数注册

2、在开始--运行 输入cmd,调出‘命令提示符’窗口,然后再执行regsvr32命令。

    直接编译一下,然后在Debug目录下面就会生成一个名为“ocxDemo.ocx”的控件注册文件,然后利用“regsvr32”命令就可以实现本机对此控件的注册,然后就可以使用本语言或者跨语言编写程序时引用此控件来实现相应的功能(后面将会讲到)。

此方法的设计 思路是:先将ActiveX控件载入内存,然后验证其有效性,最后直接在内存地址中执行其注册函数(DllRegisterServer、 UnDllregisterServer)。其编程方法是:

 

1.2 ocx调试方法:

TAG标签:
版权声明:本文由永利平台娱乐发布于关于我们,转载请注明出处:永利平台娱乐首先是到其ocx所在的目录去找这个