您的位置:首页 > 其它

关于注册mscomm程序的编写

2007-06-14 00:25 225 查看
前一段用了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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: