使用ActiveX组件的应用程序打包要注意

以前做了个项目,因为要调试所以在使用该程序的机器上也装上了vc6.0,最近机器重装之后应用程序就没法有运行了,登陆时候一点确定程序就不见了,而且任务管理器里也找不到该程序进程,郁闷了两三天才知道原来是打包的时候ActiveX组件得注册,终于搞定了,记录下注册组件的方法!

 

 

 

怎么注册MSCOMM32.OCX

方法一:在DOS或Windows命令行下运行:regsvr32   mscomm32.ocx   注册  
   
  示例:  
   
    regsvr32   mscomm32.ocx             //注册mscomm32.ocx   控件  
   
      regsvr32   /u   mscomm32.ocx           //解除mscomm32.ocx   控件的注册  
   
  如果mscomm32.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();  
   
  }  
   
                }  
转自:http://topic.csdn.net/t/20041209/18/3631245.html

关于注册mscomm程序的编写

前一段用了mscomm控件编写程序,但是部署到新的设备上时需要手工注册控件,很是麻烦,能不能编写一个Winapi的程序自动注册呢?所以就自己写了一个程序。
  原理:如何手工来注册安装MSComm控件。
  第一步:将Mscomm.srg, Mscomm32.ocx,Mscomm32.dep三个文件复制到系统文件夹中。要注意的是,MSComm控件是要授权的,所以必须将其使用“执照”Licence 在注册表中登记注册,下一步就是注册方法。至于为什么要这样做,可以看看下面的网页:http://support.microsoft.com/support/kb/articles/q151/7/71.asp
  第二步:用Windows下的注册工具regsvr32注册该OCX控件,点击“开始”->"运行",再在中填入(假设操作安装在C盘,WIN2000):
   Regsvr32 C:winntsystem32Mscomm32.ocx
   第三步:在注册表中手工新建一个主键项:先在点击“开始”->"运行",再在中填入regedit命令打开注册表,找到HKEY_CLASSES_ROOT/Licenses,在其中添加主键
  4250E830-6AC2-11cf-8ADB-00AA00C00905并将内容设置为:
  kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun
  (注:这项内容也可以用记事本程序打开Mscomm.srg文件看到)
  这是手工注册的过程,非常繁琐。我得程序也是按照这个顺序执行的。
  源代码:
  //
  #include <windows.h>
  #include <stdio.h>
  #include <string.h>
  void CPFile(char file);
  void regsted();
  void regOCX();
  void CPFile(char file[],char tarpath[]) //将三个文件拷贝到系统目录
  {
  char tempsys[100];
   char *r;
  char *t;
  r=tarpath;
  t=tempsys;
  strcpy(t,r);
  char path[256];
  char *p;
  char *q;
   GetModuleFileName(GetModuleHandle(NULL),path,sizeof(path));
   p = path;
  while(strchr(p,'//'))
  {
   p = strchr(p,'//');
   p++;
  }
   *p = '/0';
  p=strchr(path,'/0');
   q=file;
  strcpy(p,q);
  
   p=strchr(tempsys,'/0');
  *p = '//';
   p++;
   q=file;
  strcpy(p,q);
  
  CopyFile(path,tempsys,FALSE);
  }
  void regsted() //将相关信息写入注册表
  {
  HKEY hKey;
   DWORD dwDip;
  LPBYTE owner_Get=new BYTE[80];
  DWORD type_1=REG_SZ;
  DWORD cbData_1=80;
  long exist=RegQueryValueEx(HKEY_CLASSES_ROOT, "Licenses//4250E830-6AC2-11cf-8ADB-00AA00C00905", NULL, &type_1, owner_Get, &cbData_1);
   if(exist!=ERROR_SUCCESS)
  {
   long ret = RegCreateKeyEx(HKEY_CLASSES_ROOT,"Licenses//4250E830-6AC2-11cf-8ADB-00AA00C00905",0l,NULL,REG_OPTION_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&dwDip);
   DWORD leng=37;
   char key[37]="kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun";
   LPBYTE lpb=new BYTE(37);
   for(int i=0;i<37;i++)
   lpb[i]=key[i];
   long ret2 = RegSetValueEx(hKey,NULL,NULL,REG_SZ,lpb,leng);
  }
  }
  void regOCX()//调用新进程注册组件
  {
   char commandline[256];
  char windowsdir[256];
   char lastcommandline[257];
   PROCESS_INFORMATION pi;
   STARTUPINFO si = {sizeof(si)};
  
  char OCXfile[50]="/MSCOMM32.OCX";
  char REGfile[50]="/regsvr32.exe";
   char *p,*q;
   GetSystemDirectory(windowsdir, 256);
  p=commandline;
  q=windowsdir;
  strcpy(p,q);
  p=strchr(commandline,'/0');
   q=OCXfile;
  strcpy(p,q);
  p=strchr(windowsdir,'/0');
   q=REGfile;
  strcpy(p,q);
  p=commandline;
  q=&lastcommandline[1];
   strcpy(q,p);
   lastcommandline[0]=' ';
  
   // 启动regsvr32.exe作为子进程
   BOOL ret = CreateProcess(windowsdir, lastcommandline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
   if(ret)
  {
   CloseHandle(pi.hThread);
  
   CloseHandle(pi.hProcess);
  }
  }
  int APIENTRY WinMain(HINSTANCE hInstance,
   HINSTANCE hPrevInstance,
   LPSTR lpCmdLine,
   int nCmdShow )
  {
   char sys[100];
   char file1[20]="Mscomm32.ocx";
  char file2[20]="Mscomm32.dep";
  char file3[20]="Mscomm.srg";
  GetSystemDirectory(sys,100);
   CPFile(file1,sys);
  CPFile(file2,sys);
  CPFile(file3,sys);
   regOCX();
  regsted();
  return 0;
  }

转自:http://www.wangchao.net.cn/bbsdetail_72535.html


由于在项目中要和串口通信,在VS2003中没有提供串口通信的控件,只好通过MSComm32.OCX控件来解决,以下是在XP中注册该控件的方法:

1.     将MSComm32.OCX文档Copy到windows/system32目录下面;
2.     编辑以下内容到新建的.reg文档中:
REGEDIT
HKEY_CLASSES_ROOT/Licenses = Licensing: Copying the keys may be a violation of established copyrights.
 
// The MsComm32 Control License follows:
HKEY_CLASSES_ROOT/Licenses/4250E830-6AC2-11cf-8ADB-00AA00C00905 = kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun
 
3.     运行这个.reg文件,完成注册。
转自:http://www.itwis.com/html/os/winxp/20080115/844.html

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值