近日给编写了一个串口与单片机的程序,却发现生成的release版本exe文件在没有安装vc的电脑上无法正常运行,点击没有任何反应。
然后,用vc自带的库连接检查工具depends.exe检查,没有任何进展。
在网上查阅有人认为是因为程序引用了ActiveX插件,要进行插件注册,于是在一台没有安装vc的电脑上的电脑->运行 中输入
RegSvr32 H:\MSCOMM32.OCX 进行串口插件的注册(mscomm32.ocx在安装vc的电脑的c:\windows\system32路径下能找到)
但是应用程序每运用到一个新的电脑上就要运行一便插件注册是很不方便的,于是,便想在程序里自动注册插件。在网上看到这样一段程序
LPCTSTR pszDllName="MSCOMM32.OCX";
//装载ActiveX控件
HINSTANCE hLib = LoadLibrary(pszDllName);
if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
MessageBox("不能载入Dll文件!","结果",MB_OK);
return 0;
}
//获取注册函数DllRegisterServer地址
FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress (hLib,_T("DllRegisterServer"));
//调用注册函数DllRegisterServer
if(lpDllEntryPoint!=NULL)
{
if(FAILED((*lpDllEntryPoint)()))
{
MessageBox("调用DllRegisterServer失败!","结果",MB_OK);
FreeLibrary(hLib);
return 0;
};
MessageBox("注册成功","结果",MB_OK);
}
else
MessageBox("调用DllRegisterServer失败!","结果",MB_OK);
以上程序无法进行动态的地址搜索功能,仅仅需要在程序开始处进行简单的修改,如下
CString strPath;
TCHAR szCurrentDir[MAX_PATH];
::GetCurrentDirectory(MAX_PATH, szCurrentDir);
strPath.Format(_T( "%s"), szCurrentDir);
CString strapp=strPath+"\\MSCOMM32.OCX";
MessageBox(strapp);
LPCTSTR pszDllName=strapp;
这样就可以随着应用程序目录的不同而动态获取系统的当前应用程序目录来进行mscomm32.ocx注册。其中两个\\代表去掉转义效果
然后需要考虑的问题是,这段程序放在哪儿?由于我采用的FMC编程,一开始我放在dlg初始化函数内,却发现没有效果。在定义dlg之前也没有效果。
这个问题一直没解决。。
下面考虑采用制作安装包的方法来解决这个问题。
应用程序在制作安装包的时候有一项是提前注册程序所需要的动态链接库以及插件。
采用vc自带的installshield for microsoft visual c++ 6.0制作应用程序安装包。
制作过程如下:
首先参考了installshield的help文档里面的getstarted生成了一个可以安装的安装包test。
然后在此基础上进行修改,步骤如下
用向导生成一个工程之后
在File Groups选项里面
Program DLLs Program Executable Files Shared DLLs里面分别在links中加入 Comm.exe 和 mscomm32.ocx
在components选项中
Program Files 和Shared DLLs中双击,在右侧栏中的Included File Groups中,加入相应的文件夹Program Executable Files Shared DLLs
在Scripts选项中
在setup.rul中的函数SetupFolders加入以下内容:
在begin上面加入 TRING svPath;
在TODO:下面加入
svPath= TARGETDIR ^ "Comm.exe";
LongPathToQuote ( svPath , TRUE );
AddFolderIcon ( "" , " Comm" , svPath , "" , "" , 0 , "" , REPLACE );
(注:以上均可以在help中的getstarted中找到方法)
之后再Media选项中,用Media Build Wizard建立镜像文件,选择3.5“diskette-1.44MBytes
然后就基本完成功能,可以在没有vc的环境下可以安装并运行
然后,用vc自带的库连接检查工具depends.exe检查,没有任何进展。
在网上查阅有人认为是因为程序引用了ActiveX插件,要进行插件注册,于是在一台没有安装vc的电脑上的电脑->运行 中输入
RegSvr32 H:\MSCOMM32.OCX 进行串口插件的注册(mscomm32.ocx在安装vc的电脑的c:\windows\system32路径下能找到)
这样再打开程序,就可以正常运行,确认了是Active X 插件问题。
如果遇到注册错误,弹出错误代码:0x8002801c
则按如下办法执行
但是应用程序每运用到一个新的电脑上就要运行一便插件注册是很不方便的,于是,便想在程序里自动注册插件。在网上看到这样一段程序
LPCTSTR pszDllName="MSCOMM32.OCX";
//装载ActiveX控件
HINSTANCE hLib = LoadLibrary(pszDllName);
if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
MessageBox("不能载入Dll文件!","结果",MB_OK);
return 0;
}
//获取注册函数DllRegisterServer地址
FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress (hLib,_T("DllRegisterServer"));
//调用注册函数DllRegisterServer
if(lpDllEntryPoint!=NULL)
{
if(FAILED((*lpDllEntryPoint)()))
{
MessageBox("调用DllRegisterServer失败!","结果",MB_OK);
FreeLibrary(hLib);
return 0;
};
MessageBox("注册成功","结果",MB_OK);
}
else
MessageBox("调用DllRegisterServer失败!","结果",MB_OK);
以上程序无法进行动态的地址搜索功能,仅仅需要在程序开始处进行简单的修改,如下
CString strPath;
TCHAR szCurrentDir[MAX_PATH];
::GetCurrentDirectory(MAX_PATH, szCurrentDir);
strPath.Format(_T( "%s"), szCurrentDir);
CString strapp=strPath+"\\MSCOMM32.OCX";
MessageBox(strapp);
LPCTSTR pszDllName=strapp;
这样就可以随着应用程序目录的不同而动态获取系统的当前应用程序目录来进行mscomm32.ocx注册。其中两个\\代表去掉转义效果
然后需要考虑的问题是,这段程序放在哪儿?由于我采用的FMC编程,一开始我放在dlg初始化函数内,却发现没有效果。在定义dlg之前也没有效果。
这个问题一直没解决。。
下面考虑采用制作安装包的方法来解决这个问题。
应用程序在制作安装包的时候有一项是提前注册程序所需要的动态链接库以及插件。
采用vc自带的installshield for microsoft visual c++ 6.0制作应用程序安装包。
制作过程如下:
首先参考了installshield的help文档里面的getstarted生成了一个可以安装的安装包test。
然后在此基础上进行修改,步骤如下
用向导生成一个工程之后
在File Groups选项里面
Program DLLs Program Executable Files Shared DLLs里面分别在links中加入 Comm.exe 和 mscomm32.ocx
在components选项中
Program Files 和Shared DLLs中双击,在右侧栏中的Included File Groups中,加入相应的文件夹Program Executable Files Shared DLLs
在Scripts选项中
在setup.rul中的函数SetupFolders加入以下内容:
在begin上面加入 TRING svPath;
在TODO:下面加入
svPath= TARGETDIR ^ "Comm.exe";
LongPathToQuote ( svPath , TRUE );
AddFolderIcon ( "" , " Comm" , svPath , "" , "" , 0 , "" , REPLACE );
(注:以上均可以在help中的getstarted中找到方法)
之后再Media选项中,用Media Build Wizard建立镜像文件,选择3.5“diskette-1.44MBytes
然后就基本完成功能,可以在没有vc的环境下可以安装并运行