分享

win7 64位VC串口控件打不开解决方法

 yxz1212_bao 2016-04-01
写了个MSComm的串口通信程序,在没有安装Vc的机器上没有办法运行。需要手动注册控件。不过手动注册可以写成bat文件来完成。首先是建一个文件夹,64位系统将Windows/SysWOW64(32位系统 Windows/system32)下的Mscomm.srg, Mscomm32.ocx,Mscomm32.dep文件拷到文件夹中,然后查看 Mscomm32.dep的内容,在顶部加入“REGEDIT4”这一行,另存为1.reg,也放在该文件夹中。
      然后在文件夹中建一个文本,写入
@echo off
copy .\msvcirt.dll %SYSTEMROOT%\SysWOW64
copy .\mfc42.dll %SYSTEMROOT%\SysWOW64
copy .\MSCOMM32.OCX %SYSTEMROOT%\SysWOW64
copy .\MSCOMM32.DEP %SYSTEMROOT%\SysWOW64
copy .\MSCOMM.SRG %SYSTEMROOT%\SysWOW64
Regsvr32 /s %SYSTEMROOT%\SysWOW64\MSCOMM32.OCX
regedit /s 1.REG   
                   
保存,更改后缀为bat。点击以管理者身份运行,就可以完成注册。

另有一个Win32 Application的方法,也学习一下,不过感觉还是bat文件跟简单方便,呵呵。


#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;
  }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多