我在调试窗口能看到,赋给PATH的字符串是正确的,
赋值成功后,右键我的电脑--高级--环境变量,也可以看到环境变量已经添加在path尾部。
但奇怪的是,依然不能使用,而且注销之后,连系统原来的环境变量像chkdsk, convert也不能使用了。
这是否涉及权限问题,求高人解释下。
HKEY hkResult;
if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE,
_T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"),
0,
KEY_SET_VALUE | KEY_READ,
&hkResult))
{
MessageBox(_T("访问注册表出错!"));
}
DWORD BufferSize = 8192;
DWORD cbData;
DWORD dwRet; VOID* PerfData = malloc( BufferSize );
cbData = BufferSize; dwRet = RegQueryValueEx( hkResult,
_T("Path"),
NULL,
NULL,
(LPBYTE) PerfData,
&cbData ); while (dwRet == ERROR_MORE_DATA)
{
BufferSize += 4096;
PerfData = realloc( PerfData, BufferSize );
cbData = BufferSize; dwRet = RegQueryValueEx( hkResult,
_T("Path"),
NULL,
NULL,
(LPBYTE) PerfData,
&cbData ); } MessageBox((LPCTSTR)PerfData); LPTSTR javaHome = _T(";%JAVA_HOME%\\bin;"); TCHAR *temp = new TCHAR[cbData+sizeof(javaHome)]; _tcscpy_s(temp, cbData, (LPTSTR)PerfData); LPTSTR path = _tcscat(temp, javaHome); RegSetValueEx(hkResult,
L"Path",
0,
REG_SZ,
(LPBYTE) path,
_tcsclen(path)*sizeof(TCHAR)) DWORD dwResult; SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,LPARAM("Environment"), SMTO_ABORTIFHUNG, 5000, &dwResult); delete temp;
赋值成功后,右键我的电脑--高级--环境变量,也可以看到环境变量已经添加在path尾部。
但奇怪的是,依然不能使用,而且注销之后,连系统原来的环境变量像chkdsk, convert也不能使用了。
这是否涉及权限问题,求高人解释下。
HKEY hkResult;
if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE,
_T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"),
0,
KEY_SET_VALUE | KEY_READ,
&hkResult))
{
MessageBox(_T("访问注册表出错!"));
}
DWORD BufferSize = 8192;
DWORD cbData;
DWORD dwRet; VOID* PerfData = malloc( BufferSize );
cbData = BufferSize; dwRet = RegQueryValueEx( hkResult,
_T("Path"),
NULL,
NULL,
(LPBYTE) PerfData,
&cbData ); while (dwRet == ERROR_MORE_DATA)
{
BufferSize += 4096;
PerfData = realloc( PerfData, BufferSize );
cbData = BufferSize; dwRet = RegQueryValueEx( hkResult,
_T("Path"),
NULL,
NULL,
(LPBYTE) PerfData,
&cbData ); } MessageBox((LPCTSTR)PerfData); LPTSTR javaHome = _T(";%JAVA_HOME%\\bin;"); TCHAR *temp = new TCHAR[cbData+sizeof(javaHome)]; _tcscpy_s(temp, cbData, (LPTSTR)PerfData); LPTSTR path = _tcscat(temp, javaHome); RegSetValueEx(hkResult,
L"Path",
0,
REG_SZ,
(LPBYTE) path,
_tcsclen(path)*sizeof(TCHAR)) DWORD dwResult; SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,LPARAM("Environment"), SMTO_ABORTIFHUNG, 5000, &dwResult); delete temp;
解决方案 »
- 如何得到某一个窗口的文本框的句柄,并写入相应的值
- Photoshop中魔术棒工具的容差怎么实现?
- 关于更改文件夹图标,急问!
- 如何隐藏对话框在任务栏上的显示?
- 在Release下能正常运行在Debug下出现无效窗口句柄现象,程序停留在ASSERT(::IsWindow(m_hWnd))
- 老问题重谈:如何隐藏ListCtrl控件的某一列?
- 请问在一个Picture控件上怎样显示一幅yuv图像?见答给分,谢谢!
- 我有CRecordSet和CRecordView 时,删除一些记录后都在原来数据处显示“已经删除”。怎么不显示这个
- 对话框之间数据传递问题
- 急!!!用多线程做局域网中网络通讯
- 关于多文档的OnFileNew()函数
- 美国某著名网络公司的校园招聘笔试题
可是我在注册表看了,定义了REG_SZ类型还是REG_EXPAND_SZ,这个不明白
现在还有一个问题,这个消息没成功啊
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,LPARAM("Environment"), SMTO_ABORTIFHUNG, 5000, &dwResult);
修改不能立即得到反映我打开环境变量修改那里,点一下确定就行了,说明这函数没执行吗?
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,LPARAM("Environment"), SMTO_ABORTIFHUNG, 5000, &dwResult);
没有效果,
你给我发个测试程序吧,我不知道哪里写错了
BOOL AddPath(LPCTSTR szPath)
{
CString strKey = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment";
HKEY hKey;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, strKey, 0L, KEY_ALL_ACCESS, &hKey);
DWORD dwType = 0, dw = 0;
RegQueryValueEx(hKey, _T("Path"), NULL, &dwType, NULL, &dw); CString sPath;
LPTSTR lpsz = sPath.GetBufferSetLength(dw);
RegQueryValueEx(hKey, _T("Path"), NULL, &dwType, (BYTE*)lpsz, &dw);
sPath.ReleaseBuffer();
sPath = CString(szPath) + _T(";") + sPath;
RegSetValueEx(hKey, _T("Path"), NULL, REG_EXPAND_SZ,
(BYTE * const)(LPCSTR)sPath, (sPath.GetLength()+1)*sizeof(TCHAR));
RegCloseKey(hKey); DWORD dwRet;
SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0,
(LPARAM)"Environment", SMTO_ABORTIFHUNG, 5000,&dwRet);
return TRUE;
}//调用
AddPath(_T("c:\\test2"));
__in LPCTSTR lpName,
__in_opt LPCTSTR lpValue
);
我这边SP3,没有加上。回复10楼
你的方法绝对是不行的,MSDN有说。