VC测试运行错误.求解决

VC测试运行错误.求解决,第1张

找到错误两个:

sPath=sPath.Left(nPos+1)//保留反斜线,再加文件名,否则名字和路径连在一起,会识别有问题。另外,你这个加入自动运行,应该有扩展名才好(sPaht + "\\ISXXX.EXE")

注册表 *** 作,在XP里面这样是没有问题的,win7下可能会失败(但不报错),这个没环境,你自己检查一下,是不是写到32为里面去了。

CFile file

CString sPath = "...."// 设置文件路径

if (!file.Open(sPath, CFile::modeCreate | CFile::modeWrite))

return

BYTE* pData// 将数据保存到指针中;

long lsize= 0// 设置数据大小

file.Write(pData, lSize)

file.Close()

这要你方法对。很有可能是下面的问题了。

你按win+r键 里输入regedit看到的注册表。再在易语言里写一句

运行 ("regedit", 假, )

看看这两个注册表的运行路径是不是一样的。呵呵如果不一样。原因你懂的。了解详情请看

下面的文章吧。支持原作。

Win64位系统下的WOW64文件和注册表的重定向

今天咱们驿站上有位会员问我个问题,给我贴了一小段代码如下:CString strPath = LC:\\Windows\\System32\\123.sysCFile fileif (file.Open(strPath ,CFile::modeCreate)== TRUE){ file.Close()}很简单吧,就是在 C:\Windows\System32 路径下创建了一个 12

今天咱们驿站上有位会员问我个问题,给我贴了一小段代码如下:CString strPath = L"C:\\Windows\\System32\\123.sys"CFile fileif (file.Open(strPath ,CFile::modeCreate)== TRUE){file.Close()}很简单吧,就是在 C:\Windows\System32 路径下创建了一个 123.sys 的文件,看似简单,编译执行之后,到 C:\Windows\System32 目录下找这个 123.sys 文件,咦?不见了。。。奇怪了,整个C盘搜索,终于找到了,不过在 C:\Windows\SysWOW64 目录下呆着呢?我明明指定的是 System32 目录,为什么跑到 SysWOW64 目录里面了呢。怪了。。。突然想起来,前段时间有另外一个会员问我注册表的问题,好像也有个 WOW64 之类的关键字,于是到网络上狂搜一番,终于找到答案了。转载过来,相关解释如下:================================================无论是 Windows XP Professional X64 Edition、Windows Server 2003 X64 Edition 还是 Windows Vista X64 Edition、Windows7 X64 Edition(以下把均统称为X64系统),都引入了一项技术:文件和注册表的重定向之所以有这个技术,是为了将32位程序和64位程序分离开。这种在64位平台上运行32位程序的模拟器被称为WOW64。WOW64是 "Windows 32 on Windows 64" 的简称,它在系统层中另提供了一层,以支持老式的32位程序。在X64系统里面,一些特殊的目录和特殊的注册表键被分为2个独立的部分。对于文件系统来说,%systemroot%/system32 目录被保留给64位文件使用,而32位文件会被重定向到 %systemroot%/SysWOW64目录。换句话说,所有的32位程序一般情况下只会出现在%systemroot%/SysWOW64 目录里面。任何32位程序试图访问 %systemroot%/system32目录的企图都会被重定向到 %systemroot%/SysWOW64目录。这个是一个默认的行为,除非程序的线程明确的指名需要关闭这种重定向机制。对于注册表来说,也有类似的内容。WOW64子系统也提供了对注册表访问的重定向。如果是32位程序,对注册表的 *** 作不论是读还是写,WOW64都将会截取对HKLM/Software访问,并重定向到HKLM/Software/Wow6432Node(即32位应用程序的注册信息被写在HKLM/Software/Wow6432Node中,而不是预期的HKLM/Software中),如果是64位程序,就直接到 HKLM/Software。需要重定向的注册表项注册表重定向,其实质就是维护两套不同的注册表键,一套用于64位,一套用于32位。受影响的键不只是上面提及的HKLM/Software,还包括:HKEY_CLASSES_ROOT HKEY_CURRENT_USER/Software/Classes HKEY_LOCAL_MACHINE/Software HKEY_USERS/*/Software/Classes HKEY_USERS/*_Classes其中,64位程序的注册信息存储在上面的健中,32位程序的注册信息重定向存储在下列健中:HKEY_CLASSES_ROOT/WOW6432node HKEY_CURRENT_USER/Software/Classes/WOW6432node HKEY_LOCAL_MACHINE/Software/WOW6432node HKEY_USERS/*/Software/Classes/WOW6432node HKEY_USERS/*_Classes/WOW6432node当运行32位程序,WOW64会截取程序对注册表 HKLM/Software 的访问,并重定向于HKLM/Software/Wow6432Node================================================怎么样,原理听明白了吧?那么接下来就教大家如何来明确的关闭这种重定向机制:文件重定向解决办法:我们可以调用相关的API来关闭和打开这种转向。常用的函数有3个,Wow64DisableWow64FsRedirection(关闭系统转向),Wow64RevertWow64FsRedirection(打开系统转向),Wow64EnableWow64FsRedirection(打 开系统转向)。但是Wow64EnableWow64FsRedirection在嵌套使用的时候不可靠,所以通常用上面的 Wow64RevertWow64FsRedirection 来打开文件系统转向功能。注册表重定向解决办法:32位程序如何访问64位的注册表(HKLM/Software)在调用函数 RegCreateKeyEx 创建注册表项时,对其第六个参数 REGSAM samDesired 设置中添加参数 KEY_WOW64_64KEY,这样可以实现对64位注册表的访问;在调用函数 RegOpenKeyEx 打开注册表项时,要对其第四个参数 REGSAM samDesired 设置中添加参数 KEY_WOW64_64KEY,这样可以实现对64位注册表的访问;64位程序如何访问32位的注册表(HKLM/Software/Wow6432Node)在调用函数 RegCreateKeyEx 创建注册表项时,对其第六个参数 REGSAM samDesired 设置中添加参数 KEY_WOW32_64KEY,这样可以实现对32位注册表的访问;在调用函数RegOpenKeyEx 打开注册表项时,要对其第四个参数 REGSAM samDesired 设置中添加参数 KEY_WOW32_64KEY,这样可以实现对32位注册表的访问;行了,解决办法也给大家说了,下面就来实现下,看看刚才的代码怎么来修改,其实只需要在刚才的代码片段的上下分别加上关闭和开启转向的Api调用即可,代码如下:PVOID OldValue = NULLBOOL bRet = Wow64DisableWow64FsRedirection(&OldValue)CString strPath = L"C:\\Windows\\System32\\123.sys"CFile fileif (file.Open(strPath ,CFile::modeCreate)== TRUE){file.Close()}bRet = Wow64RevertWow64FsRedirection(&OldValue)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/9900589.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存