64位系统下编译的程序如何在32位上运行.
本帖最后由 nxfhcsj 于 2015-1-15 01:06 编辑64位系统下编译的EXE无法在32位系统上运行..
但是加#AutoIt3Wrapper_UseX64=n 的话.. 程序在64位下的一个功能又失效了.请教大家如何完美解决.
比如如下脚本;
FileMove(@SystemDir & "\taskmgr.ex_", @SystemDir & "\taskmgr.exe", 9)
这条脚本在win7 64位下面可以成功运行并生效.但是这个时候生成的exe文件无法在32位上运行.
在脚本前加上#AutoIt3Wrapper_UseX64=n编译后能在32位系统上运行,但是拿到64位上运行以后,不能生效..
请教各位大大,如何完美解决呢? 既能在32位上运行,还能在64位上生效. 学习学习。。。。。。。。。。。。。。。。。。 如果要在32位系统下写一个代码,可以在64位系统下重命名system32\taskmgr.exe 怎么实现呢?
现在只能在64位下写好并编译能重命名.. 相同的代码到32位系统下编译,然后拿到64位系统下运行.. 是失败的.. 本帖最后由 skyfree 于 2015-1-17 07:56 编辑
1、编译参数设置#AutoIt3Wrapper_UseX64=n将程序编译为X86应用程序
2、如果是X64系统则关闭重定向,可以解决你x86应用程序不能正常访问system32的问题If @OSArch='x64' Then DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)3、如果你还有注册表类操作,HKLM需要写成HKLM64,可以预先声明个全局常量Global Const $_HKLM = _Key_GetHKLM()
Func _Key_GetHKLM()
If @OSArch = 'x86' Then
Return 'HKLM'
ElseIf @OSArch = 'x64' Then
Return 'HKLM64'
EndIf
EndFunc ;==>_Key_GetHKLM
其他注册表项,如HKCU、HKCR、HKU、HKCC等,如上例方法炮制。
其实这部分内容在《Let's AutoIt Plus》Level5中有详细的解释,有兴趣可以看下。http://au3.cc/thread-921-1-1.html。 S大过来解答问题了,强!!! 回复 4# skyfree
好久不见。。 回复 4# skyfree
是这样用吗?为什么没有效果呢? 回复 7# haijie1223
估计可能是版本问题吧~~ 用3.3.12.0 试下~ 回复 8# austere
3.3.13.19 {:face (239):}..... 我感觉12以上的都不是很好用,编译后的版本等都没有了,没有老肖做的好啊~~ 回复 7# haijie1223
你用宏是没有用的,懂?你宏@SystemDir就是在x86下是system32,在x64下就是syswow64,你关了重定向又不会改变宏的值!手写 windows\system32 就可以了! 回复 8# austere
和版本无关,他写的就不对,没理解宏指代的是什么。 回复 11# skyfree
问题是这样,在x64系统中:用x86运行时,宏@system就存贮syswow64路径;用x64运行就指向system32路径。
看来我确实没有搞明白宏的定义,难道宏只是类似存储固定路径的一个变量?不应该啊,我一直以为宏就是类似环境变量一样的东西,不是固定路径,而是总是指向系统目录:比如,xp中的默认桌面路径改变了,那么用@desktop也会指向新的路径啊,而不是默认路径吧~ 回复 11# skyfree
是不是应该这么理解,32位程序在64位系统中运行时,系统分配给32位程序的@system宏路径本身就是syswow64,而不是system32路径,所以重定向关闭与否和他是没有关系的。
微软这样设置不知有何意义,好操蛋~ 回复 13# haijie1223
这问题应该源自于宏的创建方式,这个宏的值的读取方法如果就没考虑关闭重定向这个问题,那它只会机械的读取路径,而不会去变通。
页:
[1]
2