如何在安装部署时实现注册MSComm控件

34 篇文章 0 订阅

作者:flydream0

转自:http://blog.csdn.net/flydream0/article/details/8013274


用MSComm很是方便,但是也得付出代价,那就是在没有注册MSComm控件的PC机上安装时,得注册此控件,网上的资料大部分都是手动注册MSComm控件的方法,但是,不可能每个客户都手动来操作一遍,因此,这种方法在发布时是不可行的,更好的方法是让用户安装程序时让安装程序自动注册MSComm.

注:关于如何手动注册MSComm控件可参考:http://blog.csdn.net/flydream0/article/details/8002012

而本文正在基于此出发点而来的,是用VS2010来实现这一目标的。

总体思想:在用VS2010中使用Custom Action Editor来实现这一目标,即专门写一个注册MSComm的程序来实现,然后在安装程序中执行它。关于如何使用VS2010建立安装部署工程这里就不细讲了,这里主要是讲这一具体实现注册的程序内容。

RegisteMSComm.cpp:

  1. // RegisterMSComm.cpp : Defines the entry point for the console application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <stdio.h>  
  6. #include <string.h>  
  7. #include <Windows.h>  
  8.   
  9. //将三个文件拷贝到系统目录  
  10. void CopeFile(char file[],char tarpath[])   
  11. {  
  12.     char tempsys[100];  
  13.     //char *r;  
  14.     //char *t;   
  15.   
  16.     //r=tarpath;  
  17.     //t=tempsys;  
  18.     //strcpy(t,r);   
  19.   
  20.   
  21.     char path[256];  
  22.     char *p;  
  23.     char *q;  
  24.   
  25.     //获取当前程序的目录下的文件路径到path变量中  
  26.     GetModuleFileName(GetModuleHandle(NULL),path,sizeof(path));  
  27.     p = path;  
  28.     while(strchr(p,'\\'))   
  29.     {  
  30.         p = strchr(p,'\\');   
  31.         p++;   
  32.     }  
  33.     *p = '\0';   
  34.     p=strchr(path,'\0');  
  35.     q=file;  
  36.     strcpy(p,q);  
  37.   
  38.     //获取目标文件的全路径信息  
  39.     strcpy(tempsys,tarpath);  
  40.     p=strchr(tempsys,'\0');  
  41.     *p = '\\';  
  42.     p++;  
  43.     q=file;  
  44.     strcpy(p,q);  
  45.   
  46.     //复制文件  
  47.     CopyFile(path,tempsys,false);  
  48.   
  49. }   
  50.   
  51. //将相关信息写入注册表  
  52. void regsted()   
  53. {  
  54.     HKEY hkey;  
  55.     DWORD dwdip;  
  56.     BYTE byteArray[80];  
  57.     LPBYTE owner_get=byteArray;   
  58.     DWORD type_1 =REG_SZ;  
  59.     DWORD cbdata_1=80;   
  60.   
  61.     long exist=RegQueryValueEx(HKEY_CLASSES_ROOT, "licenses\\4250e830-6ac2-11cf-8adb-00aa00c00905", NULL, &type_1, owner_get, &cbdata_1);   
  62.   
  63.     if(exist!=ERROR_SUCCESS)  
  64.     {  
  65.         long ret = RegCreateKeyEx(HKEY_CLASSES_ROOT,"licenses\\4250e830-6ac2-11cf-8adb-00aa00c00905",0l,NULL,REG_OPTION_VOLATILE,KEY_ALL_ACCESS,NULL,&hkey,&dwdip);  
  66.         DWORD leng=37;   
  67.   
  68.         char key[37]="kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun";  
  69.         /*LPBYTE lpb=new byte(37); 
  70.         for(int i=0;i<37;i++)  
  71.             lpb[i]=key[i];*/  
  72.         long ret2 = RegSetValueEx(hkey,NULL,NULL,REG_SZ,(LPBYTE)&key[0]/*lpb*/,leng);   
  73.   
  74.     }  
  75. }   
  76.   
  77. //调用新进程注册组件  
  78. void regocx()  
  79. {   
  80.   
  81.     char commandline[256];  
  82.     char windowsdir[256];  
  83.     char lastcommandline[257];   
  84.   
  85.     PROCESS_INFORMATION pi;  
  86.     STARTUPINFO si;  
  87.   
  88.     char ocxfile[50]="\\mscomm32.ocx";  
  89.     char regfile[50]="\\regsvr32.exe";  
  90.     char *p,*q;  
  91.   
  92.     GetSystemDirectory(windowsdir, 256);  
  93.     p=commandline;  
  94.     q=windowsdir;  
  95.     strcpy(p,q);   
  96.   
  97.   
  98.     p=strchr(commandline,'\0');  
  99.     q=ocxfile;  
  100.     strcpy(p,q);   
  101.   
  102.     p=strchr(windowsdir,'\0');  
  103.     q=regfile;  
  104.     strcpy(p,q);   
  105.   
  106.   
  107.     p=commandline;  
  108.     q=&lastcommandline[1];  
  109.     strcpy(q,p);  
  110.     lastcommandline[0]=' ';  
  111.   
  112.   
  113.   
  114.     // 启动regsvr32.exe作为子进程  
  115.     bool ret = CreateProcess(windowsdir, lastcommandline, NULL, NULL, false, 0, NULL, NULL, &si, &pi);  
  116.     if(ret)   
  117.     {  
  118.         CloseHandle(pi.hThread);  
  119.         CloseHandle(pi.hProcess);   
  120.     }  
  121. }  
  122.   
  123.   
  124. int _tmain(int argc, _TCHAR* argv[])  
  125. {  
  126.     char sys[100];   
  127.   
  128.   
  129.     char file1[20]="mscomm32.ocx";  
  130.     char file2[20]="mscomm32.dep";  
  131.     char file3[20]="mscomm.srg";   
  132.   
  133.     //获取win32路径  
  134.     GetSystemDirectory(sys,100);   
  135.     //拷贝文件  
  136.     CopeFile(file1,sys);  
  137.     CopeFile(file2,sys);  
  138.     CopeFile(file3,sys);   
  139.     //注册ocx  
  140.     regocx();  
  141.     //修改注册表  
  142.     regsted();   
  143.   
  144.     return 0;  
  145. }  


代码主要分三步:

第一步:拷贝文件到win32目录。

第二步:注册MSComm组件。

第二步:修改注册表。

注:此代码在Debug下可以直接正常运行,但是在release下,默认情况下会编译不过,报找不到外部符号:RegQueryValueEx,RegCreateKeyEx,RegSetValueEx。

通过错误定位,发位在release下,缺少相应的lib库所致,因此,在工程属性->Linker->Input->Addtional Dependencies的内容改为与Debug下相应的内容一致即可,即:

kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)

如此,即可编译通过并正常运行.

完!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值