vc下调试activex控件

作者在 2010-07-19 00:18:12 发布以下内容
vc下调试activex控件

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

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

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

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

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

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luhuillll/archive/2009/07/07/4328248.aspx

如何调试和使用ActiveX控件。

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

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

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

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

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

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

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

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

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

 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)

可以使用如下方式调用:

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

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

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

 

 OCX 控件注册

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

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

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

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


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

方法三:API函数注册

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

1、使用Windows API函数LoadLibrary载入ActiveX控件;
2、使用GetProcAddress函数获取ActiveX控件中 注册函数DllRegisterServer(注销函数为DllUnregisterserver)指针;
3、使用CallWindowProc函数执行已载入内存的 ActiveX控件注册函数(DllRegisterServer、UnDllregisterServer)。

示例:

typedef int (CALLBACK* MYFUNCTION)(void);
MYFUNCTION  MyFunction = NULL;
HINSTANCE handle = NULL ;
handle = LoadLibrary("TRDragDropTreeCtrl.ocx");
if( handle != NULL )
{
  MyFunction = GetProcAddress(handle,"DllRegisterServer");
  if( MyFunction != NULL )
  {
    MyFunction();
  }
}

小 小经验:
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版本一致
  通过代码动态注册OCX控件
1. 在APP初始化中:
if (FAILED(OleInitialize(NULL)))
{
AfxMessageBox("OLE initialization failed.Make sure that the OLE libraries are the correct version.") ;
return FALSE ;
}

2.在需使用的对话框及程序开头处加入

#ifdef _WIN32
#define LOADLIBRARY_FAILED(x) (x == 0)
#else
#define LOADLIBRARY_FAILED(x) (x <= HINSTANCE_ERROR)
#endif

//定义函数地址
STDAPI DllRegisterServer(void) ;
STDAPI DllUnregisterServer(void) ;
typedef HRESULT (STDAPICALLTYPE *CTLREGPROC)();

3. 定义注册函数
BOOL CNetMeetDlg::Register(CString strOcx)   //strOcx为需注册的OCX名称
{
              BOOL bResult = FALSE;
              HMODULE hModule = ::LoadLibrary(strOcx) ;
              if (LOADLIBRARY_FAILED(hModule)) return FALSE ;
              //获得注册函数地址
              CTLREGPROC DLLRegisterServer =
           (CTLREGPROC)::GetProcAddress(hModule,"DllRegisterServer" ) ;
              if (DLLRegisterServer != NULL)
              {
                     HRESULT regResult = DLLRegisterServer() ;
                     bResult = (regResult == NOERROR) ;
              }
              ::FreeLibrary(hModule) ;
        return bResult;

}

4.在需注册的地方加入Register(“name.OCX”);
 
技术 | 阅读 8125 次
文章评论,共1条
vfdff(作者)
2010-07-19 00:20
1
关于控件注册和使用许可问题的解决办法<br />
<br />
作者:catclaw2000<br />
  鉴于前一段时间受困于微软控件的授权问题,而且互联网上也很难找到问题的解决方案,这两天论坛中也不停有网友在问相类似的问题,特撰写此文,以飨VCKBASE各位网友。 <br />
  大家都知道,对于普通的OCX控件,我们在发布时,使用安装软件拷贝到目标机器上然后再注册一下(或者手工拷贝然后用Regsvr32注册)就可以了 。<br />
  但是对于微软提供的一些控件,比如 Microsoft ADO Control,Microsoft Datagrid Control等等,常常发现,在开发的机器上使用的好好的 ,但使用正常的发布流程,发布到目标机器上,就会出现“没有注册类别”的提示 ,软件无法使用等等问题。<br />
  究其原因,在于微软为了防止其软件被非法发布,所以增加了许可机制(license);按理说,只有开发环境才需要许可,而在目标码的环境中,应用程序可以正常使用的,只不过不能被其他的开发工具打开;为什么会与微软原先的想法违背,我就不得而知了。让咱们进入正题,说说如何解决这个问题。<br />
  首先,必须弄清楚许可信息的存储位置,告诉你,就在HKEY_CLASSES_ROOT\Licenses目录下。   接下来,需要知道哪个控件使用的是什么注册信息,在vs.net安装盘的一个目录Extras\VB6 Controls下,有一个注册文件vb6controls.reg,记录了VB6的大多数控件 的许可信息,下面是此文件的内容: <br />
REGEDIT<br />
HKEY_CLASSES_ROOT\Licenses = Licensing: Copying the keys may be a violation of established copyrights.<br />
<br />
// Masked Edit Control 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\BC96F860-9928-11cf-8AFA-00AA00C00905 = mmimfflflmqmlfffrlnmofhfkgrlmmfmqkqj <br />
<br />
// Chart Control 6.0 (OLEDB) license key<br />
HKEY_CLASSES_ROOT\Licenses\12B142A4-BD51-11d1-8C08-0000F8754DA1 = aadhgafabafajhchnbchehfambfbbachmfmb<br />
<br />
// Common Dialog Control 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905 = gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqj<br />
<br />
// ADO Data Control 6.0 (OLEDB) license key<br />
HKEY_CLASSES_ROOT\Licenses\C4145310-469C-11d1-B182-00A0C922E820 = konhqhioohihphkouimonhqhvnwiqhhhnjti<br />
<br />
// Common Controls-3 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\38911DA0-E448-11D0-84A3-00DD01104159 = mcpckchcdchjcjcclidcgcgchdqdcjhcojpd<br />
<br />
// Windows Common Controls-2 5.0 (SP2) license key<br />
HKEY_CLASSES_ROOT\Licenses\9E799BF1-8817-11cf-958F-0020AFC28C3B = uqpqnqkjujkjjjjqwktjrjkjtkupsjnjtoun<br />
<br />
// Windows Common Controls license key<br />
HKEY_CLASSES_ROOT\Licenses\57CBF9E0-6AA7-11cf-8ADB-00AA00C00905 = aahakhchghkhfhaamghhbhbhkbpgfhahlfle<br />
<br />
// Data Bound Grid Control 5.0(SP3) license key<br />
HKEY_CLASSES_ROOT\Licenses\556C75F1-EFBC-11CF-B9F3-00A0247033C4 = xybiedobrqsprbijaegcbislrsiucfjdhisl<br />
<br />
// Data Bound List Controls 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\096EFC40-6ABF-11cf-850C-08002B30345D = knsgigmnmngnmnigthmgpninrmumhgkgrlrk<br />
<br />
// Internet Transfer Control 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\78E1BDD1-9941-11cf-9756-00AA00C00908 = yjrjvqkjlqqjnqkjvprqsjnjvkuknjpjtoun<br />
<br />
// Multimedia Control 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\B1EFCCF0-6AC1-11cf-8ADB-00AA00C00905 = qqkjvqpqmqjjpqjjvpqqkqmqvkypoqjquoun<br />
<br />
// Chart Control 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\7C35CA30-D112-11cf-8E72-00A0C90F26F8 = whmhmhohmhiorhkouimhihihwiwinhlosmsl<br />
<br />
// Windows Common Controls-2 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\4F86BADF-9F77-11d1-B1B7-0000F8753F5D = iplpwpnippopupiivjrioppisjsjlpiiokuj<br />
<br />
// Windows Common Controls 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\ED4B87C4-9F76-11d1-8BF7-0000F8754DA1 = knlggnmntgggrninthpgmnngrhqhnnjnslsh<br />
<br />
// Comm Control 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905 = kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun<br />
<br />
// DataGrid Control 6.0 (OLEDB) license key<br />
HKEY_CLASSES_ROOT\Licenses\CDE57A55-8B86-11D0-b3C6-00A0C90AEA82 = ekpkhddkjkekpdjkqemkfkldoeoefkfdjfqe<br />
<br />
// DataList Control 6.0 (OLEDB) license key<br />
HKEY_CLASSES_ROOT\Licenses\A133F000-CCB0-11d0-A316-00AA00688B10 = cibbcimbpihbbbbbnhdbeidiocmcbbdbgdoc<br />
<br />
// DBWin license key<br />
HKEY_CLASSES_ROOT\Licenses\D015B071-D2ED-11d0-A31A-00AA00688B10 = gjdcfjpcmjicjcdcoihcechjlioiccechepd<br />
<br />
// MSDBRPT license key<br />
HKEY_CLASSES_ROOT\Licenses\9DF1A470-BA8E-11D0-849C-00A0C90DC8A9 = cchcqjejhcgcqcfjpdfcdjkckiqikchcojpd<br />
<br />
// FlexGrid Control 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\1F3D5522-3F42-11d1-B2FA-00A0C908FB55 = gcfjdjecpchcncdjpdejijgcrdoijjfcieod<br />
<br />
// MAPI Controls 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\899B3E80-6AC6-11cf-8ADB-00AA00C00905 = wjsjjjlqmjpjrjjjvpqqkqmqukypoqjquoun<br />
<br />
// MSRDO 2.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\B1692F60-23B0-11D0-8E95-00A0C90F26F8 = mjjjccncgjijrcfjpdfjfcejpdkdkcgjojpd<br />
<br />
// RemoteData Control 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\43478d75-78e0-11cf-8e78-00a0d100038e = imshohohphlmnhimuinmphmmuiminhlmsmsl<br />
<br />
// Windowless Controls 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\80E80EF0-DBBE-11D0-BCE2-00A0C90DCA10 = qijimitpmpnpxplpvjnikpkpqoxjmpkpoivj<br />
<br />
// PictureClip Control 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\6FB38640-6AC7-11cf-8ADB-00AA00C00905 = gdjkokgdldikhdddpjkkekgknesjikdkoioh<br />
<br />
// Rich TextBox Control 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\DC4D7920-6AC8-11cf-8ADB-00AA00C00905 = iokouhloohrojhhhtnooiokomiwnmohosmsl<br />
<br />
// Sheridan Tab Control license key<br />
HKEY_CLASSES_ROOT\Licenses\190B7910-992A-11cf-8AFA-00AA00C00905 = gclclcejjcmjdcccoikjlcecoioijjcjnhng<br />
<br />
// SysInfo Control 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\E32E2733-1BC5-11d0-B8C3-00A0C90DCA10 = kmhfimlflmmfpffmsgfmhmimngtghmoflhsg<br />
<br />
// Winsock Control 6.0 license key<br />
HKEY_CLASSES_ROOT\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d = mlrljgrlhltlngjlthrligklpkrhllglqlrk<br />
  通常我们只要把这个文件导入到目标机器的注册表,即可解决困扰我们的控件授权问题了。不过在我的使用过程中发现有两个问题:<br />
1.&nbsp; &nbsp; &nbsp; &nbsp; 这里面的注释信息不准确,即可能标注是某个控件的许可,但用这个许可根本不行,不知道是微软故意的还是弄错了,比如 FlexGrid Control 6.0 的 许可应该是:HKEY_CLASSES_ROOT\Licenses\72E67120-5959-11cf-91F6-C2863C385E30=ibcbbbebqbdbciebmcobmbhifcmciibblgmf <br />
2.&nbsp; &nbsp; &nbsp; &nbsp; 许可信息不全,也就是说, 有一些控件的许可信息在这个文件里根本没有; <br />
  那我们怎么办呢?苦恼ing...。一拍脑袋,有了,既然我们已经知道其在注册表中的位置、并且在开发的机器上使正常的,何不直接从开发机器上把整个licenses目录下的注册信息都导出来,然后再导入到目标机器上,既省事,还不怕有漏网之鱼 :)呵呵,大家都明白了吧?<br />
  初次写文章,错误在所难免,欢迎各位指正。还有,本文仅供学习交流使用,希望不会侵犯微软的版权。
游客请输入验证码
浏览1943003次