
工作流程:
1创建一个进程外COM服务器(EXE)。
2将32位dll的接口函数封装为COM服务器的相关接口。
3注册COM服务器exe /regserver (注销 exe /unregserver)。
464位进程调用32位COM服务器接口,成功。从而曲线实现了64位进程调用32位dll。
具体步骤:
我首先创建了一个简单的dll工程,只输出一个函数int c = add(int a,int b); 生成lib和dll
然后创建一个进程外COM(EXE类型),内部链接dll,添加方法Method: Add(long c)
{ c = add(1,2);}编译生成。
然后注册COM,exe /regserver
最创建一个64位WIN32工程验证64位环境下方法调用是否正确,经验证正确!!!
结论:以上方法可以解决64位进程调用32位dll的问题
32位进程调用64位dll应该也可以通过这种方法解决,原因64位windows系统下安装了32位和64位两套COM系统
理论上不可以这样。
但有个特殊的例外,就是NET的程序。
原生的二进制机器码的64位程序是不可以以32位方式运行的,但是如果是NET的托管程序,可以做到,但不一定保证一定OK。
你可以去下一个 CorFlagsexe,这个程序可以修改NET程序的标志位(32位还是64位方式运行的标志位),改了后试试看。我以前改过一个,那个程序本身以64位方式提供,但其中的某个组件(好像是轻量级的数据库)无法支持64位方式运行,启动报错,改成32位方式强制启动就Ok了。
二进制机器码的程序,就不要想了,去找32位版的。
Microsoft Platform SDK 2001年 11 月版或更高版本\x0d\VisualC++ 60\x0d\步骤一:安装最新适合xp的SDK\x0d\通过双击SDK文件夹下面的SetupExe安装Microsoft Platform SDK到硬盘任意目录后,安装程序会在开始菜单中生成Microsoft Platform SDK的快捷方式。单击"start->AllPrograms->Microsoft Platform SDK for Windows Sever 2003 SP1->Open BuildEnvironment Window->Set Windows XP 64 Build Environment->Set Windows XP64 Build Environment (Debug) 此时将显示一个控制台窗口,其中带有为 64 位内部版本设置的内部版本环境。\x0d\\x0d\步骤二:从64位内部版本环境启动Visual C++60:\x0d\启动MicrosoftPlatform SDK后,直接在命令行输入msdev/useenv,此时将显示 Visual C++ 60 IDE,其中已经为 64 位内部版本环境设置了 include、library和executable 目录。 (如果Msdevexe不在路径中,请将文件夹更改到 \Microsoft Visual Studio\Common\Msdev98\Bin文件夹,然后运行 msdev/useenv)\x0d\Visual C++启动成功后,可以通过菜单Tools->Options->Directories查看Include files和Library file的默认路径应为Microsoft Platform SDK文件夹下的include和lib文件夹,此时为打开正确的64位虚拟编译环境。否则需重启打开。\x0d\\x0d\步骤三:添加 64位调试配置:\x0d\♦在 Visual C++ IDE中,打开现有的 32 位项目(例如,MyApplication)。\x0d\♦在"Build"菜单上,单击"Configurations"。\x0d\♦在"Configurations"对话框中,单击"add"。\x0d\♦在"Add Project Configuration"对话框中,将"Configuration"设置为 Debug64,单击"OK",然后单击"Close"。\x0d\\x0d\步骤四:将活动配置设置为 64位: \x0d\♦在"Build"菜单上,单击"Set Active Configuration"。\x0d\♦单击"MyApplication- Win32 Debug64",然后单击"OK"。\x0d\ \x0d\步骤五:修改编译器或链接器选项:\x0d\♦在"Project"菜单上,单击"settings"。\x0d\♦在"project settings"对话框中,单击"General"选项卡。在"outputdirectories"下,在"Intermediate files"框和"output files"框中键入 Debug64。\x0d\\x0d\♦在"C/C++"选项卡上,在"Debug info"列表中选择"ProgramDatabase(编译器选项,/Zi)"。在Project Options中去掉/GZ,加入/Wp64。\x0d\\x0d\♦在"Link"选项卡上,在"Project Options"框中将 /machine:I386更改为/machine:AMD64。在Object/librarymodules中加入bufferoverflowulib,如果不加bufferoverflowulib,链接时会报错。\x0d\\x0d\♦在"View"菜单上,单击"Workspace"。 要从项目中删除MyApplicationhpj 文件。\x0d\ \x0d\♦生成64位程序:\x0d\注:在32位机上只能编译连接生成64位程序,而不能进行调试。\x0d\\x0d\
首先,如果你使用的是64位的电脑,你可以尝试直接运行一下你的exe文件,然后打开任务管理器,一般来说进程信息后面标有32位(32bit)字样的都是32位的应用程序;而如果没有标记的,则不能判断是32位的还是64位的,只能说是64位程序的可能性更大。
如果你使用的是32位的电脑,则可以运行的程序一定是32位的;而不可以运行的程序可能是64位的,也可能是程序存在问题或系统存在问题导致不能运行。
可以看出上面的办法并不十分可靠。
所以我们可以通过更直接的办法来判断。
打开windows自带的“记事本”,并使用记事本直接打开你的exe文件。一定会出现一堆乱码。不要着急,只要看第二行即可,第二行开头不远处有PE两个字母,再后面两个空格后第三个字符就是标记了,如果是字母L的话,就是32位应用程序,如果是d就表示是64位应用程序。
如图,分别是32位程序和64位程序的截图。
3
还有如果有更高级的文本编辑器,比如Notepad++或者我使用的NotePad2之类的,直接打开exe文件可以显示出“不可打印的字符”,我们看到第三行那个PE后面跟了两个NUL就是空字符的意思,后面的字符就是标记了,还是一样的,L表示32位,d表示64位。
以上就是关于windows 32位的程序调用64位的程序吗全部的内容,包括:windows 32位的程序调用64位的程序吗、64位的Windows如何强制程序以32位方式运行、vc6.0程序怎样编译成64位等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)