weitom1982

向各位技术前辈学习,学习再学习.
posts - 299, comments - 79, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

前一段用了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:\winnt\system32\Mscomm32.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;
}

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
后记:

代码加入: include “stdafx.h”
         作者没有加入可能因为变成环境的问题。
          mscomm的文件一共有4个,注册使用的应该只有ocx这一个,但为什么都要copy出来不太明白。另一个问题是active控件的源文件和使用上不太了解。
          ms的文章没有时间读,我的理解可能.red文件是用来对照注册表的。


        当使用IS等安装程序时,可以实现对控件的自动注册,并对注册表进行操作,所以这种解决方法也没有必要了。
         这种方法的主要问题仍然是在注册上,导致了程序无法实现绿色安装。
         注册程序写入到主程序时需要每次做一个注册与否的判断,分开的话在操作上会给用户造成麻烦。

判断软件注册的方法一个是对照注册表。另一个是做一个global的标志来帮助判断(别的有待学习:P)前者更合理,但有点麻烦:(

         这段程序实现了对操作系统工具的直接调用,以及对系统文件的操作。  
         结合操作系统,网络的知识编写出具备全面而有效功能的软件。
只有注册用户登录后才能发表评论。