让应用程序在运行的时候自动检查所需要的支持文件和注册控件,免除安装和手动注册。适当修改下面的代码中的支持文件列表,并在App::InitInstance()中调用。#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
//检测需要的文件是否存在
//并且对需要注册的文件进行注册
//输入参数用于指示文件所在的路径
//返回TRUE表示成功
BOOL Check_Environment(LPCTSTR lpszAppPath) //传入文件路径
{
//列出所需要的文件列表
typedef struct _FILE_CELL
{
LPCTSTR szFileName; //文件名
BOOL bNeedRegister; //需要注册?
}FILE_CELL;
const FILE_CELL Support_FileList[] =
{
{_T("aaa.ocx"), TRUE}, {_T("bbb.ocx"), TRUE}, {_T("ccc.ocx"), TRUE},
{_T("fff.dll"), TRUE}, {_T("other.sys")}, //other need file
0, //Don't remove this line
};
BOOL bRet = 0;
TCHAR e_mess[4096], mess[256];
memset(e_mess, 0, sizeof(e_mess));
int uIndex = 0;
while(Support_FileList[uIndex].szFileName)
{
TCHAR fileName[MAX_PATH + 1];
_tcscpy_s(fileName, lpszAppPath);
PathAddBackslash(fileName);
_tcscat_s(fileName, Support_FileList[uIndex].szFileName);
if(PathFileExists(fileName))
{
//if(_tcsicmp(PathFindExtension(fileName),_T(".ocx"))==0) //是需要注册的OCX文件
if(Support_FileList[uIndex].bNeedRegister) //需要注册
{
//使用短路径名主要是为兼容Win98
TCHAR shortfileName[MAX_PATH + 1];
GetShortPathName(fileName, shortfileName, MAX_PATH);
// Path to OLE Control in shortfileName
HMODULE hModule = LoadLibrary(shortfileName);
if(hModule)
{
typedef HRESULT (STDAPICALLTYPE *CTLREGPROC)() ; // Requires olectl.h
CTLREGPROC DLLRegisterServer =
(CTLREGPROC)GetProcAddress(hModule,"DllRegisterServer" ) ;
if(DLLRegisterServer)
{
if(DLLRegisterServer() != S_OK)
{
_stprintf_s(mess, _T("注册模块失败 %s\r\n"), fileName);
_tcscat_s(e_mess, mess);
}
}
else
{
_stprintf_s(mess, _T("模块%s找不到指定注册入口\r\n"), fileName);
_tcscat_s(e_mess, mess);
}
FreeLibrary(hModule) ;
}
else
{
_stprintf_s(mess, _T("加载模块失败 %s\r\n"), fileName);
_tcscat_s(e_mess, mess);
}
}
}
else //提示缺少必要的支持文件
{
_stprintf_s(mess, _T("缺少必要的文件 %s\r\n"), fileName);
_tcscat_s(e_mess, mess);
}
uIndex++;
}
if(_tcslen(e_mess) > 0) //检测出错提示
{
MessageBox(NULL, e_mess, _T("Error"), MB_OK );
}
else
{
bRet = true;
}
return(bRet);
}