摘自-----http://www.cnblogs.com/edward259/archive/2009/08/21/1551463.html
寫了個MSComm的串口通信程序,在沒有安裝Vc的機器上沒有辦法運行。需要手動註冊控件。從http://www.cnblogs.com/yrh2847189/archive/2007/06/19/789213.html
看
到的方法。不過手動註冊可以寫成bat文件來完成。首先是建一個文件夾,將Windows/system32下的Mscomm.srg,
Mscomm32.ocx,Mscomm32.dep文件拷到文件夾中,然後查看
Mscomm32.dep的內容,在頂部加入REGEDIT4一行,另存爲1.reg,也放在該文件夾中。
然後在文件夾中建一個文本,寫入
@echo off
copy ./MSCOMM32.OCX %SYSTEMROOT%/system32
copy ./MSCOMM32.DEP %SYSTEMROOT%/system32
copy ./MSCOMM.SRG %SYSTEMROOT%/system32
Regsvr32 /s %SYSTEMROOT%/system32/MSCOMM32.OCX
regedit /s 1.REG
保存,更改後綴爲bat。點擊運行,就可以完成註冊。
另有一個Win32 Application的方法,也學習一下,不過感覺還是bat文件跟簡單方便,呵呵。
http://www.wangchao.net.cn/bbsdetail_72535.html
#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;
}