`
jiagou
  • 浏览: 2534120 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

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

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

RegisteMSComm.cpp:

// RegisterMSComm.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <Windows.h>

//将三个文件拷贝到系统目录
void CopeFile(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;

	//获取当前程序的目录下的文件路径到path变量中
	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);

	//获取目标文件的全路径信息
	strcpy(tempsys,tarpath);
	p=strchr(tempsys,'\0');
	*p = '\\';
	p++;
	q=file;
	strcpy(p,q);

	//复制文件
	CopyFile(path,tempsys,false);

} 

//将相关信息写入注册表
void regsted() 
{
	HKEY hkey;
	DWORD dwdip;
	BYTE byteArray[80];
	LPBYTE owner_get=byteArray; 
	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,(LPBYTE)&key[0]/*lpb*/,leng); 

	}
} 

//调用新进程注册组件
void regocx()
{ 

	char commandline[256];
	char windowsdir[256];
	char lastcommandline[257]; 

	PROCESS_INFORMATION pi;
	STARTUPINFO 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 _tmain(int argc, _TCHAR* argv[])
{
	char sys[100]; 


	char file1[20]="mscomm32.ocx";
	char file2[20]="mscomm32.dep";
	char file3[20]="mscomm.srg"; 

	//获取win32路径
	GetSystemDirectory(sys,100); 
	//拷贝文件
	CopeFile(file1,sys);
	CopeFile(file2,sys);
	CopeFile(file3,sys); 
	//注册ocx
	regocx();
	//修改注册表
	regsted(); 

	return 0;
}


代码主要分三步:

第一步:拷贝文件到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)

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

完!

分享到:
评论

相关推荐

    WINCC注册MSCOMM控件

    WINCC注册MSCOMM控件,WINCC串口通讯使用。

    利用MSComm控件实现文件发送与接收.

    利用MSComm控件实现文件发送与接收.利用MSComm控件实现文件发送与接收.利用MSComm控件实现文件发送与接收.利用MSComm控件实现文件发送与接收.利用MSComm控件实现文件发送与接收.利用MSComm控件实现文件发送与接收.

    如何手工来注册安装MSComm控件。

    当我们安装VC++6.0/VB6.0时,如果选择了ACtiveX控件项(自定义安装),MSComm控件就会自动安装在计算机上了,并在系统文件夹下多了3个文件:Mscomm.srg, Mscomm32.ocx,Mscomm32.dep  注意,操作系统不同,则系统...

    如何手工注册MSComm控件

     大家知道,当我们安装VC++6.0/VB6.0时,如果选择了ACtiveX控件项(自定义安装),MSComm控件就会自动安装在计算机上了,并在系统文件夹下多了3个文件:Mscomm.srg, Mscomm32.ocx,Mscomm32.dep

    MSCOMM控件的手动安装

    在没有安装VB6.0企业版或者VC的电脑上使用MSCOMM控件需要手工安装MSCOMM控件,此文件介绍手工安装MSCOMM控件的方法,并附相关安装所需的文件。

    MSComm控件

    ),剩下的工作是在Delphi中导入这个ActiveX控件,进入Delphi环境在Component菜单下选Import ActiveX Control,这时在列表中可以看到Microsoft Comm Control 6.0选项, 选中这个选项点击Install按钮,完成安装。在...

    LabVIEW 串口通讯MSCOMM控件安装包

    在LabVIEW中的应用:进入LabVIEW环境中,在控件面板上选择ActiveX控件的ActiveX容器:ActiveX容器中添加ActiveX对象,在列表中可以看到Microsoft Comm Control,version 6.0, 选中后点击确定按钮,就完成安装。在...

    vba 中引入mscomm控件

    vba 中引入mscomm控件 vba 中引入mscomm控件 vba 中引入mscomm控件

    MScomm控件注册工具

    不仅可以注册MScomm控件,也可以注册别的OCX文件

    MSCOMM控件加脚本注册

    MSCOMM控件注册使用,文件包含MSCOMM.SRG、MSCOMM32.DEP、MSCOMM32.oca、mscomm32.ocx等控件。并附含了注册脚本,亲测win7\win8\win10可用

    VC编程实现利用MSComm控件进行串口通信

    VC编程实现利用MSComm控件进行串口通信,该程序对项目开发人员有借鉴和指导作用

    MSComm控件安装程序

    MSComm 作为一个串行通讯控件为程序员串口通讯编程节省了很多时间。...本安装程序使用与未安装MSComm控件的64位、32位计算机,一键式安装,方便快捷。 此程序基于MFC开发,为本人在项目中实际使用。

    Mscomm控件自动安装

    Mscomm控件安装,使用文件内的install.bat文件自动安装

    DELPHI 2007安装控件方法及安装MSCOMM控件

    DELPHI 2007安装控件方法及安装MSCOMM控件。资源和安装方法。

    Mscomm32控件文件以及注册

    MSComm控件中的MSCOMM32.DEP MSCOMM32.OCX MSCOMM.SRG文件,以及注册方式

    MSComm控件使用详解

    MSComm控件使用详解MSComm控件使用详解MSComm控件使用详解MSComm控件使用详解

    MSCOMM控件安装

    MSCOMM控件,包括Mscomm.srg, Mscomm32.ocx,Mscomm32.dep3个文件,安装步骤,及win7解决方案,试用过,可以用。

    自动注册MSCOMM控件脚本

    自动注册MSCOMM控件脚本,包括需要的注册文件 调用VBS脚本在后台运行注册

    mscomm控件实现串口通信

    利用VB5.0的MSComm控件实现串口通信 设置MSComm控件的CommPort、Settings、EOFEnable属性初始化 设置MSComm控件的PortOpen属性,通过Output方法发送字符串数据 设置并读取MSComm控件的InputLen和...

Global site tag (gtag.js) - Google Analytics