nxfhcsj 发表于 2015-1-15 01:04:06

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位上生效.

wangms 发表于 2015-1-15 09:09:09

学习学习。。。。。。。。。。。。。。。。。。

nxfhcsj 发表于 2015-1-15 14:21:00

如果要在32位系统下写一个代码,可以在64位系统下重命名system32\taskmgr.exe   怎么实现呢?
现在只能在64位下写好并编译能重命名.. 相同的代码到32位系统下编译,然后拿到64位系统下运行..   是失败的..

skyfree 发表于 2015-1-17 07:55:29

本帖最后由 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。

jmdfwy 发表于 2015-1-17 21:47:21

S大过来解答问题了,强!!!

kn007 发表于 2015-1-18 19:08:58

回复 4# skyfree


    好久不见。。

haijie1223 发表于 2015-1-19 00:13:39

回复 4# skyfree

是这样用吗?为什么没有效果呢?

austere 发表于 2015-1-20 09:03:09

回复 7# haijie1223


    估计可能是版本问题吧~~ 用3.3.12.0 试下~

haijie1223 发表于 2015-1-20 12:57:13

回复 8# austere


    3.3.13.19

austere 发表于 2015-1-20 13:07:33

{:face (239):}..... 我感觉12以上的都不是很好用,编译后的版本等都没有了,没有老肖做的好啊~~

skyfree 发表于 2015-1-22 12:05:06

回复 7# haijie1223


    你用宏是没有用的,懂?你宏@SystemDir就是在x86下是system32,在x64下就是syswow64,你关了重定向又不会改变宏的值!手写 windows\system32 就可以了!

skyfree 发表于 2015-1-22 12:05:39

回复 8# austere


    和版本无关,他写的就不对,没理解宏指代的是什么。

haijie1223 发表于 2015-1-22 13:10:28

回复 11# skyfree

问题是这样,在x64系统中:用x86运行时,宏@system就存贮syswow64路径;用x64运行就指向system32路径。
看来我确实没有搞明白宏的定义,难道宏只是类似存储固定路径的一个变量?不应该啊,我一直以为宏就是类似环境变量一样的东西,不是固定路径,而是总是指向系统目录:比如,xp中的默认桌面路径改变了,那么用@desktop也会指向新的路径啊,而不是默认路径吧~

haijie1223 发表于 2015-1-22 13:18:16

回复 11# skyfree


    是不是应该这么理解,32位程序在64位系统中运行时,系统分配给32位程序的@system宏路径本身就是syswow64,而不是system32路径,所以重定向关闭与否和他是没有关系的。
   微软这样设置不知有何意义,好操蛋~

skyfree 发表于 2015-1-22 16:22:44

回复 13# haijie1223


    这问题应该源自于宏的创建方式,这个宏的值的读取方法如果就没考虑关闭重定向这个问题,那它只会机械的读取路径,而不会去变通。
页: [1] 2
查看完整版本: 64位系统下编译的程序如何在32位上运行.