通俗基础教程
电脑操作教程
电脑怎样拨号上网
如何做个人网页
怎样做局域网
Word教程(文字处理)
图形图象处理入门
经典提高教程
怎样使用代理服务器
如何做无盘工作站
Photoshop教程
Dreamweaver3教程
Flash4&5教程
Firework3教程
Frontpage2000教程
Authware教程
Office2000教程
如何制作动画图片
OICQ&ICQ使用方法

高手学习指南

硬件升级技巧
CGI教程
ASP教程

PHP教程

注册表使用技巧
路由器的设置
网站建设指南
SQL
最近更新:
Flash
相关内容

Visual C++编程技巧之14

1:怎样在一个应用程序中加载另一个应用程序 作者 达明一排

// 运行一个应用程序
// -------------------------------------------------------------- //
// NewProcess() 函数的 nFlag 参数
enum{
NP_WAITFOR_INIT, // 等待新进程初始化完毕
NP_WAITFOR_EXIT, // 等待新进程运行完毕
NP_NOWAIT // 启运新进程后立即返回控制
};
HANDLE NewProcess( CString & strFileName, INT nFlag = NP_NOWAIT );

//////////////////////////////////////////////////////////////////////////
//
// 运行一个应用程序(调试通过)
//
// 最后修改时间(1998年月日)
//
HANDLE NewProcess( CString & strFileName, INT nFlag /*= NP_NOWAIT*/ )
{
STARTUPINFO StartupInfo;
::memset( &StartupInfo, 0, sizeof(STARTUPINFO) );
StartupInfo.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION ProcessInfo;

// 创建进程
if ( ! ::CreateProcess( strFileName, NULL, NULL, NULL,
FALSE, 0, NULL, NULL, &StartupInfo, &ProcessInfo ) )
{
return FALSE;
}

// 确定是否对已经生成的新进程等待
switch( nFlag )
{
case NP_WAITFOR_INIT:
// 等待新进程初始化完毕后再返回控制
if ( 0xFFFFFFFF == ::WaitForInputIdle( ProcessInfo.hProcess, INFINITE ) )
{
return FALSE;
}
return ProcessInfo.hProcess;
break;
case NP_WAITFOR_EXIT:
// 等待新进程运行结束后再返回控制
if ( WAIT_FAILED == ::WaitForSingleObject( ProcessInfo.hProcess, INFINITE ) )
{
return FALSE;
}
else
{
// 得到新进程的返回码
DWORD dwExitCode;
if ( ! ::GetExitCodeProcess( ProcessInfo.hProcess, &dwExitCode ) )
return FALSE;
return (HANDLE)dwExitCode;
}
break;
case NP_NOWAIT:
// 立即返回控制
return ProcessInfo.hProcess;
break;
default:
// 用户必须选择正确的 nFlag 参数
ASSERT( FALSE );
return FALSE;
break;
}
}

2:得到 Windows 系统中指定目录的路径 作者 达明一排

////////////////////////////////////////////////////////////////////
// GetDir () 函数
// -------------------------------------------------------------- //
// GetDir() 函数 nFlag 参数只能选择以下值之一:
enum {
// Windows 所在目录
GD_WINDOWS_DIR = 100,
// Windows 的系统目录
GD_SYSTEM_DIR = 101,
// 当前目录
GD_CURRENT_DIR = 102,
// 光盘驱动器的根目录
GD_CDROM_DIR = 103

// 另外,也可以选择下列常量之一
/* // 不能拿掉这层注释语句
// 注意:其他可能的值在 SHGetSpecialFolderLocation()中定义!!

// -------------------------------------------------------------- //
// 得到 Windows 系统中指定目录的路径
// bAddSeparate 函数确定是否在返回的路径后面加上 '\\'
CString GetDir( INT nFlag, BOOL bAddSeparate = TRUE );

///////////////////////////////////////////////////////////////////////////
//
// 得到 Windows 系统中指定目录的路径 ( 1999年1月2日 22:04调试通过)
//
// 最后修改时间(1999年1月2日 22:04 )
//
CString GetDir( INT nFolder, BOOL bAddSeparate /* = TRUE */ )
{
char Buffer[MAX_PATH];
::memset( Buffer, 0, MAX_PATH );

switch ( nFolder )
{
case GD_SYSTEM_DIR:
// 系统目录
::GetSystemDirectory( Buffer, MAX_PATH );
ASSERT( Buffer != NULL );
break;
case GD_WINDOWS_DIR:
// Windows目录
::GetWindowsDirectory( Buffer, MAX_PATH );
ASSERT( Buffer != NULL );
break;
case GD_CURRENT_DIR:
// 当前目录
::GetCurrentDirectory( MAX_PATH , Buffer );
ASSERT( Buffer != NULL );
break;
case GD_CDROM_DIR:
{//{{ 在一个循环中查询光盘根目录
Buffer[1] = _T(':');
Buffer[2] = _T('\\');
for ( char i = _T('D'); i <= _T('Z') ; i ++ )
{
Buffer[0] = i;
if ( DRIVE_CDROM == GetDriveType( (LPCTSTR)Buffer ) )
{ // 去掉'\\',在后面判断是否需要加它
Buffer[2] = 0;
break;
}
}
// 该计算机没有光驱
if ( i > _T('Z') )
::memset( Buffer, 0, MAX_PATH );

break;
}//}} 在一个循环中查询光盘根目录

/////////////////////////////////////////////////////////////////
// 如果是 debug 版本,则检查 nFolder 的有效性
#ifdef _DEBUG

case CSIDL_APPDATA:
// File system directory that serves as a common repository
// for application-specific data.
case CSIDL_COOKIES:
// File system directory that serves as a common
// repository for Internet cookies.
case CSIDL_DESKTOPDIRECTORY:
// File system directory used to physically store
// file objects on the desktop (not to be confused
// with the desktop folder itself).
case CSIDL_FAVORITES:
// File system directory that serves as a common
// repository for the user's favorite items.
case CSIDL_HISTORY:
// File system directory that serves as a common
// repository for Internet history items.
case CSIDL_INTERNET_CACHE:
// File system directory that serves as a common
// repository for temporary Internet files.
case CSIDL_NETHOOD:
// File system directory containing objects that
// appear in the network neighborhood
case CSIDL_PERSONAL:
// File system directory that serves as a common
// repository for documents.
case CSIDL_PRINTHOOD:
// File system directory that serves as a common
// repository for printer links.
case CSIDL_PROGRAMS:
// File system directory that contains the user's
// program groups (which are also file system directories).
case CSIDL_RECENT:
// File system directory that contains the user's
// most recently used documents.
case CSIDL_SENDTO:
// File system directory that contains Send To
// menu items.
case CSIDL_STARTMENU:
// File system directory containing Start menu items.
case CSIDL_STARTUP:
// File system directory that corresponds to the
// user's Startup program group. The system starts
// these programs whenever any user logs onto
// Windows NT or starts Windows 95.
case CSIDL_TEMPLATES:
// File system directory that serves as a common
// repository for document templates.
#else
// 注意:在 release 版本中不检查 nFolder 的有效性!!
default:
#endif // _DEBUG

{//{{ 调用系统接口得到外壳文件夹
// Folder location
ITEMIDLIST idl;
LPITEMIDLIST pidl = &idl;

if ( ! SUCCEEDED( SHGetSpecialFolderLocation(NULL,nFolder,&pidl) ))
ASSERT( FALSE );
if ( ! SHGetPathFromIDList( (LPCITEMIDLIST)pidl, (LPTSTR)Buffer ) )
ASSERT( FALSE );
}//}} 调用系统接口得到外壳文件夹
break;

// 只有 debug 版本才编译这段代码
#ifdef _DEBUG
default:
// 用户一定要使用正确的 nFlag 值
ASSERT( FALSE );
break;
#endif

} // switch( nFolder ) SHGetSpecialFolderLocation()的nFolder参数

// 缓冲区字符串长度大于零,同时用户允许在最后加上'\\'
if (::lstrlen( Buffer )>0 && bAddSeparate)
// 如果最后一个字符不是'\\'
if ( _T("\\") != ((CString)Buffer).Right(1) )
// 在最后加上'\\'
::lstrcat( (LPTSTR)Buffer, (LPCTSTR)_T("\\") );

// 注意:如果用户指定的文件夹不存在或发生了错误,
// 则返回值为空串!
return (CString)Buffer;

}
3:从注册表中存取字符形值的完整例子 作者 达明一排

 

/ 读取注册表中的键值:字符型
// -------------------------------------------------------------- //
CString GetRegValue( HKEY hKey,
LPCTSTR sKey,
LPCTSTR sChildKey,
LPCTSTR sDefault = (LPCTSTR)_T(""),
DWORD dwBufferSize = 255 );

//////////////////////////////////////////////////////////////////////////
//
// 读取注册表中的键值:字符型(1998年12月24日调试通过)
//
// 最后修改时间(1998年12月23日晚)
//
// 为了更加易用, 本函数只是简单的把读出的数据作为函数的返回值, 但在易
// 用性上的妥协使程序有这样一个缺点:当返回空字符串时, 无法判断是由指定键
// 值的数据本身就是空串还是在函数运行过程中出现了异常情况导致读取失败。
// 有两种改进方法, 一种方法是将读出的数据作为函数的参数返回, 函数的返
// 回值判断程序运行情况,我不喜欢这种方法;另一种方法是使用 C++ 异常。
CString GetRegValue( HKEY hKey,
LPCTSTR sKey,
LPCTSTR sChildKey,
LPCTSTR sDefault /*= (LPCTSTR)_T("")*/,
DWORD dwBufferSize /*= 255*/ )
{
// 大于 2048 字节的值应存作文件, 并将文件名保存在注册表中。
ASSERT( dwBufferSize * sizeof(BYTE) <= 2048 );

CString strResult;
HKEY hOpenKey = NULL;
// 芝麻开门!
if ( ERROR_SUCCESS != ::RegOpenKeyEx( hKey,
sKey,
0 ,
KEY_READ,
&hOpenKey ) )
{
return (CString)sDefault;
}

BYTE * szBuff;
szBuff = new BYTE[ dwBufferSize ];
// 字符串缓冲区分配错误
if ( NULL == szBuff )
{
::RegCloseKey( hOpenKey );
return (CString)sDefault;
}

// 查询指定的值
::memset(szBuff, 0, dwBufferSize);
if ( ERROR_SUCCESS != ::RegQueryValueEx( hOpenKey,
sChildKey,0,0,
&szBuff[0],
&dwBufferSize) )
{
strResult = (CString)sDefault;
}
else
{
strResult = (CString)szBuff;
}
delete szBuff;
// 芝麻关门!
::RegCloseKey(hOpenKey);
return strResult;
}


////////////////////////////////////////////////////////////////////
// SetRegValue() 函数
// -------------------------------------------------------------- //
// 这三个参数对不了解注册表的人来说可能不好懂, 要弄懂它,首先
// 要明白什么是<主键>、<子键>、<键值>及键值中的<数据>。
// 其实这几个词也是我凭自已对注册表的理解及印象起的名,可能叫
// 法不是十分准确。下面用我自己的话对几个词分析如下:
// <主键> ---- Windows 系统预定义的几个 HKEY 型的数据:
// HKEY_LOCAL_MACHINE 该键是注册表中的物理键, 实际上它就是 SYSTEM.DAT
// HKEY_USERS 该键是注册表中的物理键, 实际上它就是 USER.DAT
// HKEY_CURRENT_USER 该键是虚拟的
// HKEY_CLASS_ROOT 该键是虚拟的
// HKEY_CURRENT_CONFIG 虚拟键
// HKEY_DYN_DATA 虚拟键
// <子键> ---- 能在 RegEdit 中左边窗口显示出来的,除了几个主键外都
// 叫子键。
// <键值> ---- RegEdit 中右边窗口是分两列显示数据的,其中左边那列
// 叫做键值。
// <数据> ---- 接着 <键值> 说, 右边那列就叫作数据。
// -------------------------------------------------------------- //
// 关于 nFlag 参数的注释就像绕口令,连我自己好像都眼花:
enum {
// 置此位时,当注册表中子键不存在时建立子键;不置此位,
// 如子键不存在则不建立子键。
SRV_CREATEKEY = 0x03, // 00000011
// 置此位时,如果注册表键值没有建立,则建立键值;不置此
// 位,如果键值没有建立,则不建立键值。
SRV_CREATEVALUE = 0x0c, // 00001100
// 置此位时,覆盖注册表键值中已有的数据;不置此位,如键
// 值中已有数据,则不覆盖(对字符型数据: 键值数据为空串时,
// 认为该键值中没有数据, 操作结果与置此位时的结果相同)。
SRV_OVERWRITEVALUE = 0x30, // 00110000
};
// -------------------------------------------------------------- //
// 设置注册表中的键值:字符型 ( 我自己认为,该函数功能很强大 )
BOOL SetRegValue( HKEY hKey,
LPCTSTR sKey,
LPCTSTR sChildKey,
LPCTSTR sChildKeyValue,
INT nFlag = SRV_CREATEKEY|SRV_OVERWRITEVALUE|SRV_CREATEVALUE,
DWORD dwBufferSize = 255 );

////////////////////////////////////////////////////////////////////////
//
// 修改注册表中的键值:字符型(1998年12月25日调试通过)
//
// 最后一次修改时间(1998年12月25日)
//
// 当函数实际往注册表里写数据了, 则返回真值;否则返回假值。用户可以
// 根据调用此函数时指定的 nFlag 值和函数返回值判断函数运行过程中是否出现
// 了异常情况。
//
BOOL SetRegValue( HKEY hKey,
LPCTSTR sKey,
LPCTSTR sChildKey,
LPCTSTR sChildKeyValue,
INT nFlag /*= SRV_CREATEKEY|SRV_OVERWRITEVALUE|SRV_CREATEVALUE*/,
DWORD dwBufferSize /* = 255 */ )
{
// 大于 2048 字节的值项应存作文件, 并将文件名保存在注册表中。
ASSERT( dwBufferSize * sizeof(BYTE) <= 2048 );

HKEY hChildKey = 0;
DWORD dwDisposition;

////////////////////////////////////////////////////////////////////
// 判断打开注册表的方式
if ( nFlag & SRV_CREATEKEY )
{
// 如果 strKey 键存在则打开;如果不存在则建立该键。(注意:不是键值)
if ( ERROR_SUCCESS != ::RegCreateKeyEx( hKey,
sKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_CREATE_SUB_KEY | KEY_QUERY_VALUE | KEY_SET_VALUE,
NULL,
& hChildKey,
& dwDisposition ) )
{
return FALSE;
}
}
else // 如果 strKey 键不存在, 不建立
{
if ( ERROR_SUCCESS != ::RegOpenKeyEx(
hKey,
sKey,
0,
KEY_QUERY_VALUE | KEY_SET_VALUE,
&hChildKey) )
{
return FALSE;
}
} // if ( nFlag & SRV_CREATEKEY ) 判断打开注册表的方式
////////////////////////////////////////////////////////////////////
// 读入键值数据, 看看是不是空串
BYTE * szBuff;
szBuff = new BYTE[ dwBufferSize ];
// 字符串缓冲区分配错误
if ( NULL == szBuff )
{
::RegCloseKey( hChildKey );
return FALSE;
}

::memset(szBuff, 0 , dwBufferSize);
LONG lResult = ::RegQueryValueEx(
hChildKey,
sChildKey,
0, 0,
&szBuff[0],
&dwBufferSize);

// 如果用户不允许建立键值, 而且该键不存在,那就 return 好了
if ( ( (!(nFlag & SRV_CREATEVALUE)) && (ERROR_FILE_NOT_FOUND == lResult) ) ||
// 如果用户不允许覆盖已有的键值, 读入的数据又不是空串, 那就 return 呗!
( (!(nFlag & SRV_OVERWRITEVALUE)) && (szBuff[0] != 0) ) ||
// 读取注册表数据时出错
( ERROR_SUCCESS != lResult && ERROR_FILE_NOT_FOUND != lResult ) )
{
delete szBuff;
::RegCloseKey(hChildKey);
return FALSE;
}
////////////////////////////////////////////////////////////////////
delete szBuff ;
// 给指定的键赋值
lResult = ::RegSetValueEx(
hChildKey,
sChildKey,
0,
REG_SZ,
(const BYTE *)sChildKeyValue,
(DWORD)((CString)sChildKeyValue).GetLength() );
::RegCloseKey(hChildKey);

if ( ERROR_SUCCESS == lResult )
return TRUE;
else
return FALSE;
}

用VB实现多文件查找与替换功能
用VB 5.0 设计Browser及FTP程序
用Visual Basic 5.0设计E-mail程序
谈谈WIN API在VB中的应用
在VB中使用Word的“艺术字”工具
获取Win95特殊目录准确路径
VC技巧一
VC19问
VC技巧5则
Visual C++编程技巧之一
Visual C++编程技巧之2
Visual C++编程技巧之3
Visual C++编程技巧之四
Visual C++编程技巧之五
Visual C++编程技巧之六
Visual C++编程技巧之七
Visual C++编程技巧之八
Visual C++编程小技巧之九
Visual C++编程小技巧之10
Visual C++编程技巧之11
Visual C++编程技巧之12
Visual C++编程技巧之13
Visual C++编程技巧之14
 
 
 
教程站
收集整理



月光软件源码下载编程文档电脑教程网站优化网址导航网络文学游戏天地生活休闲写作范文安妮宝贝站内搜索
电脑技术编程开发网络专区谈天说地情感世界游戏元素分类游戏热门游戏体育运动手机专区业余爱好影视沙龙
音乐天地数码广场教育园地科学大观古今纵横谈股论金人文艺术医学保健动漫图酷二手专区地方风情各行各业

月光软件站·版权所有