MSComm控件註冊

摘自-----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;
  }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章